diff --git a/README.md b/README.md index f51a363..bf1eedb 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers) Also, use this if you plan to use b4k's archive. - [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js) -- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.271.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) +- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.273.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) For FF users, the extension is signed so you can just drag and drop it on your about:addons tab. diff --git a/chrome/dist/main.js b/chrome/dist/main.js index 57b1a37..7f9fc63 100644 --- a/chrome/dist/main.js +++ b/chrome/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,896 +10939,131 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, 161, 8, 35, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17824,1123 +16211,2712 @@ return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21226,7 +21202,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21290,11 +21266,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21700,8 +21676,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21777,7 +21753,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21814,12 +21790,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21863,70 +21839,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21936,80 +21911,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -22024,95 +21996,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22140,7 +22111,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22172,7 +22143,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22216,71 +22187,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22376,9 +22347,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22588,9 +22559,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22729,21 +22700,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22977,8 +22948,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23079,7 +23050,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23367,7 +23338,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23772,7 +23743,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26989,22 +26960,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -27054,6 +27029,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/chrome/manifest.json b/chrome/manifest.json index 2685137..c2c0b3d 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.270", + "version": "0.273", "icons": { "64": "1449696017588.png" }, diff --git a/dist/main.js b/dist/main.js index c389348..24bb519 100644 --- a/dist/main.js +++ b/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,897 +10939,132 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, 8, 35, 66, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17659,1123 +16046,2712 @@ return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21061,7 +21037,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21125,11 +21101,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21535,8 +21511,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21612,7 +21588,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21649,12 +21625,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21698,70 +21674,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21771,80 +21746,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -21859,95 +21831,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -21975,7 +21946,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22007,7 +21978,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22051,71 +22022,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22211,9 +22182,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22423,9 +22394,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22564,21 +22535,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22812,8 +22783,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -22914,7 +22885,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23202,7 +23173,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23607,7 +23578,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26824,22 +26795,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -26889,6 +26864,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/firefox/dist/main.js b/firefox/dist/main.js index c199959..80874da 100644 --- a/firefox/dist/main.js +++ b/firefox/dist/main.js @@ -30,6 +30,28 @@ __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -51,7 +73,7 @@ var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 271]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10917,896 +10939,131 @@ } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, 161, 8, 35, @@ -11947,7 +11204,11 @@ 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12111,1124 +11372,249 @@ 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13402,31 +11788,31 @@ writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13474,8 +11860,8 @@ writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13499,8 +11885,8 @@ nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13567,9 +11953,9 @@ UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15577,6 +13963,7 @@ xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17749,1175 +16136,2764 @@ mime: "application/x-esri-shape" }; } - if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { - await tokenizer.ignore(20); - const type = await tokenizer.readToken(new StringType(4, "ascii")); - switch (type) { - case "jp2 ": - return { - ext: "jp2", - mime: "image/jp2" - }; - case "jpx ": - return { - ext: "jpx", - mime: "image/jpx" - }; - case "jpm ": + if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { + await tokenizer.ignore(20); + const type = await tokenizer.readToken(new StringType(4, "ascii")); + switch (type) { + case "jp2 ": + return { + ext: "jp2", + mime: "image/jp2" + }; + case "jpx ": + return { + ext: "jpx", + mime: "image/jpx" + }; + case "jpm ": + return { + ext: "jpm", + mime: "image/jpm" + }; + case "mjp2": + return { + ext: "mj2", + mime: "image/mj2" + }; + default: + return; + } + } + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { + return { + ext: "lnk", + mime: "application/x.ms.shortcut" + }; + } + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { + return { + ext: "alias", + mime: "application/x.apple.alias" + }; + } + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { + return { + ext: "eot", + mime: "application/vnd.ms-fontobject" + }; + } + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { + return { + ext: "indd", + mime: "application/x-indesign" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { + return { + ext: "tar", + mime: "application/x-tar" + }; + } + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { + return { + ext: "skp", + mime: "application/vnd.sketchup.skp" + }; + } + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { + return { + ext: "pgp", + mime: "application/pgp-encrypted" + }; + } + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } + return { + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" + }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { return { - ext: "jpm", - mime: "image/jpm" + ext: "cr2", + mime: "image/x-canon-cr2" }; - case "mjp2": + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { return { - ext: "mj2", - mime: "image/mj2" + ext: "nef", + mime: "image/x-nikon-nef" }; - default: - return; + } } - } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { - return { - ext: "jxl", - mime: "image/jxl" - }; - } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { - return { - ext: "xml", - mime: "application/xml" - }; - } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { - return { - ext: "mpg", - mime: "video/mpeg" - }; - } - if (this.check([0, 1, 0, 0, 0])) { - return { - ext: "ttf", - mime: "font/ttf" - }; - } - if (this.check([0, 0, 1, 0])) { - return { - ext: "ico", - mime: "image/x-icon" + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" }; } - if (this.check([0, 0, 2, 0])) { + if (version === 43) { return { - ext: "cur", - mime: "image/x-icon" + ext: "tif", + mime: "image/tiff" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { - return { - ext: "cfb", - mime: "application/x-cfb" - }; + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFileFF = async (f) => { + let thumbnail = new Uint8Array(); + const te = new TextEncoder(); + thumbnail = await generateThumbnail(f); + const namebuf = te.encode(f.name); + const ret = new Uint8Array(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + const ret32 = new DataView(ret.buffer); + let ptr = 0; + ret.set(te.encode("PEE\0"), 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + ret.set(namebuf, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret32.setUint32(ptr, thumbnail.byteLength, true); + ptr += 4; + ret.set(thumbnail, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + ret.set(new Uint8Array(content), ptr); + return new Blob([ret]); + }; + var buildPeeFile = async (f) => { + if (true) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { - return { - ext: "vcf", - mime: "text/vcard" - }; + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); + } + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (true) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFileFF = async (f) => { - let thumbnail = new Uint8Array(); - const te = new TextEncoder(); - thumbnail = await generateThumbnail(f); - const namebuf = te.encode(f.name); - const ret = new Uint8Array(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - const ret32 = new DataView(ret.buffer); - let ptr = 0; - ret.set(te.encode("PEE\0"), 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - ret.set(namebuf, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret32.setUint32(ptr, thumbnail.byteLength, true); - ptr += 4; - ret.set(thumbnail, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - const content = await f.arrayBuffer(); - ret.set(new Uint8Array(content), ptr); - return new Blob([ret]); }; - var buildPeeFile = async (f) => { - if (true) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (true) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21203,7 +21179,7 @@ // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21267,11 +21243,11 @@ hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21677,8 +21653,8 @@ if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21754,7 +21730,7 @@ c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21791,12 +21767,12 @@ input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21840,70 +21816,69 @@ let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21913,80 +21888,77 @@ c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -22001,95 +21973,94 @@ attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22117,7 +22088,7 @@ }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22149,7 +22120,7 @@ } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22193,71 +22164,71 @@ if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22353,9 +22324,9 @@ t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22565,9 +22536,9 @@ a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22706,21 +22677,21 @@ button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22954,8 +22925,8 @@ if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23056,7 +23027,7 @@ for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23344,7 +23315,7 @@ t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23749,7 +23720,7 @@ const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26966,22 +26937,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -27031,6 +27006,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/firefox/manifest.json b/firefox/manifest.json index 37615ef..05a0f74 100644 --- a/firefox/manifest.json +++ b/firefox/manifest.json @@ -7,7 +7,7 @@ }, "name": "PngExtraEmbedder", "description": "Discover embedded files on 4chan and archives!", - "version": "0.271", + "version": "0.273", "icons": { "64": "1449696017588.png" }, diff --git a/firefox_update.json b/firefox_update.json index f2ad8f4..6a4adb5 100644 --- a/firefox_update.json +++ b/firefox_update.json @@ -1 +1 @@ -{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.271","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.271.xpi"}]}}} \ No newline at end of file +{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.273","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.273.xpi"}]}}} \ No newline at end of file diff --git a/main.meta.js b/main.meta.js index 73b5a52..e8195f7 100644 --- a/main.meta.js +++ b/main.meta.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.270 +// @version 0.273 // @description uhh // @author You // @match https://boards.4channel.org/* diff --git a/main.user.js b/main.user.js index 03c943d..cdf4761 100644 --- a/main.user.js +++ b/main.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name PNGExtraEmbed // @namespace https://coom.tech/ -// @version 0.270 +// @version 0.273 // @description uhh // @author You // @match https://boards.4channel.org/* @@ -66,6 +66,28 @@ const _DOMParser = DOMParser; __defProp(target, key2, result); return result; }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + var __privateMethod = (obj, member, method) => { + __accessCheck(obj, member, "access private method"); + return method; + }; var __toBinary = /* @__PURE__ */ (() => { var table = new Uint8Array(128); for (var i = 0; i < 64; i++) @@ -87,7 +109,7 @@ const _DOMParser = DOMParser; var define_BUILD_VERSION_default; var init_define_BUILD_VERSION = __esm({ ""() { - define_BUILD_VERSION_default = [0, 270]; + define_BUILD_VERSION_default = [0, 273]; } }); @@ -10953,897 +10975,132 @@ const _DOMParser = DOMParser; } }); - // node_modules/f5stegojs/f5stego.js - var require_f5stego = __commonJS({ - "node_modules/f5stegojs/f5stego.js"(exports, module) { + // node_modules/jpeg-js/lib/encoder.js + var require_encoder = __commonJS({ + "node_modules/jpeg-js/lib/encoder.js"(exports, module) { init_define_BUILD_VERSION(); init_esbuild_inject(); - (function(root, factory) { - "use strict"; - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof exports === "object") { - module.exports = factory(); - } else { - root.f5stego = factory(); - } - })(exports, function() { - "use strict"; - var f5stego = function(key2, maxPixels) { - this.maxPixels = maxPixels || 4096 * 4096; - this.shuffleInit(key2); - }; - f5stego.prototype.shuffleInit = function(key2) { - this.randPool = new ArrayBuffer(this.maxPixels * 4.125); - if (!key2.length) - throw "key needed"; - var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(this.randPool); - for (i = 0; i < 256; ++i) - S[i] = i; - for (i = 0; i < 256; ++i) { - j = j + S[i] + key2[i % key2.length] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - } - i = 0; - j = 0; - for (k = 0; k < this.maxPixels * 4.125; ++k) { - i = i + 1 & 255; - j = j + S[i] & 255; - t = S[i]; - S[i] = S[j]; - S[j] = t; - rnd[k] = S[t + S[i] & 255]; - } - }; - f5stego.prototype.stegShuffle = function(pm) { - var t, l, k, random_index, rand32Array = new Uint32Array(this.randPool); - if (typeof pm == "number") { - l = pm; - pm = new Uint32Array(l); - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - if (random_index != k) - pm[k] = pm[random_index]; - pm[random_index] = k; - } - } else { - l = pm.length; - for (k = 1; k < l; k++) { - random_index = rand32Array[k] % (k + 1); - t = pm[k]; - pm[k] = pm[random_index]; - pm[random_index] = t; - } - } - return { pm, gamma: new Uint8Array(this.randPool, l * 4) }; - }; - f5stego.prototype._analyze = function(coeff) { - var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; - for (i = 0; i < coeff.length; i++) { - if (i % 64 === 0) - continue; - if (coeff[i] === 0) - _zero++; - if (coeff[i] == 1 || coeff[i] == -1) - _one++; - } - _large = coeff.length - _zero - _one - coeff.length / 64; - _ratio = _one / (_large + _one); - var res = { - "capacity": [0, (_large + 0.49 * _one >> 3) - 1], - "coeff_total": coeff.length, - "coeff_large": _large, - "coeff_zero": _zero, - "coeff_one": _one, - "coeff_one_ratio": _one / (_large + _one) - }; - for (i = 2; i < 17; i++) { - k = (1 << i) - 1; - usable = _large + _one; - embedded = 0; - while (usable > k) { - matched = usable / k / (1 << i) / (1 << i) | 0; - usable -= matched * k; - changed = usable * (1 - _ratio) / k * 0.96 | 0; - usable -= changed * k; - embedded += changed + matched; - k++; - } - res.capacity[i] = (i * embedded >> 3) - 1; - } - return res; - }; - f5stego.prototype._f5write = function(coeff, data, k) { - var coeff_count = coeff.length; - var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; - var pm = this.stegShuffle(coeff_count); - var gamma = pm.gamma, gammaI = 0; - pm = pm.pm; - var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; - n = (1 << k) - 1; - byte_to_embed = k - 1; - byte_to_embed ^= gamma[gammaI++]; - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed = 3; - for (ii = 0; ii < coeff_count; ii++) { - shuffled_index = pm[ii]; - if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) - continue; - var cc = coeff[shuffled_index]; - _examined++; - if (cc > 0 && (cc & 1) != next_bit_to_embed) { - coeff[shuffled_index]--; - _changed++; - } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { - coeff[shuffled_index]++; - _changed++; - } - if (coeff[shuffled_index] !== 0) { - _embedded++; - if (available_bits_to_embed === 0) { - if (k != 1 || data_idx >= data.length) - break; - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - } else { - _thrown++; - } - } - if (k == 1 && _embedded < data.length * 8) - throw "capacity exceeded " + _embedded / 8 + " " + data.length; - if (k != 1) { - var is_last_byte = false, k_bits_to_embed = 0; - while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { - k_bits_to_embed = 0; - for (i = 0; i < k; i++) { - if (available_bits_to_embed === 0) { - if (data_idx >= data.length) { - is_last_byte = true; - break; - } - byte_to_embed = data[data_idx++]; - byte_to_embed ^= gamma[gammaI++]; - available_bits_to_embed = 8; - } - next_bit_to_embed = byte_to_embed & 1; - byte_to_embed >>= 1; - available_bits_to_embed--; - k_bits_to_embed |= next_bit_to_embed << i; - } - var code_word = []; - var ci = null; - for (i = 0; i < n; i++) { - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - code_word.push(ci); - } - _examined += n; - while (true) { - var vhash = 0, extracted_bit; - for (i = 0; i < code_word.length; i++) { - if (coeff[code_word[i]] > 0) { - extracted_bit = coeff[code_word[i]] & 1; - } else { - extracted_bit = 1 - (coeff[code_word[i]] & 1); - } - if (extracted_bit == 1) - vhash ^= i + 1; - } - i = vhash ^ k_bits_to_embed; - if (!i) { - _embedded += k; - break; - } - i--; - coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; - _changed++; - if (coeff[code_word[i]] === 0) { - _thrown++; - code_word.splice(i, 1); - while (true) { - if (++ii >= coeff_count) { - throw "capacity exceeded " + _embedded / 8; - } - ci = pm[ii]; - if (ci % 64 !== 0 && coeff[ci] !== 0) - break; - } - _examined++; - code_word.push(ci); - } else { - _embedded += k; - break; - } - } - } - } - return { - "k": k, - "embedded": _embedded / 8, - "examined": _examined, - "changed": _changed, - "thrown": _thrown, - "efficiency": (_embedded / _changed).toFixed(2) - }; - }; - f5stego.prototype.analyze = function() { - var i, comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - return this._analyze(comp.blocks); - }; - f5stego.prototype.f5put = function(data, k) { - var t, i, comp = this.frame.components[0]; - if (data.length > 8388607) - throw "Data too big. Max 8388607 bytes allowed."; - if (data.length < 32768) { - t = new Uint8Array(2 + data.length); - t[0] = data.length & 255; - t[1] = data.length >>> 8; - t.set(data, 2); - } else { - t = new Uint8Array(3 + data.length); - t[0] = data.length & 255; - t[1] = (data.length >>> 8 & 127) + 128; - t[2] = data.length >>> 15; - t.set(data, 3); - } - if (comp.componentId != 1) { - for (i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - if (k) { - return this._f5write(comp.blocks, t, k); - } - var ret, prop = this._analyze(comp.blocks); - k = 0; - for (i = prop.capacity.length - 1; i >= 0; i--) { - if (prop.capacity[i] >= t.length) { - k = i; - break; - } - } - if (k === 0) - throw "capacity exceeded"; - try { - ret = this._f5write(comp.blocks, t, k); - } catch (e) { - k--; - if (k === 0) - throw "capacity exceeded"; - ret = this._f5write(comp.blocks, t, k); - } - ret["stats"] = prop; - return ret; - }; - f5stego.prototype.f5get = function() { - var comp = this.frame.components[0]; - if (comp.componentId != 1) { - for (var i = 0; i < this.frame.components.length; i++) { - if (this.frame.components[i].componentId == 1) { - comp = this.frame.components[i]; - break; - } - } - } - var coeff = new Int16Array(comp.blocks.length); - coeff.set(comp.blocks); - var pos = -1, extrBit = 0, cCount = coeff.length - 1; - var pm = this.stegShuffle(coeff), gamma = pm.gamma, gammaI = 0; - var n, k = 0; - var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; - while (bitsAvail < 4) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - k |= extrBit << bitsAvail; - bitsAvail++; - } - k = (k ^ gamma[gammaI++] & 15) + 1; - n = (1 << k) - 1; - bitsAvail = 0; - if (k == 1) { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - extrByte |= extrBit << bitsAvail; - bitsAvail++; - if (bitsAvail == 8) { - out[outPos++] = extrByte ^ gamma[gammaI++]; - extrByte = 0; - bitsAvail = 0; - } - } - } else { - while (pos < cCount) { - pos++; - if (coeff[pos] === 0) { - continue; - } - extrBit = coeff[pos] & 1; - if (coeff[pos] < 0) { - extrBit = 1 - extrBit; - } - hash2 ^= extrBit * ++code; - if (code == n) { - extrByte |= hash2 << bitsAvail; - bitsAvail += k; - code = 0; - hash2 = 0; - while (bitsAvail >= 8) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - } - } - } - while (bitsAvail > 0) { - out[outPos++] = extrByte & 255 ^ gamma[gammaI++]; - bitsAvail -= 8; - extrByte = extrByte >> 8; - } - var s = 2, l = out[0]; - if (out[1] & 128) { - s++; - l += ((out[1] & 127) << 8) + (out[2] << 15); - } else { - l += out[1] << 8; - } - return out.subarray(s, s + l); - }; - f5stego.prototype.parse = function(data) { - var offset = 0; - function _buildHuffmanTable(nrcodes, values) { - var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); - for (var k = 0; k < 16; k++) { - for (var j2 = 0; j2 < nrcodes[k]; j2++) { - for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { - HT[i2] = values[pos_in_table] + (k + 1 << 8); - } - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { - var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; - function decodeBaseline(component2, pos) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - var diff = 0; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff; - var k2 = 1, s, r; - while (k2 < 64) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r < 15) { - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - k2++; - } - } - function decodeDCFirst(component2, pos) { - var diff = 0; - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; - if (!t) - throw "invalid huffman sequence"; - bitsCount -= t >>> 8; - t &= 255; - if (t !== 0) { - while (bitsCount < t) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - diff = bitsData >>> bitsCount - t & (1 << t) - 1; - bitsCount -= t; - if (diff < 1 << t - 1) - diff += (-1 << t) + 1; - } - component2.blocksDC[pos >> 6] = component2.pred += diff << successive; - } - function decodeDCSuccessive(component2, pos) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; - } - function decodeACFirst(component2, pos) { - if (eobrun > 0) { - eobrun--; - return; - } - var k2 = spectralStart2, s, r; - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s === 0) { - if (r != 15) { - eobrun = (1 << r) - 1; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - k2 += 16; - continue; - } - k2 += r; - while (bitsCount < s) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; - bitsCount -= s; - if (component2.blocks[pos + k2] < 1 << s - 1) - component2.blocks[pos + k2] += (-1 << s) + 1; - component2.blocks[pos + k2] *= p1; - k2++; - } - } - function decodeACSuccessive(component2, pos) { - var k2 = spectralStart2, r, s; - if (!eobrun) { - while (k2 <= spectralEnd2) { - while (bitsCount < 16) { - bitsData = (bitsData << 8) + (data2[offset2] | 0); - bitsCount += 8; - if (data2[offset2] == 255) - offset2++; - offset2++; - } - s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; - if (!s) - throw "invalid huffman sequence"; - bitsCount -= s >>> 8; - r = s >> 4 & 15; - s &= 15; - if (s) { - if (s != 1) - throw "bad jpeg"; - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - s = bitsData >>> --bitsCount & 1 ? p1 : m1; - } else { - if (r != 15) { - eobrun = 1 << r; - if (r) { - while (bitsCount < r) { - bitsData = (bitsData << 8) + data2[offset2++]; - if ((bitsData & 255) == 255) - offset2++; - bitsCount += 8; - } - eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; - bitsCount -= r; - } - break; - } - } - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } else { - if (--r < 0) - break; - } - k2++; - } - if (s) - component2.blocks[pos + k2] = s; - k2++; - } - } - if (eobrun) { - while (k2 <= spectralEnd2) { - if (component2.blocks[pos + k2]) { - if (!bitsCount) { - bitsData = data2[offset2++]; - if (bitsData == 255) - offset2++; - bitsCount = 8; - } - component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); - } - k2++; - } - eobrun--; - } - } - var decodeFn; - if (frame.progressive) { - if (spectralStart2 === 0) - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - else - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } else { - decodeFn = decodeBaseline; - } - var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; - if (components2.length == 1) { - mcusPerLine2 = components2[0].blocksPerLine; - mcusPerRow = components2[0].blocksPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - components2[0].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); - } - } - } - } else { - mcusPerLine2 = frame.mcusPerLine; - mcusPerRow = frame.mcusPerColumn; - mcuExpected = mcusPerRow * mcusPerLine2; - if (!resetInterval2) - resetInterval2 = mcuExpected; - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - for (y = 0; y < mcusPerRow; y++) { - for (x = 0; x < mcusPerLine2; x++) { - if (!n) { - n = resetInterval2; - for (i2 = 0; i2 < components2.length; i2++) - components2[i2].pred = 0; - eobrun = 0; - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - bitsCount = 0; - marker = data2[offset2] << 8 | data2[offset2 + 1]; - if (marker >= 65488 && marker <= 65495) { - offset2 += 2; - } else { - if (marker <= 65280) { - throw "bad jpeg"; - } - break; - } - } - n--; - for (i2 = 0; i2 < components2.length; i2++) { - for (j2 = 0; j2 < components2[i2].v; j2++) { - for (k = 0; k < components2[i2].h; k++) { - decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); - } - } - } - } - } - } - offset2 -= bitsCount / 8 | 0; - if (data2[offset2 - 1] == 255) - offset2--; - return offset2 - startOffset; - } - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - this["_raw"] = data; - this["jfif"] = null; - this["APPn"] = []; - this["qts"] = []; - this["frame"] = null; - this["tail"] = null; - var markerHi, markerLo, i, j, resetInterval, component; - var huffmanTablesAC = [], huffmanTablesDC = []; - while (1) { - if (offset >= data.length) - throw "unexpected EOF"; - markerHi = data[offset++]; - markerLo = data[offset++]; - if (markerHi == 255) { - if (markerLo == 224) { - this.jfif = readDataBlock(); - } - if (markerLo > 224 && markerLo < 240 || markerLo == 254) { - this.APPn.push({ - "app": markerLo, - "data": readDataBlock() - }); - } - if (markerLo == 219) { - this.qts.push(readDataBlock()); - } - if (markerLo >= 192 && markerLo <= 194) { - if (this.frame) - throw "Only single frame JPEGs supported"; - readUint16(); - this.frame = { - "extended": markerLo === 193, - "progressive": markerLo === 194, - "precision": data[offset++], - "scanLines": readUint16(), - "samplesPerLine": readUint16(), - "components": [], - "componentIds": {}, - "maxH": 1, - "maxV": 1 - }; - if (this.frame.scanLines * this.frame.samplesPerLine > this.maxPixels) - throw "Image is too big."; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) - maxH = h; - if (maxV < v) - maxV = v; - var qId = data[offset + 2]; - var l = this.frame.components.push({ - "componentId": componentId, - "h": h, - "v": v, - "quantizationTable": qId - }); - this.frame.componentIds[componentId] = l - 1; - offset += 3; - } - this.frame.maxH = maxH; - this.frame.maxV = maxV; - var mcusPerLine = Math.ceil(this.frame.samplesPerLine / 8 / maxH); - var mcusPerColumn = Math.ceil(this.frame.scanLines / 8 / maxV); - for (i = 0; i < this.frame.components.length; i++) { - component = this.frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(this.frame.samplesPerLine / 8) * component.h / maxH); - var blocksPerColumn = Math.ceil(Math.ceil(this.frame.scanLines / 8) * component.v / maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - component["blocks"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64); - component["blocksDC"] = new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu); - component["blocksPerLine"] = blocksPerLine; - component["blocksPerColumn"] = blocksPerColumn; - component["blocksPerLineForMcu"] = blocksPerLineForMcu; - component["blocksPerColumnForMcu"] = blocksPerColumnForMcu; - } - this.frame["mcusPerLine"] = mcusPerLine; - this.frame["mcusPerColumn"] = mcusPerColumn; - } - if (markerLo == 196) { - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) - codeLengthSum += codeLengths[j] = data[offset]; - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) - huffmanValues[j] = data[offset]; - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = _buildHuffmanTable(codeLengths, huffmanValues); - } - } - if (markerLo == 221) { - resetInterval = readUint16(); - } - if (markerLo == 218) { - readUint16(); - var selectorsCount = data[offset++]; - var components = []; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = this.frame.componentIds[data[offset++]]; - component = this.frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, this.frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - } - if (markerLo == 217) { - break; - } - } else { - if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - } - while (data[offset] != 255 && offset < data.length) { - offset++; - } - if (data[offset] != 255) { - throw "bad jpeg "; - } - } - } - if (!this.frame) - throw "bad jpeg"; - if (offset < data.length) - this.tail = data.subarray(offset); - return this; - }; - var bitcode = new Array(65535), category = new Array(65535), std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, + var btoa = btoa || function(buf2) { + return Buffer2.from(buf2).toString("base64"); + }; + function JPEGEncoder(quality) { + var self = this; + var fround = Math.round; + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT2; + var UVDC_HT2; + var YAC_HT2; + var UVAC_HT2; + var bitcode2 = new Array(65535); + var category2 = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes2 = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes2 = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values2 = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, 8, 35, 66, @@ -11983,7 +11240,11 @@ const _DOMParser = DOMParser; 248, 249, 250 - ], std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], std_ac_chrominance_values = [ + ]; + var std_dc_chrominance_nrcodes2 = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes2 = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values2 = [ 0, 1, 2, @@ -12147,1124 +11408,249 @@ const _DOMParser = DOMParser; 249, 250 ]; - function _initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - _initCategoryNumber(); - function _computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = []; - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values), UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values), YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values), UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - f5stego.prototype.pack = function() { - var byteout, bytenew, bytepos, poslast, outpos, byte; - function writeByte(value) { - var t; - byteout[outpos++] = value; - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - } - function writeWord(value) { - writeByte(value >> 8 & 255); - writeByte(value & 255); - } - function writeBlock(block) { - var t; - if (outpos + block.length > poslast) { - t = new Uint8Array(byteout.length * 2 + block.length); - t.set(byteout); - byteout = t; - poslast = t.length - 128; - } - byteout.set(block, outpos); - outpos += block.length; - } - function writeAPP0(self) { - writeWord(65504); - if (!self.jfif) { - writeWord(16); - writeByte(74); - writeByte(70); - writeByte(73); - writeByte(70); - writeByte(0); - writeByte(1); - writeByte(1); - writeByte(0); - writeWord(1); - writeWord(1); - writeByte(0); - writeByte(0); - } else { - writeWord(self.jfif.length + 2); - writeBlock(self.jfif); - } - } - function writeDQT(self) { - for (var i2 = 0; i2 < self.qts.length; i2++) { - writeWord(65499); - writeWord(self.qts[i2].length + 2); - writeBlock(self.qts[i2]); - } - } - function writeAPPn(self) { - for (var i2 = 0; i2 < self.APPn.length; i2++) { - writeWord(65280 | self.APPn[i2].app); - writeWord(self.APPn[i2].data.length + 2); - writeBlock(self.APPn[i2].data); - } - } - function writeSOF0(self) { - writeWord(65472); - writeWord(8 + self.frame.components.length * 3); - writeByte(self.frame.precision); - writeWord(self.frame.scanLines); - writeWord(self.frame.samplesPerLine); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - writeByte(c2.h << 4 | c2.v); - writeByte(c2.quantizationTable); - } - } - function writeDHT(self) { - writeWord(65476); - writeWord(31); - writeByte(0); - for (var i2 = 0; i2 < 16; i2++) { - writeByte(std_dc_luminance_nrcodes[i2 + 1]); - } - for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); - } - writeWord(65476); - writeWord(181); - writeByte(16); - for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); - } - for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); - } - if (self.frame.components.length != 1) { - writeWord(65476); - writeWord(31); - writeByte(1); - for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); - } - for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); - } - writeWord(65476); - writeWord(181); - writeByte(17); - for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); - } - for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); - } - } - } - function writeSOS(self) { - writeWord(65498); - writeWord(6 + self.frame.components.length * 2); - writeByte(self.frame.components.length); - for (var i2 = 0; i2 < self.frame.components.length; i2++) { - var c2 = self.frame.components[i2]; - writeByte(c2.componentId); - if (i2 === 0) { - writeByte(0); - } else { - writeByte(17); - } + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; } - writeByte(0); - writeByte(63); - writeByte(0); + YTable[ZigZag[i]] = t; } - function processDU(comp, POS, DC, HTDC, HTAC) { - var pos, posval, t; - if (bytepos === 0) - bytenew = 0; - var Diff = comp.blocksDC[POS >> 6] - DC; - DC = comp.blocksDC[POS >> 6]; - if (Diff === 0) { - posval = HTDC[0][1]; - bytenew <<= posval; - bytenew += HTDC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } else { - pos = 32767 + Diff; - posval = HTDC[category[pos]][1]; - bytenew <<= posval; - bytenew += HTDC[category[pos]][0]; - bytepos += posval; - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - var end0pos = 63; - for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { - } - if (end0pos === 0) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - return DC; - } - var i2 = 1; - var lng; - while (i2 <= end0pos) { - var startpos = i2; - for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { - } - var nrzeroes = i2 - startpos; - if (nrzeroes >= 16) { - lng = nrzeroes >> 4; - for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { - posval = HTAC[240][1]; - bytenew <<= posval; - bytenew += HTAC[240][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - nrzeroes = nrzeroes & 15; - } - pos = 32767 + comp.blocks[POS + i2]; - posval = HTAC[(nrzeroes << 4) + category[pos]][1]; - bytenew <<= posval; - bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - posval = bitcode[pos][1]; - bytenew <<= posval; - bytenew += bitcode[pos][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - i2++; - } - if (end0pos != 63) { - posval = HTAC[0][1]; - bytenew <<= posval; - bytenew += HTAC[0][0]; - bytepos += posval; - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; - } - bytepos -= 8; - bytenew &= (1 << bytepos) - 1; - } - } - if (outpos > poslast) { - t = new Uint8Array(byteout.length * 2); - t.set(byteout); - byteout = t; - poslast = t.length - 128; + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; } - return DC; + UVTable[ZigZag[j]] = u; } - byteout = new Uint8Array(65536); - poslast = 65536 - 128; - outpos = 0; - bytenew = 0; - bytepos = 0; - writeWord(65496); - writeAPP0(this); - writeAPPn(this); - writeDQT(this); - writeSOF0(this); - writeDHT(this); - writeSOS(this); - bytenew = 0; - bytepos = 0; - var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; - var DCdiff = []; - for (i = 0; i < this.frame.components.length; i++) { - DCdiff.push(0); - } - for (mcu = 0; mcu < this.frame.mcusPerLine * this.frame.mcusPerColumn; mcu++) { - mcuRow = mcu / this.frame.mcusPerLine | 0; - mcuCol = mcu % this.frame.mcusPerLine; - for (i = 0; i < this.frame.components.length; i++) { - c = this.frame.components[i]; - for (v = 0; v < c.v; v++) { - blockRow = mcuRow * c.v + v; - for (h = 0; h < c.h; h++) { - blockCol = mcuCol * c.h + h; - if (i === 0) { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); - } else { - DCdiff[i] = processDU(c, (blockRow * this.frame.mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); - } - } - } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; } } - while (bytepos > 7) { - byte = 255 & bytenew >>> bytepos - 8; - byteout[outpos++] = byte; - if (byte == 255) { - outpos++; + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; } - bytepos -= 8; + codevalue *= 2; } - if (bytepos > 0) { - bytenew <<= 8 - bytepos; - bytenew += (1 << 8 - bytepos) - 1; - byteout[outpos++] = 255 & bytenew; + return HT; + } + function initHuffmanTbl() { + YDC_HT2 = computeHuffmanTbl(std_dc_luminance_nrcodes2, std_dc_luminance_values2); + UVDC_HT2 = computeHuffmanTbl(std_dc_chrominance_nrcodes2, std_dc_chrominance_values2); + YAC_HT2 = computeHuffmanTbl(std_ac_luminance_nrcodes2, std_ac_luminance_values2); + UVAC_HT2 = computeHuffmanTbl(std_ac_chrominance_nrcodes2, std_ac_chrominance_values2); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category2[32767 + nr] = cat; + bitcode2[32767 + nr] = []; + bitcode2[32767 + nr][1] = cat; + bitcode2[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category2[32767 + nrneg] = cat; + bitcode2[32767 + nrneg] = []; + bitcode2[32767 + nrneg][1] = cat; + bitcode2[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; } - writeWord(65497); - if (this.tail) - writeBlock(this.tail); - return byteout.slice(0, outpos); - }; - f5stego.prototype.clearTail = function() { - if (!this.tail) - return null; - var t = this.tail; - this.tail = null; - return t; - }; - f5stego.prototype.setTail = function(data) { - this.tail = data; - }; - f5stego.prototype.getTail = function() { - return this.tail; - }; - f5stego.prototype.clearAPPs = function() { - var t = this.APPn; - this.APPn = []; - return t; - }; - f5stego.prototype.getAPPn = function(id, remove) { - var i, t, ret = new Uint8Array(0), n = []; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) - return this.jfif; - for (i = 0; i < this.APPn.length; i++) { - if (this.APPn[i].app == id) { - t = new Uint8Array(ret.length + this.APPn[i].data.length); - t.set(ret); - t.set(this.APPn[i].data, ret.length); - ret = t; - } else if (remove) - n.push(this.APPn[i]); - } - if (remove) - this.APPn = n; - if (ret.length === 0) - return null; - return ret; - }; - f5stego.prototype.setAPPn = function(id, data) { - var i, t, ret; - id &= 255; - if (id < 16) - id += 224; - if (id === 224) { - t = this.jfif; - this.jfif = data; - return t; - } - ret = this.getAPPn(id, true); - if (data.length < 65534) { - this.APPn.push({ "app": id, "data": data }); - return ret; + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; } - i = 0; - while (i < data.length) { - this.APPn.push({ "app": id, "data": data.subarray(i, i + 65533) }); - i += 65533; - } - return ret; - }; - f5stego.prototype.strip = function() { - this.clearTail(); - this.clearAPPs(); - return true; - }; - f5stego.prototype.embed = function(image, data) { - this.parse(image).f5put(data); - return this.pack(); - }; - f5stego.prototype.extract = function(image) { - return this.parse(image).f5get(); - }; - return f5stego; - }); - } - }); - - // node_modules/jpeg-js/lib/encoder.js - var require_encoder = __commonJS({ - "node_modules/jpeg-js/lib/encoder.js"(exports, module) { - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var btoa = btoa || function(buf2) { - return Buffer2.from(buf2).toString("base64"); - }; - function JPEGEncoder(quality) { - var self = this; - var fround = Math.round; - var ffloor = Math.floor; - var YTable = new Array(64); - var UVTable = new Array(64); - var fdtbl_Y = new Array(64); - var fdtbl_UV = new Array(64); - var YDC_HT; - var UVDC_HT; - var YAC_HT; - var UVAC_HT; - var bitcode = new Array(65535); - var category = new Array(65535); - var outputfDCTQuant = new Array(64); - var DU = new Array(64); - var byteout = []; - var bytenew = 0; - var bytepos = 7; - var YDU = new Array(64); - var UDU = new Array(64); - var VDU = new Array(64); - var clt = new Array(256); - var RGB_YUV_TABLE = new Array(2048); - var currentQuality; - var ZigZag = [ - 0, - 1, - 5, - 6, - 14, - 15, - 27, - 28, - 2, - 4, - 7, - 13, - 16, - 26, - 29, - 42, - 3, - 8, - 12, - 17, - 25, - 30, - 41, - 43, - 9, - 11, - 18, - 24, - 31, - 40, - 44, - 53, - 10, - 19, - 23, - 32, - 39, - 45, - 52, - 54, - 20, - 22, - 33, - 38, - 46, - 51, - 55, - 60, - 21, - 34, - 37, - 47, - 50, - 56, - 59, - 61, - 35, - 36, - 48, - 49, - 57, - 58, - 62, - 63 - ]; - var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; - var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; - var std_ac_luminance_values = [ - 1, - 2, - 3, - 0, - 4, - 17, - 5, - 18, - 33, - 49, - 65, - 6, - 19, - 81, - 97, - 7, - 34, - 113, - 20, - 50, - 129, - 145, - 161, - 8, - 35, - 66, - 177, - 193, - 21, - 82, - 209, - 240, - 36, - 51, - 98, - 114, - 130, - 9, - 10, - 22, - 23, - 24, - 25, - 26, - 37, - 38, - 39, - 40, - 41, - 42, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; - var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; - var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; - var std_ac_chrominance_values = [ - 0, - 1, - 2, - 3, - 17, - 4, - 5, - 33, - 49, - 6, - 18, - 65, - 81, - 7, - 97, - 113, - 19, - 34, - 50, - 129, - 8, - 20, - 66, - 145, - 161, - 177, - 193, - 9, - 35, - 51, - 82, - 240, - 21, - 98, - 114, - 209, - 10, - 22, - 36, - 52, - 225, - 37, - 241, - 23, - 24, - 25, - 26, - 38, - 39, - 40, - 41, - 42, - 53, - 54, - 55, - 56, - 57, - 58, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250 - ]; - function initQuantTables(sf) { - var YQT = [ - 16, - 11, - 10, - 16, - 24, - 40, - 51, - 61, - 12, - 12, - 14, - 19, - 26, - 58, - 60, - 55, - 14, - 13, - 16, - 24, - 40, - 57, - 69, - 56, - 14, - 17, - 22, - 29, - 51, - 87, - 80, - 62, - 18, - 22, - 37, - 56, - 68, - 109, - 103, - 77, - 24, - 35, - 55, - 64, - 81, - 104, - 113, - 92, - 49, - 64, - 78, - 87, - 103, - 121, - 120, - 101, - 72, - 92, - 95, - 98, - 112, - 100, - 103, - 99 - ]; - for (var i = 0; i < 64; i++) { - var t = ffloor((YQT[i] * sf + 50) / 100); - if (t < 1) { - t = 1; - } else if (t > 255) { - t = 255; - } - YTable[ZigZag[i]] = t; - } - var UVQT = [ - 17, - 18, - 24, - 47, - 99, - 99, - 99, - 99, - 18, - 21, - 26, - 66, - 99, - 99, - 99, - 99, - 24, - 26, - 56, - 99, - 99, - 99, - 99, - 99, - 47, - 66, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99, - 99 - ]; - for (var j = 0; j < 64; j++) { - var u = ffloor((UVQT[j] * sf + 50) / 100); - if (u < 1) { - u = 1; - } else if (u > 255) { - u = 255; - } - UVTable[ZigZag[j]] = u; - } - var aasf = [ - 1, - 1.387039845, - 1.306562965, - 1.175875602, - 1, - 0.785694958, - 0.5411961, - 0.275899379 - ]; - var k = 0; - for (var row = 0; row < 8; row++) { - for (var col = 0; col < 8; col++) { - fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); - k++; - } - } - } - function computeHuffmanTbl(nrcodes, std_table) { - var codevalue = 0; - var pos_in_table = 0; - var HT = new Array(); - for (var k = 1; k <= 16; k++) { - for (var j = 1; j <= nrcodes[k]; j++) { - HT[std_table[pos_in_table]] = []; - HT[std_table[pos_in_table]][0] = codevalue; - HT[std_table[pos_in_table]][1] = k; - pos_in_table++; - codevalue++; - } - codevalue *= 2; - } - return HT; - } - function initHuffmanTbl() { - YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); - UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); - YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); - UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); - } - function initCategoryNumber() { - var nrlower = 1; - var nrupper = 2; - for (var cat = 1; cat <= 15; cat++) { - for (var nr = nrlower; nr < nrupper; nr++) { - category[32767 + nr] = cat; - bitcode[32767 + nr] = []; - bitcode[32767 + nr][1] = cat; - bitcode[32767 + nr][0] = nr; - } - for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { - category[32767 + nrneg] = cat; - bitcode[32767 + nrneg] = []; - bitcode[32767 + nrneg][1] = cat; - bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; - } - nrlower <<= 1; - nrupper <<= 1; - } - } - function initRGBYUVTable() { - for (var i = 0; i < 256; i++) { - RGB_YUV_TABLE[i] = 19595 * i; - RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; - RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; - RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; - RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; - RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; - RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; - RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; - } - } - function writeBits(bs) { - var value = bs[0]; - var posval = bs[1] - 1; - while (posval >= 0) { - if (value & 1 << posval) { - bytenew |= 1 << bytepos; - } - posval--; - bytepos--; - if (bytepos < 0) { - if (bytenew == 255) { - writeByte(255); - writeByte(0); - } else { - writeByte(bytenew); - } - bytepos = 7; - bytenew = 0; - } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } } } function writeByte(value) { @@ -13438,31 +11824,31 @@ const _DOMParser = DOMParser; writeWord(418); writeByte(0); for (var i = 0; i < 16; i++) { - writeByte(std_dc_luminance_nrcodes[i + 1]); + writeByte(std_dc_luminance_nrcodes2[i + 1]); } for (var j = 0; j <= 11; j++) { - writeByte(std_dc_luminance_values[j]); + writeByte(std_dc_luminance_values2[j]); } writeByte(16); for (var k = 0; k < 16; k++) { - writeByte(std_ac_luminance_nrcodes[k + 1]); + writeByte(std_ac_luminance_nrcodes2[k + 1]); } for (var l = 0; l <= 161; l++) { - writeByte(std_ac_luminance_values[l]); + writeByte(std_ac_luminance_values2[l]); } writeByte(1); for (var m = 0; m < 16; m++) { - writeByte(std_dc_chrominance_nrcodes[m + 1]); + writeByte(std_dc_chrominance_nrcodes2[m + 1]); } for (var n = 0; n <= 11; n++) { - writeByte(std_dc_chrominance_values[n]); + writeByte(std_dc_chrominance_values2[n]); } writeByte(17); for (var o = 0; o < 16; o++) { - writeByte(std_ac_chrominance_nrcodes[o + 1]); + writeByte(std_ac_chrominance_nrcodes2[o + 1]); } for (var p = 0; p <= 161; p++) { - writeByte(std_ac_chrominance_values[p]); + writeByte(std_ac_chrominance_values2[p]); } } function writeCOM(comments) { @@ -13510,8 +11896,8 @@ const _DOMParser = DOMParser; writeBits(HTDC[0]); } else { pos = 32767 + Diff; - writeBits(HTDC[category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTDC[category2[pos]]); + writeBits(bitcode2[pos]); } var end0pos = 63; for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { @@ -13535,8 +11921,8 @@ const _DOMParser = DOMParser; nrzeroes = nrzeroes & 15; } pos = 32767 + DU[i]; - writeBits(HTAC[(nrzeroes << 4) + category[pos]]); - writeBits(bitcode[pos]); + writeBits(HTAC[(nrzeroes << 4) + category2[pos]]); + writeBits(bitcode2[pos]); i++; } if (end0pos != I63) { @@ -13603,9 +11989,9 @@ const _DOMParser = DOMParser; UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; } - DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT2, YAC_HT2); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT2, UVAC_HT2); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT2, UVAC_HT2); x += 32; } y += 8; @@ -15613,6 +13999,7 @@ const _DOMParser = DOMParser; xpv: false, xpi: false, hyd: false, + notcata: false, ak: "", auto_embed: 0, auto_tags: "", @@ -17695,1123 +16082,2712 @@ const _DOMParser = DOMParser; return; } } - if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { + return { + ext: "jxl", + mime: "image/jxl" + }; + } + if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + return { + ext: "xml", + mime: "application/xml" + }; + } + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + return { + ext: "mpg", + mime: "video/mpeg" + }; + } + if (this.check([0, 1, 0, 0, 0])) { + return { + ext: "ttf", + mime: "font/ttf" + }; + } + if (this.check([0, 0, 1, 0])) { + return { + ext: "ico", + mime: "image/x-icon" + }; + } + if (this.check([0, 0, 2, 0])) { + return { + ext: "cur", + mime: "image/x-icon" + }; + } + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + return { + ext: "cfb", + mime: "application/x-cfb" + }; + } + await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); + if (this.checkString("BEGIN:")) { + if (this.checkString("VCARD", { offset: 6 })) { + return { + ext: "vcf", + mime: "text/vcard" + }; + } + if (this.checkString("VCALENDAR", { offset: 6 })) { + return { + ext: "ics", + mime: "text/calendar" + }; + } + } + if (this.checkString("FUJIFILMCCD-RAW")) { + return { + ext: "raf", + mime: "image/x-fujifilm-raf" + }; + } + if (this.checkString("Extended Module:")) { + return { + ext: "xm", + mime: "audio/x-xm" + }; + } + if (this.checkString("Creative Voice File")) { + return { + ext: "voc", + mime: "audio/x-voc" + }; + } + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { + const jsonSize = this.buffer.readUInt32LE(12); + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { + try { + const header = this.buffer.slice(16, jsonSize + 16).toString(); + const json = JSON.parse(header); + if (json.files) { + return { + ext: "asar", + mime: "application/x-asar" + }; + } + } catch { + } + } + } + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { + return { + ext: "mxf", + mime: "application/mxf" + }; + } + if (this.checkString("SCRM", { offset: 44 })) { + return { + ext: "s3m", + mime: "audio/x-s3m" + }; + } + if (this.check([71]) && this.check([71], { offset: 188 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { + return { + ext: "mts", + mime: "video/mp2t" + }; + } + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { + return { + ext: "mobi", + mime: "application/x-mobipocket-ebook" + }; + } + if (this.check([68, 73, 67, 77], { offset: 128 })) { + return { + ext: "dcm", + mime: "application/dicom" + }; + } + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { return { - ext: "jxl", - mime: "image/jxl" + ext: "lnk", + mime: "application/x.ms.shortcut" }; } - if (this.check([254, 255, 0, 60, 0, 63, 0, 120, 0, 109, 0, 108]) || this.check([255, 254, 60, 0, 63, 0, 120, 0, 109, 0, 108, 0])) { + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { return { - ext: "xml", - mime: "application/xml" + ext: "alias", + mime: "application/x.apple.alias" }; } - if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { return { - ext: "mpg", - mime: "video/mpeg" + ext: "eot", + mime: "application/vnd.ms-fontobject" }; } - if (this.check([0, 1, 0, 0, 0])) { + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { return { - ext: "ttf", - mime: "font/ttf" + ext: "indd", + mime: "application/x-indesign" }; } - if (this.check([0, 0, 1, 0])) { + await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); + if (tarHeaderChecksumMatches(this.buffer)) { return { - ext: "ico", - mime: "image/x-icon" + ext: "tar", + mime: "application/x-tar" }; } - if (this.check([0, 0, 2, 0])) { + if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { return { - ext: "cur", - mime: "image/x-icon" + ext: "skp", + mime: "application/vnd.sketchup.skp" }; } - if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "cfb", - mime: "application/x-cfb" + ext: "pgp", + mime: "application/pgp-encrypted" }; } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true }); - if (this.checkString("BEGIN:")) { - if (this.checkString("VCARD", { offset: 6 })) { + if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { + if (this.check([16], { offset: 1, mask: [22] })) { + if (this.check([8], { offset: 1, mask: [8] })) { + return { + ext: "aac", + mime: "audio/aac" + }; + } return { - ext: "vcf", - mime: "text/vcard" + ext: "aac", + mime: "audio/aac" + }; + } + if (this.check([2], { offset: 1, mask: [6] })) { + return { + ext: "mp3", + mime: "audio/mpeg" + }; + } + if (this.check([4], { offset: 1, mask: [6] })) { + return { + ext: "mp2", + mime: "audio/mpeg" + }; + } + if (this.check([6], { offset: 1, mask: [6] })) { + return { + ext: "mp1", + mime: "audio/mpeg" + }; + } + } + } + async readTiffTag(bigEndian) { + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + this.tokenizer.ignore(10); + switch (tagId) { + case 50341: + return { + ext: "arw", + mime: "image/x-sony-arw" + }; + case 50706: + return { + ext: "dng", + mime: "image/x-adobe-dng" }; + default: + } + } + async readTiffIFD(bigEndian) { + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); + for (let n = 0; n < numberOfTags; ++n) { + const fileType = await this.readTiffTag(bigEndian); + if (fileType) { + return fileType; + } + } + } + async readTiffHeader(bigEndian) { + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); + if (version === 42) { + if (ifdOffset >= 6) { + if (this.checkString("CR", { offset: 8 })) { + return { + ext: "cr2", + mime: "image/x-canon-cr2" + }; + } + if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { + return { + ext: "nef", + mime: "image/x-nikon-nef" + }; + } + } + await this.tokenizer.ignore(ifdOffset); + const fileType = await this.readTiffIFD(false); + return fileType ? fileType : { + ext: "tif", + mime: "image/tiff" + }; + } + if (version === 43) { + return { + ext: "tif", + mime: "image/tiff" + }; + } + } + }; + var supportedExtensions = new Set(extensions); + var supportedMimeTypes = new Set(mimeTypes); + + // src/utils.ts + var csettings; + settings.subscribe((b) => { + csettings = b; + }); + var generateThumbnail = async (f) => { + const can = document.createElement("canvas"); + const [sw, sh] = [125, 125]; + const url = URL.createObjectURL(f); + let source; + let iw, ih; + if (f.type.startsWith("image")) { + const imgElem = document.createElement("img"); + imgElem.src = url; + await new Promise((_) => imgElem.onload = _); + [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; + source = imgElem; + } else if (f.type.startsWith("video")) { + const vidElem = document.createElement("video"); + vidElem.src = url; + await new Promise((_) => vidElem.onloadedmetadata = _); + vidElem.currentTime = 0; + await new Promise((_) => vidElem.onloadeddata = _); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + await new Promise(requestAnimationFrame); + [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; + source = vidElem; + } else + return import_buffer2.Buffer.alloc(0); + const scale = Math.min(1, sw / iw, sh / ih); + const dims = [~~(iw * scale), ~~(ih * scale)]; + can.width = dims[0]; + can.height = dims[1]; + const ctx = can.getContext("bitmaprenderer"); + const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); + if (!ctx) + return import_buffer2.Buffer.alloc(0); + ctx?.transferFromImageBitmap(bmp); + const blob = await new Promise((_) => can.toBlob(_)); + if (!blob) + return import_buffer2.Buffer.alloc(0); + return import_buffer2.Buffer.from(await blob.arrayBuffer()); + }; + var buildPeeFile = async (f) => { + if (false) + return buildPeeFileFF(f); + let thumbnail = import_buffer2.Buffer.alloc(0); + thumbnail = await generateThumbnail(f); + const namebuf = import_buffer2.Buffer.from(f.name); + const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); + let ptr = 0; + ret.write("PEE\0", 0); + ptr += 4; + ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; + namebuf.copy(ret, ptr); + ptr += namebuf.byteLength; + ret[ptr++] = 0; + if (thumbnail.length > 0) { + ret.writeInt32LE(thumbnail.byteLength, ptr); + ptr += 4; + thumbnail.copy(ret, ptr); + ptr += thumbnail.byteLength; + } + const content = await f.arrayBuffer(); + import_buffer2.Buffer.from(content).copy(ret, ptr); + return new Blob([ret]); + }; + var getThreadInfo = async (board, op) => { + const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); + return Object.fromEntries(res.map((e) => [e.id, e])); + }; + var threadDataCache = writable(); + var cthreadDataCache; + threadDataCache.subscribe((newval) => { + cthreadDataCache = newval; + }); + var refreshThreadDataCache = async (board, op) => { + threadDataCache.set(await getThreadInfo(board, op)); + }; + var getThreadDataCache = async (board, op) => { + if (!cthreadDataCache) + await refreshThreadDataCache(board, op); + return threadDataCache; + }; + var getEmbedsFromCache = async (board, op, pid) => { + await getThreadDataCache(board, op); + const target = +pid.slice(pid.match(/\d/).index); + const cachedData = cthreadDataCache[target]; + if (!cachedData) + return; + const ret = []; + if ("pee" in cachedData.data) { + const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); + ret.push([files, false]); + } + if ("third" in cachedData.data) { + if (csettings.phash) { + if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) + return ret; + } + let cachedFile; + const data = cachedData.data.third; + const prev = data.preview_url; + const full = data.full_url; + const fn = new URL(full).pathname.split("/").slice(-1)[0]; + const end = [{ + source: data.source, + page: { + title: "PEE Cache", + url: data.page + }, + filename: fn, + thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), + data: csettings.hotlink ? full || prev : async (lsn) => { + if (!cachedFile) + cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); + return import_buffer2.Buffer.from(cachedFile); } - if (this.checkString("VCALENDAR", { offset: 6 })) { - return { - ext: "ics", - mime: "text/calendar" - }; + }]; + ret.push([end, true]); + } + return ret; + }; + var decodeCoom3Payload = async (buff) => { + const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); + const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); + return (await Promise.all(pees.map(async (pee) => { + try { + const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); + if (!m) + return; + const { domain, file } = m.groups; + const headers = await getHeaders(pee); + const res = await ifetch(pee, { + headers: { range: "bytes=0-32767", "user-agent": "" }, + mode: "cors", + referrerPolicy: "no-referrer" + }); + const size = +headers["content-length"] || 0; + const header = import_buffer2.Buffer.from(await res.arrayBuffer()); + let hptr = 0; + if (header.slice(0, 4).toString() == "PEE\0") + hptr += 4; + else + return; + const flags = header[hptr]; + const hasFn = !!(flags & 1); + const hasTags = !!(flags & 2); + const hasThumbnail = !!(flags & 4); + let [ptr, ptr2] = [hptr + 1, hptr + 1]; + let fn = "embedded"; + let tags = []; + let thumb = import_buffer2.Buffer.from(hasembed_default); + if (hasFn) { + while (header[ptr2] != 0) + ptr2++; + fn = header.slice(ptr, ptr2).toString(); + ptr = ++ptr2; } - } - if (this.checkString("FUJIFILMCCD-RAW")) { - return { - ext: "raf", - mime: "image/x-fujifilm-raf" - }; - } - if (this.checkString("Extended Module:")) { - return { - ext: "xm", - mime: "audio/x-xm" - }; - } - if (this.checkString("Creative Voice File")) { - return { - ext: "voc", - mime: "audio/x-voc" - }; - } - if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { - const jsonSize = this.buffer.readUInt32LE(12); - if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { - try { - const header = this.buffer.slice(16, jsonSize + 16).toString(); - const json = JSON.parse(header); - if (json.files) { - return { - ext: "asar", - mime: "application/x-asar" - }; - } - } catch { - } + if (hasTags) { + while (header[ptr2] != 0) + ptr2++; + tags = header.slice(ptr, ptr2).toString().split(/\s+/); + } + let thumbsize = 0; + if (hasThumbnail) { + thumbsize = header.readInt32LE(ptr); + ptr += 4; + if (header.byteLength < ptr + thumbsize) + thumb = header.slice(ptr, ptr + thumbsize); + else + thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); + ptr += thumbsize; + } + const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); + let data; + data = unzip; + if (size < 3072) { + thumb = data = await unzip(); } - } - if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { - return { - ext: "mxf", - mime: "application/mxf" - }; - } - if (this.checkString("SCRM", { offset: 44 })) { - return { - ext: "s3m", - mime: "audio/x-s3m" - }; - } - if (this.check([71]) && this.check([71], { offset: 188 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { - return { - ext: "mts", - mime: "video/mp2t" - }; - } - if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { - return { - ext: "mobi", - mime: "application/x-mobipocket-ebook" - }; - } - if (this.check([68, 73, 67, 77], { offset: 128 })) { - return { - ext: "dcm", - mime: "application/dicom" - }; - } - if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { - return { - ext: "lnk", - mime: "application/x.ms.shortcut" - }; - } - if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { - return { - ext: "alias", - mime: "application/x.apple.alias" - }; - } - if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { - return { - ext: "eot", - mime: "application/vnd.ms-fontobject" - }; - } - if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { - return { - ext: "indd", - mime: "application/x-indesign" - }; - } - await tokenizer.peekBuffer(this.buffer, { length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true }); - if (tarHeaderChecksumMatches(this.buffer)) { - return { - ext: "tar", - mime: "application/x-tar" - }; - } - if (this.check([255, 254, 255, 14, 83, 0, 107, 0, 101, 0, 116, 0, 99, 0, 104, 0, 85, 0, 112, 0, 32, 0, 77, 0, 111, 0, 100, 0, 101, 0, 108, 0])) { - return { - ext: "skp", - mime: "application/vnd.sketchup.skp" - }; - } - if (this.checkString("-----BEGIN PGP MESSAGE-----")) { return { - ext: "pgp", - mime: "application/pgp-encrypted" + filename: fn, + data, + thumbnail: thumb }; + } catch (e) { + console.warn(e); } - if (this.buffer.length >= 2 && this.check([255, 224], { offset: 0, mask: [255, 224] })) { - if (this.check([16], { offset: 1, mask: [22] })) { - if (this.check([8], { offset: 1, mask: [8] })) { - return { - ext: "aac", - mime: "audio/aac" - }; - } - return { - ext: "aac", - mime: "audio/aac" - }; - } - if (this.check([2], { offset: 1, mask: [6] })) { - return { - ext: "mp3", - mime: "audio/mpeg" - }; - } - if (this.check([4], { offset: 1, mask: [6] })) { - return { - ext: "mp2", - mime: "audio/mpeg" - }; - } - if (this.check([6], { offset: 1, mask: [6] })) { - return { - ext: "mp1", - mime: "audio/mpeg" - }; + }))).filter((e) => e).map((e) => e); + }; + var fireNotification = (type, content, lifetime = 3) => { + externalDispatch("CreateNotification", { + type, + content, + lifetime + }); + }; + var uploadFiles = async (injs) => { + let total = 0; + fireNotification("info", `Uploading ${injs.length} files...`); + return await Promise.all(injs.map(async (inj) => { + const peefile = await buildPeeFile(inj); + const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); + fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); + return ret; + })); + }; + var getSelectedFile = () => { + return new Promise((res) => { + document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); + document.dispatchEvent(new CustomEvent("QRGetFile")); + }); + }; + async function embeddedToBlob(...efs) { + return (await Promise.all(efs.map(async (ef) => { + let buff; + if (typeof ef.data == "string") { + const req = await ifetch(ef.data); + buff = import_buffer2.Buffer.from(await req.arrayBuffer()); + } else if (!import_buffer2.Buffer.isBuffer(ef.data)) + buff = await ef.data(); + else + buff = ef.data; + const mim = await fileTypeFromBuffer(buff); + const file = new File([buff], ef.filename, { type: mim?.mime }); + return file; + }))).filter((e) => e); + } + async function addToEmbeds(...efs) { + const files = await embeddedToBlob(...efs); + const links = await uploadFiles(files); + document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); + } + async function getFileFromHydrus(client, tags, args) { + const results = (await client.idsByTags(tags, args)).file_ids; + const metas = await client.getMetaDataByIds(results); + return await Promise.all(results.map(async (id, idx) => { + return [ + id, + { + thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), + data: async () => import_buffer2.Buffer.from(await client.getFile(id)), + filename: metas.metadata[idx].hash + metas.metadata[idx].ext } - } + ]; + })); + } + function externalDispatch(name, data) { + let event; + if (false) { + const clonedDetail = cloneInto(data, document.defaultView); + event = new CustomEvent(name, { detail: clonedDetail }); + } else { + event = new CustomEvent(name, { detail: data }); } - async readTiffTag(bigEndian) { - const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - this.tokenizer.ignore(10); - switch (tagId) { - case 50341: - return { - ext: "arw", - mime: "image/x-sony-arw" - }; - case 50706: - return { - ext: "dng", - mime: "image/x-adobe-dng" - }; - default: - } + document.dispatchEvent(event); + } + var peeTarget = class { + constructor() { + this.targets = {}; } - async readTiffIFD(bigEndian) { - const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); - for (let n = 0; n < numberOfTags; ++n) { - const fileType = await this.readTiffTag(bigEndian); - if (fileType) { - return fileType; - } - } + addEventListener(ev, cb) { + this.targets[ev] = this.targets[ev] || []; + this.targets[ev].push(cb); } - async readTiffHeader(bigEndian) { - const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); - const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); - if (version === 42) { - if (ifdOffset >= 6) { - if (this.checkString("CR", { offset: 8 })) { - return { - ext: "cr2", - mime: "image/x-canon-cr2" - }; - } - if (ifdOffset >= 8 && (this.check([28, 0, 254, 0], { offset: 8 }) || this.check([31, 0, 11, 0], { offset: 8 }))) { - return { - ext: "nef", - mime: "image/x-nikon-nef" - }; - } + dispatchEvent(ev) { + const evs = this.targets[ev.type]; + if (evs) + for (const cb of evs) + cb(ev); + return true; + } + removeEventListener(ev, cb) { + const evs = this.targets[ev]; + if (!evs) + return; + for (let i = 0; i < evs.length; ++i) { + if (evs[i] == cb) { + evs.splice(i, 1); + return; } - await this.tokenizer.ignore(ifdOffset); - const fileType = await this.readTiffIFD(false); - return fileType ? fileType : { - ext: "tif", - mime: "image/tiff" - }; - } - if (version === 43) { - return { - ext: "tif", - mime: "image/tiff" - }; } } }; - var supportedExtensions = new Set(extensions); - var supportedMimeTypes = new Set(mimeTypes); - // src/utils.ts - var csettings; + // src/pngv3.ts + var bs58 = __toESM(require_bs58(), 1); + var csettings2; settings.subscribe((b) => { - csettings = b; + csettings2 = b; }); - var generateThumbnail = async (f) => { - const can = document.createElement("canvas"); - const [sw, sh] = [125, 125]; - const url = URL.createObjectURL(f); - let source; - let iw, ih; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - [iw, ih] = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - [iw, ih] = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return import_buffer2.Buffer.alloc(0); - const scale = Math.min(1, sw / iw, sh / ih); - const dims = [~~(iw * scale), ~~(ih * scale)]; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("bitmaprenderer"); - const bmp = await createImageBitmap(source, { resizeHeight: dims[1], resizeWidth: dims[0], resizeQuality: "high" }); - if (!ctx) - return import_buffer2.Buffer.alloc(0); - ctx?.transferFromImageBitmap(bmp); - const blob = await new Promise((_) => can.toBlob(_)); - if (!blob) - return import_buffer2.Buffer.alloc(0); - return import_buffer2.Buffer.from(await blob.arrayBuffer()); + var CUM3 = import_buffer3.Buffer.from("doo\0m"); + var CUM4 = import_buffer3.Buffer.from("voo\0m"); + var CUM5 = import_buffer3.Buffer.from("boo\0"); + var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); + var CUM7 = import_buffer3.Buffer.from("Software\0"); + var BufferReadStream = (b) => { + const ret = new ReadableStream({ + pull(cont) { + cont.enqueue(b); + cont.close(); + } + }); + return ret; }; - var buildPeeFile = async (f) => { - if (false) - return buildPeeFileFF(f); - let thumbnail = import_buffer2.Buffer.alloc(0); - thumbnail = await generateThumbnail(f); - const namebuf = import_buffer2.Buffer.from(f.name); - const ret = import_buffer2.Buffer.alloc(4 + 1 + namebuf.byteLength + 1 + (thumbnail.byteLength != 0 ? 4 + thumbnail.byteLength : 0) + f.size); - let ptr = 0; - ret.write("PEE\0", 0); - ptr += 4; - ret[ptr++] = 1 | +(thumbnail.length != 0) << 2; - namebuf.copy(ret, ptr); - ptr += namebuf.byteLength; - ret[ptr++] = 0; - if (thumbnail.length > 0) { - ret.writeInt32LE(thumbnail.byteLength, ptr); - ptr += 4; - thumbnail.copy(ret, ptr); - ptr += thumbnail.byteLength; + var password = import_buffer3.Buffer.from("NOA"); + var xor = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var prefs = { + "files.catbox.moe": "c", + "a.pomf.cat": "p", + "take-me-to.space": "t", + "z.zz.fo": "z" + }; + var rprefs = { + "c": "files.catbox.moe", + "p": "a.pomf.cat", + "t": "take-me-to.space", + "z": "z.zz.fo" + }; + var extract = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + const ret = []; + let w; + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { + const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { + const passed = buff.slice(4 + CUM4.length); + xor(passed, password); + const k = await decodeCoom3Payload(passed); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { + const passed = buff.slice(4 + CUM5.length); + const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } + if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { + const passed = buff.slice(4 + w.length); + if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) + continue; + const decoders = [ + (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), + (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() + ]; + for (const d of decoders) { + try { + const decoded = d(passed).split(" ").map((e) => { + if (!(e[0] in rprefs)) + throw "Uhh"; + return `https://${rprefs[e[0]]}/${e.slice(1)}`; + }).join(" "); + const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); + ret.push(...k.filter((e) => e).map((e) => e)); + } catch (e) { + } + } + } + break; + case "IDAT": + case "IEND": + return ret.slice(0, csettings2.maxe); + default: + break; + } + } + } catch (e) { + console.error(e); + } finally { + reader.releaseLock(); } - const content = await f.arrayBuffer(); - import_buffer2.Buffer.from(content).copy(ret, ptr); - return new Blob([ret]); - }; - var getThreadInfo = async (board, op) => { - const res = await (await fetch(`https://shoujo.coom.tech/data/${board}/${op}`)).json(); - return Object.fromEntries(res.map((e) => [e.id, e])); }; - var threadDataCache = writable(); - var cthreadDataCache; - threadDataCache.subscribe((newval) => { - cthreadDataCache = newval; - }); - var refreshThreadDataCache = async (board, op) => { - threadDataCache.set(await getThreadInfo(board, op)); + var buildChunk = (tag, data) => { + const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); + ret.write(tag.slice(0, 4), 0); + data.copy(ret, 4); + return ret; }; - var getThreadDataCache = async (board, op) => { - if (!cthreadDataCache) - await refreshThreadDataCache(board, op); - return threadDataCache; + var BufferWriteStream2 = () => { + let b = import_buffer3.Buffer.from([]); + const ret = new WritableStream({ + write(chunk) { + b = import_buffer3.Buffer.concat([b, chunk]); + } + }); + return [ret, () => b]; }; - var getEmbedsFromCache = async (board, op, pid) => { - await getThreadDataCache(board, op); - const target = +pid.slice(pid.match(/\d/).index); - const cachedData = cthreadDataCache[target]; - if (!cachedData) - return; - const ret = []; - if ("pee" in cachedData.data) { - const files = await decodeCoom3Payload(import_buffer2.Buffer.from(cachedData.data.pee.join(" "))); - ret.push([files, false]); - } - if ("third" in cachedData.data) { - if (csettings.phash) { - if ((cachedData.mdist || Number.POSITIVE_INFINITY) < (csettings.mdist || 5)) - return ret; + var inject_data = async (container, injb) => { + let magic4 = false; + const [writestream, extract7] = BufferWriteStream2(); + const encoder = new PNGEncoder(writestream); + const decoder = new PNGDecoder(container.stream().getReader()); + for await (const [name, chunk, crc, offset] of decoder.chunks()) { + if (magic4 && name != "IDAT") + break; + if (!magic4 && name == "IDAT") { + const passed = import_buffer3.Buffer.from(injb); + await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); + magic4 = true; } - let cachedFile; - const data = cachedData.data.third; - const prev = data.preview_url; - const full = data.full_url; - const fn = new URL(full).pathname.split("/").slice(-1)[0]; - const end = [{ - source: data.source, - page: { - title: "PEE Cache", - url: data.page - }, - filename: fn, - thumbnail: csettings.hotlink ? prev || full : import_buffer2.Buffer.from(await (await ifetch(prev || full)).arrayBuffer()), - data: csettings.hotlink ? full || prev : async (lsn) => { - if (!cachedFile) - cachedFile = await (await ifetch(full || prev, void 0, lsn)).arrayBuffer(); - return import_buffer2.Buffer.from(cachedFile); - } - }]; - ret.push([end, true]); + await encoder.insertchunk([name, chunk, crc, offset]); } - return ret; + await encoder.insertchunk([ + "IEND", + async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), + async () => Promise.resolve(0), + 0 + ]); + return extract7(); }; - var decodeCoom3Payload = async (buff) => { - const allowed_domains = filehosts.map((e) => e.serving.replaceAll(".", "\\.")); - const pees = buff.toString().split(" ").slice(0, csettings.maxe).filter((e) => allowed_domains.some((v) => e.match(`https://(.*\\.)?${v}/`))); - return (await Promise.all(pees.map(async (pee) => { - try { - const m = pee.match(/(?https?):\/\/(?.*?)(?\/.*)/); - if (!m) - return; - const { domain, file } = m.groups; - const headers = await getHeaders(pee); - const res = await ifetch(pee, { - headers: { range: "bytes=0-32767", "user-agent": "" }, - mode: "cors", - referrerPolicy: "no-referrer" - }); - const size = +headers["content-length"] || 0; - const header = import_buffer2.Buffer.from(await res.arrayBuffer()); - let hptr = 0; - if (header.slice(0, 4).toString() == "PEE\0") - hptr += 4; - else - return; - const flags = header[hptr]; - const hasFn = !!(flags & 1); - const hasTags = !!(flags & 2); - const hasThumbnail = !!(flags & 4); - let [ptr, ptr2] = [hptr + 1, hptr + 1]; - let fn = "embedded"; - let tags = []; - let thumb = import_buffer2.Buffer.from(hasembed_default); - if (hasFn) { - while (header[ptr2] != 0) - ptr2++; - fn = header.slice(ptr, ptr2).toString(); - ptr = ++ptr2; - } - if (hasTags) { - while (header[ptr2] != 0) - ptr2++; - tags = header.slice(ptr, ptr2).toString().split(/\s+/); - } - let thumbsize = 0; - if (hasThumbnail) { - thumbsize = header.readInt32LE(ptr); - ptr += 4; - if (header.byteLength < ptr + thumbsize) - thumb = header.slice(ptr, ptr + thumbsize); - else - thumb = import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${ptr + thumbsize}` } })).arrayBuffer()); - ptr += thumbsize; + var inject = async (container, links) => { + links = links.map((link) => { + for (const h of filehosts) { + if (link.includes(h.serving)) { + const end = link.split("/").slice(-1)[0]; + return `${prefs[h.serving]}${end}`; } - const unzip = async (lsn) => import_buffer2.Buffer.from(await (await ifetch(pee, { headers: { "user-agent": "", range: `bytes=${ptr}-${size - 1}` } }, lsn)).arrayBuffer()); - let data; - data = unzip; - if (size < 3072) { - thumb = data = await unzip(); + } + return ""; + }); + const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); + return inject_data(container, injb); + }; + var has_embed = async (png) => { + const reader = BufferReadStream(png).getReader(); + const sneed = new PNGDecoder(reader); + try { + for await (const [name, chunk, crc, offset] of sneed.chunks()) { + let buff; + switch (name) { + case "tEXt": + buff = await chunk(); + if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) + return true; + if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) + return true; + if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) + return true; + if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { + const passed = buff.slice(4 + CUM6.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { + const passed = buff.slice(4 + CUM7.length).toString(); + if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { + if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) + return true; + if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) + return true; + } + } + break; + case "IDAT": + case "IEND": + return false; + default: + break; } - return { - filename: fn, - data, - thumbnail: thumb - }; - } catch (e) { - console.warn(e); } - }))).filter((e) => e).map((e) => e); + } catch (e) { + return; + } finally { + reader.releaseLock(); + } + }; + var pngv3_default = { + extract, + has_embed, + inject, + match: (fn) => !!fn.match(/\.png$/) + }; + + // src/webm.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer4 = __toESM(require_buffer(), 1); + var ebml = __toESM(require_lib2(), 1); + var password2 = import_buffer4.Buffer.from("NOA"); + var xor2 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; + } + }; + var findEnclosingTag = (ch, name) => { + const first = ch.findIndex((e) => e.type == "m" && e.name == name); + if (first < 0) + return; + const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); + if (second < 0) + return; + return [ + first, + first + second + ]; + }; + var embed = (webm, data) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const enc = new ebml.Encoder(); + let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); + const findOrInsert = (n) => { + let tags = findEnclosingTag(chunks, n); + const stack = []; + if (!tags) { + stack.push({ + type: "m", + isEnd: false, + name: n, + data: import_buffer4.Buffer.from("") + }); + stack.push({ + type: "m", + isEnd: true, + name: n, + data: import_buffer4.Buffer.from("") + }); + chunks.splice(embed2 + 1, 0, ...stack); + tags = findEnclosingTag(chunks, n); + } + embed2 = tags[1]; + }; + findOrInsert("Tags"); + findOrInsert("Tag"); + findOrInsert("Targets"); + embed2++; + chunks.splice(embed2 + 1, 0, ...[ + { + type: "m", + isEnd: false, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + }, + { + type: "8", + isEnd: false, + name: "TagName", + data: import_buffer4.Buffer.from("VOOM") + }, + { + type: "8", + isEnd: false, + name: "TagBinary", + data + }, + { + type: "m", + isEnd: true, + name: "SimpleTag", + data: import_buffer4.Buffer.from("") + } + ]); + return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); }; - var fireNotification = (type, content, lifetime = 3) => { - externalDispatch("CreateNotification", { - type, - content, - lifetime - }); + var extract2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return; + if (embed2 == -1) + return; + const echk = chunks[embed2]; + const chk = chunks[embed2 + 1]; + if (chk.type == "b" && chk.name == "TagBinary") { + if (echk.type == "8" && echk.value == "VOOM") { + xor2(chk.data, password2); + } + return decodeCoom3Payload(chk.data); + } }; - var uploadFiles = async (injs) => { - let total = 0; - fireNotification("info", `Uploading ${injs.length} files...`); - return await Promise.all(injs.map(async (inj) => { - const peefile = await buildPeeFile(inj); - const ret = await filehosts[csettings.fhost || 0].uploadFile(peefile); - fireNotification("info", `Uploaded files [${++total}/${injs.length}] ${ret}`); - return ret; - })); + var inject2 = async (container, links) => { + const buff = import_buffer4.Buffer.from(links.join(" ")); + xor2(buff, password2); + return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); }; - var getSelectedFile = () => { - return new Promise((res) => { - document.addEventListener("QRFile", (e) => res(e.detail), { once: true }); - document.dispatchEvent(new CustomEvent("QRGetFile")); - }); + var has_embed2 = (webm) => { + const dec = new ebml.Decoder(); + const chunks = dec.decode(webm); + const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); + const cl = chunks.find((e) => e.name == "Cluster"); + if (cl && embed2 == -1) + return false; + if (embed2 == -1) + return; + return true; }; - async function embeddedToBlob(...efs) { - return (await Promise.all(efs.map(async (ef) => { - let buff; - if (typeof ef.data == "string") { - const req = await ifetch(ef.data); - buff = import_buffer2.Buffer.from(await req.arrayBuffer()); - } else if (!import_buffer2.Buffer.isBuffer(ef.data)) - buff = await ef.data(); - else - buff = ef.data; - const mim = await fileTypeFromBuffer(buff); - const file = new File([buff], ef.filename, { type: mim?.mime }); - return file; - }))).filter((e) => e); - } - async function addToEmbeds(...efs) { - const files = await embeddedToBlob(...efs); - const links = await uploadFiles(files); - document.dispatchEvent(new CustomEvent("AddPEE", { detail: links })); - } - async function getFileFromHydrus(client, tags, args) { - const results = (await client.idsByTags(tags, args)).file_ids; - const metas = await client.getMetaDataByIds(results); - return await Promise.all(results.map(async (id, idx) => { - return [ - id, - { - thumbnail: import_buffer2.Buffer.from(await client.getThumbnail(id)), - data: async () => import_buffer2.Buffer.from(await client.getFile(id)), - filename: metas.metadata[idx].hash + metas.metadata[idx].ext - } - ]; - })); - } - function externalDispatch(name, data) { - let event; - if (false) { - const clonedDetail = cloneInto(data, document.defaultView); - event = new CustomEvent(name, { detail: clonedDetail }); - } else { - event = new CustomEvent(name, { detail: data }); + var webm_default = { + extract: extract2, + has_embed: has_embed2, + inject: inject2, + match: (fn) => !!fn.match(/\.webm$/) + }; + + // src/gif.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer5 = __toESM(require_buffer(), 1); + var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); + var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); + var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); + var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); + var read_section = (gif, pos) => { + const begin = pos; + pos += 3 + gif[pos + 2]; + let buf2 = import_buffer5.Buffer.alloc(0); + while (pos < gif.byteLength) { + const v = gif[pos++]; + buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); + if (v == 0) + break; + pos += v; } - document.dispatchEvent(event); - } - var peeTarget = class { - constructor() { - this.targets = {}; + const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); + return { + appname, + data: buf2, + end: pos + }; + }; + var password3 = import_buffer5.Buffer.from("NOA"); + var xor3 = (a, p) => { + let n = 0; + for (let i = 0; i < a.byteLength; ++i) { + a[i] ^= p[n]; + n++; + n %= p.byteLength; } - addEventListener(ev, cb) { - this.targets[ev] = this.targets[ev] || []; - this.targets[ev].push(cb); + }; + var extractBuff = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); } - dispatchEvent(ev) { - const evs = this.targets[ev.type]; - if (evs) - for (const cb of evs) - cb(ev); - return true; + while (gif[end] == "!".charCodeAt(0)) { + let sec = read_section(gif, end); + if (sec.appname == "DOOMTECH") { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); + return decodeCoom3Payload(ret); + } + const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; + if (cond()) { + const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); + let ptr = 0; + do { + sec = read_section(gif, sec.end); + sec.data.copy(ret, ptr); + ptr += sec.data.byteLength; + end = sec.end; + } while (cond() && gif[end] == "!".charCodeAt(0)); + xor3(ret, password3); + return decodeCoom3Payload(ret); + } + end = sec.end; + } + throw new Error("Shouldn't happen"); + }; + var extract3 = extractBuff; + var write_data = async (writer, inj) => { + await writer.write(magic3); + const byte = import_buffer5.Buffer.from([0]); + let size = inj.byteLength; + let ws; + let offset = 0; + while (size != 0) { + ws = size >= 255 ? 255 : size; + byte.writeUInt8(ws, 0); + await writer.write(byte); + await writer.write(inj.slice(offset, offset + ws)); + size -= ws; + offset += ws; + } + byte.writeUInt8(0, 0); + await writer.write(byte); + }; + var write_embedding = async (writer, inj) => { + const b = import_buffer5.Buffer.alloc(4); + b.writeInt32LE(inj.byteLength, 0); + await write_data(writer, b); + let size = inj.byteLength; + let offset = 0; + while (size != 0) { + const ws = size >= 3 << 13 ? 3 << 13 : size; + await write_data(writer, inj.slice(offset, offset + ws)); + offset += ws; + size -= ws; } - removeEventListener(ev, cb) { - const evs = this.targets[ev]; - if (!evs) - return; - for (let i = 0; i < evs.length; ++i) { - if (evs[i] == cb) { - evs.splice(i, 1); - return; + }; + var inject3 = async (container, links) => { + const [writestream, extract7] = BufferWriteStream(); + const writer = writestream.getWriter(); + const inj = import_buffer5.Buffer.from(links.join(" ")); + xor3(inj, password3); + const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); + const field = contbuff.readUInt8(10); + const gcte = !!(field & 1 << 7); + let endo = 13; + if (gcte) + endo += 3 * (1 << (field & 7) + 1); + if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) + endo += 19; + await writer.write(contbuff.slice(0, endo)); + await write_embedding(writer, import_buffer5.Buffer.from(inj)); + await writer.write(contbuff.slice(endo)); + return extract7(); + }; + var has_embed3 = (gif) => { + const field = gif.readUInt8(10); + const gcte = !!(field & 1 << 7); + let end = 13; + if (gcte) { + end += 3 * (1 << (field & 7) + 1); + } + while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { + if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { + end += 3 + gif.readUInt8(end + 2); + while (true) { + const v = gif.readUInt8(end++); + if (!v) + break; + end += v; } + } else { + return true; } } + if (end >= gif.byteLength) + return; + return false; + }; + var gif_default = { + extract: extract3, + has_embed: has_embed3, + inject: inject3, + match: (fn) => !!fn.match(/\.gif$/) }; - // src/pngv3.ts - var bs58 = __toESM(require_bs58(), 1); - var csettings2; - settings.subscribe((b) => { - csettings2 = b; - }); - var CUM3 = import_buffer3.Buffer.from("doo\0m"); - var CUM4 = import_buffer3.Buffer.from("voo\0m"); - var CUM5 = import_buffer3.Buffer.from("boo\0"); - var CUM6 = import_buffer3.Buffer.from("Creation Time\0"); - var CUM7 = import_buffer3.Buffer.from("Software\0"); - var BufferReadStream = (b) => { - const ret = new ReadableStream({ - pull(cont) { - cont.enqueue(b); - cont.close(); + // src/jpg.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var import_buffer6 = __toESM(require_buffer(), 1); + + // src/f5stego.ts + init_define_BUILD_VERSION(); + init_esbuild_inject(); + var bitcode = new Array(65535); + var category = new Array(65535); + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function _initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + _initCategoryNumber(); + function _computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = []; + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + var YDC_HT = _computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + var UVDC_HT = _computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + var YAC_HT = _computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + var UVAC_HT = _computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + var _randPool, __raw, _jfif, _APPn, _qts, _frame, _tail, _shuffleInit, shuffleInit_fn, _stegShuffle, stegShuffle_fn, __analyze, _analyze_fn, __f5write, _f5write_fn; + var f5stego = class { + constructor(key2, maxPixels = 4096 * 4096) { + this.maxPixels = maxPixels; + __privateAdd(this, _shuffleInit); + __privateAdd(this, _stegShuffle); + __privateAdd(this, __analyze); + __privateAdd(this, __f5write); + __privateAdd(this, _randPool, void 0); + __privateAdd(this, __raw, void 0); + __privateAdd(this, _jfif, void 0); + __privateAdd(this, _APPn, void 0); + __privateAdd(this, _qts, void 0); + __privateAdd(this, _frame, null); + __privateAdd(this, _tail, null); + __privateMethod(this, _shuffleInit, shuffleInit_fn).call(this, key2); + } + embed(image, data, k) { + this.parse(image); + this.f5put(data, k); + return this.pack(); + } + extract(image) { + this.parse(image, true); + return this.f5get(); + } + analyze() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var i, comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } } - }); - return ret; - }; - var password = import_buffer3.Buffer.from("NOA"); - var xor = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); } - }; - var prefs = { - "files.catbox.moe": "c", - "a.pomf.cat": "p", - "take-me-to.space": "t", - "z.zz.fo": "z" - }; - var rprefs = { - "c": "files.catbox.moe", - "p": "a.pomf.cat", - "t": "take-me-to.space", - "z": "z.zz.fo" - }; - var extract = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - const ret = []; - let w; - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) { - const k = await decodeCoom3Payload(buff.slice(4 + CUM3.length)); - ret.push(...k.filter((e) => e).map((e) => e)); + f5put(data, k) { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var t, i, comp = __privateGet(this, _frame).components[0]; + if (data.length > 8388607) + throw "Data too big. Max 8388607 bytes allowed."; + if (data.length < 32768) { + t = new Uint8Array(2 + data.length); + t[0] = data.length & 255; + t[1] = data.length >>> 8; + t.set(data, 2); + } else { + t = new Uint8Array(3 + data.length); + t[0] = data.length & 255; + t[1] = (data.length >>> 8 & 127) + 128; + t[2] = data.length >>> 15; + t.set(data, 3); + } + if (comp.componentId != 1) { + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (k) { + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + return __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + let ret; + let prop = __privateMethod(this, __analyze, _analyze_fn).call(this, comp.blocks); + k = 0; + for (i = prop.capacity.length - 1; i >= 0; i--) { + if (prop.capacity[i] >= t.length) { + k = i; + break; + } + } + if (k === 0) + throw "capacity exceeded"; + try { + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } catch (e) { + k--; + if (k === 0) + throw "capacity exceeded"; + ret = __privateMethod(this, __f5write, _f5write_fn).call(this, comp.blocks, t, k); + } + ret["stats"] = prop; + return ret; + } + f5get() { + if (!__privateGet(this, _frame)) + throw "Parser not run"; + var comp = __privateGet(this, _frame).components[0]; + if (comp.componentId != 1) { + for (var i = 0; i < __privateGet(this, _frame).components.length; i++) { + if (__privateGet(this, _frame).components[i].componentId == 1) { + comp = __privateGet(this, _frame).components[i]; + break; + } + } + } + if (!("blocks" in comp)) { + throw "Blocks failed to be parsed"; + } + var coeff = new Int16Array(comp.blocks.length); + coeff.set(comp.blocks); + var pos = -1, extrBit = 0, cCount = coeff.length - 1; + var n, k = 0; + var out = new Uint8Array(coeff.length / 8 | 0), extrByte = 0, outPos = 0, bitsAvail = 0, code = 0, hash2 = 0; + while (bitsAvail < 4) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + k |= extrBit << bitsAvail; + bitsAvail++; + } + k = (k & 15) + 1; + n = (1 << k) - 1; + bitsAvail = 0; + if (k == 1) { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + extrByte |= extrBit << bitsAvail; + bitsAvail++; + if (bitsAvail == 8) { + out[outPos++] = extrByte; + extrByte = 0; + bitsAvail = 0; + } + } + } else { + while (pos < cCount) { + pos++; + if (coeff[pos] === 0) { + continue; + } + extrBit = coeff[pos] & 1; + if (coeff[pos] < 0) { + extrBit = 1 - extrBit; + } + hash2 ^= extrBit * ++code; + if (code == n) { + extrByte |= hash2 << bitsAvail; + bitsAvail += k; + code = 0; + hash2 = 0; + while (bitsAvail >= 8) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; } - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) { - const passed = buff.slice(4 + CUM4.length); - xor(passed, password); - const k = await decodeCoom3Payload(passed); - ret.push(...k.filter((e) => e).map((e) => e)); + } + } + } + while (bitsAvail > 0) { + out[outPos++] = extrByte & 255; + bitsAvail -= 8; + extrByte = extrByte >> 8; + } + var s = 2, l = out[0]; + if (out[1] & 128) { + s++; + l += ((out[1] & 127) << 8) + (out[2] << 15); + } else { + l += out[1] << 8; + } + return out.subarray(s, s + l); + } + parse(data, tolerant = false) { + var offset = 0; + function _buildHuffmanTable(nrcodes, values) { + var codevalue = 0, pos_in_table = 0, HT = new Uint16Array(65536); + for (var k = 0; k < 16; k++) { + for (var j2 = 0; j2 < nrcodes[k]; j2++) { + for (var i2 = codevalue << 15 - k, cntTo = codevalue + 1 << 15 - k; i2 < cntTo; i2++) { + HT[i2] = values[pos_in_table] + (k + 1 << 8); } - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) { - const passed = buff.slice(4 + CUM5.length); - const decoded = import_buffer3.Buffer.from(passed.toString(), "base64").toString().split(" ").map((e) => { - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function decodeScan(data2, offset2, frame, components2, resetInterval2, spectralStart2, spectralEnd2, successivePrev, successive) { + var startOffset = offset2, bitsData = 0, bitsCount = 0, eobrun = 0, p1 = 1 << successive, m1 = -1 << successive; + function decodeBaseline(component2, pos) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + var diff = 0; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; } - if (w = [CUM6, CUM7].find((e) => buff.slice(4, 4 + e.length).equals(e))) { - const passed = buff.slice(4 + w.length); - if (!passed.toString().match(/^[0-9a-zA-Z+/=]+$/g)) - continue; - const decoders = [ - (b) => import_buffer3.Buffer.from(b.toString(), "base64").toString(), - (b) => import_buffer3.Buffer.from(bs58.decode(passed.toString())).toString() - ]; - for (const d of decoders) { - try { - const decoded = d(passed).split(" ").map((e) => { - if (!(e[0] in rprefs)) - throw "Uhh"; - return `https://${rprefs[e[0]]}/${e.slice(1)}`; - }).join(" "); - const k = await decodeCoom3Payload(import_buffer3.Buffer.from(decoded)); - ret.push(...k.filter((e) => e).map((e) => e)); - } catch (e) { + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff; + var k2 = 1, s, r; + while (k2 < 64) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r < 15) { + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + k2++; + } + } + function decodeDCFirst(component2, pos) { + var diff = 0; + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + var t = component2.huffmanTableDC[bitsData >>> bitsCount - 16 & 65535]; + if (!t) + throw "invalid huffman sequence"; + bitsCount -= t >>> 8; + t &= 255; + if (t !== 0) { + while (bitsCount < t) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + diff = bitsData >>> bitsCount - t & (1 << t) - 1; + bitsCount -= t; + if (diff < 1 << t - 1) + diff += (-1 << t) + 1; + } + component2.blocksDC[pos >> 6] = component2.pred += diff << successive; + } + function decodeDCSuccessive(component2, pos) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocksDC[pos >> 6] |= (bitsData >>> --bitsCount & 1) << successive; + } + if (!frame) + throw "Frame not parsed yet"; + function decodeACFirst(component2, pos) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart2, s, r; + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s === 0) { + if (r != 15) { + eobrun = (1 << r) - 1; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + k2 += 16; + continue; + } + k2 += r; + while (bitsCount < s) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + component2.blocks[pos + k2] = bitsData >>> bitsCount - s & (1 << s) - 1; + bitsCount -= s; + if (component2.blocks[pos + k2] < 1 << s - 1) + component2.blocks[pos + k2] += (-1 << s) + 1; + component2.blocks[pos + k2] *= p1; + k2++; + } + } + function decodeACSuccessive(component2, pos) { + var k2 = spectralStart2, r, s; + if (frame == null) + throw "Frame not defined"; + if (!eobrun) { + while (k2 <= spectralEnd2) { + while (bitsCount < 16) { + bitsData = (bitsData << 8) + (data2[offset2] | 0); + bitsCount += 8; + if (data2[offset2] == 255) + offset2++; + offset2++; + } + s = component2.huffmanTableAC[bitsData >>> bitsCount - 16 & 65535]; + if (!s) + throw "invalid huffman sequence"; + bitsCount -= s >>> 8; + r = s >> 4 & 15; + s &= 15; + if (s) { + if (s != 1) + throw "bad jpeg"; + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + s = bitsData >>> --bitsCount & 1 ? p1 : m1; + } else { + if (r != 15) { + eobrun = 1 << r; + if (r) { + while (bitsCount < r) { + bitsData = (bitsData << 8) + data2[offset2++]; + if ((bitsData & 255) == 255) + offset2++; + bitsCount += 8; + } + eobrun += bitsData >>> bitsCount - r & (1 << r) - 1; + bitsCount -= r; + } + break; + } + } + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } else { + if (--r < 0) + break; + } + k2++; + } + if (s) + component2.blocks[pos + k2] = s; + k2++; + } + } + if (eobrun) { + while (k2 <= spectralEnd2) { + if (component2.blocks[pos + k2]) { + if (!bitsCount) { + bitsData = data2[offset2++]; + if (bitsData == 255) + offset2++; + bitsCount = 8; + } + component2.blocks[pos + k2] += (bitsData >>> --bitsCount & 1) * (component2.blocks[pos + k2] >= 0 ? p1 : m1); + } + k2++; + } + eobrun--; + } + } + var decodeFn; + if (frame.progressive) { + if (spectralStart2 === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var marker, mcuExpected, i2, j2, k, n, mcusPerLine2, mcusPerRow, x, y; + if (components2.length == 1) { + mcusPerLine2 = components2[0].blocksPerLine; + mcusPerRow = components2[0].blocksPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + components2[0].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + decodeFn(components2[i2], (y * components2[i2].blocksPerLineForMcu + x) * 64); + } + } + } + } else { + mcusPerLine2 = frame.mcusPerLine; + mcusPerRow = frame.mcusPerColumn; + mcuExpected = mcusPerRow * mcusPerLine2; + if (!resetInterval2) + resetInterval2 = mcuExpected; + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + for (y = 0; y < mcusPerRow; y++) { + for (x = 0; x < mcusPerLine2; x++) { + if (!n) { + n = resetInterval2; + for (i2 = 0; i2 < components2.length; i2++) + components2[i2].pred = 0; + eobrun = 0; + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else { + if (marker <= 65280) { + throw "bad jpeg"; + } + break; + } + } + n--; + for (i2 = 0; i2 < components2.length; i2++) { + for (j2 = 0; j2 < components2[i2].v; j2++) { + for (k = 0; k < components2[i2].h; k++) { + decodeFn(components2[i2], ((y * components2[i2].v + j2) * components2[i2].blocksPerLineForMcu + x * components2[i2].h + k) * 64); + } } } } + } + } + offset2 -= bitsCount / 8 | 0; + if (data2[offset2 - 1] == 255) + offset2--; + return offset2 - startOffset; + } + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + __privateSet(this, __raw, data); + __privateSet(this, _jfif, null); + __privateSet(this, _APPn, []); + __privateSet(this, _qts, []); + __privateSet(this, _frame, null); + __privateSet(this, _tail, null); + var markerHi, markerLo, i, j, resetInterval, component; + let huffmanTablesAC = []; + let huffmanTablesDC = []; + while (1) { + if (offset >= data.length) { + if (tolerant) break; - case "IDAT": - case "IEND": - return ret.slice(0, csettings2.maxe); - default: + throw "unexpected EOF"; + } + markerHi = data[offset++]; + markerLo = data[offset++]; + if (markerHi == 255) { + if (markerLo == 224) { + __privateSet(this, _jfif, readDataBlock()); + } + if (markerLo > 224 && markerLo < 240 || markerLo == 254) { + __privateGet(this, _APPn).push({ + "app": markerLo, + "data": readDataBlock() + }); + } + if (markerLo == 219) { + __privateGet(this, _qts).push(readDataBlock()); + } + if (markerLo >= 192 && markerLo <= 194) { + if (__privateGet(this, _frame)) + throw "Only single frame JPEGs supported"; + readUint16(); + __privateSet(this, _frame, { + "extended": markerLo === 193, + "progressive": markerLo === 194, + "precision": data[offset++], + "scanLines": readUint16(), + "samplesPerLine": readUint16(), + "components": [], + "componentIds": {}, + "maxH": 1, + "maxV": 1 + }); + if (__privateGet(this, _frame).scanLines * __privateGet(this, _frame).samplesPerLine > this.maxPixels) + throw "Image is too big."; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) + maxH = h; + if (maxV < v) + maxV = v; + var qId = data[offset + 2]; + var l = __privateGet(this, _frame).components.push({ + componentId, + h, + v, + quantizationTable: qId + }); + __privateGet(this, _frame).componentIds[componentId] = l - 1; + offset += 3; + } + __privateGet(this, _frame).maxH = maxH; + __privateGet(this, _frame).maxV = maxV; + var mcusPerLine = Math.ceil(__privateGet(this, _frame).samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(__privateGet(this, _frame).scanLines / 8 / maxV); + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + component = __privateGet(this, _frame).components[i]; + var blocksPerLine = Math.ceil(Math.ceil(__privateGet(this, _frame).samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(__privateGet(this, _frame).scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + __privateGet(this, _frame).components[i] = { + ...component, + blocks: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu * 64), + blocksDC: new Int16Array(blocksPerColumnForMcu * blocksPerLineForMcu), + blocksPerLine, + blocksPerColumn, + blocksPerLineForMcu, + blocksPerColumnForMcu + }; + } + __privateGet(this, _frame).mcusPerLine = mcusPerLine; + __privateGet(this, _frame).mcusPerColumn = mcusPerColumn; + } + if (markerLo == 196) { + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += codeLengths[j] = data[offset]; + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + const v2 = _buildHuffmanTable(codeLengths, huffmanValues); + if (huffmanTableSpec >> 4 === 0) + huffmanTablesDC[huffmanTableSpec & 15] = v2; + else + huffmanTablesAC[huffmanTableSpec & 15] = v2; + } + } + if (markerLo == 221) { + resetInterval = readUint16(); + } + if (markerLo == 218) { + if (__privateGet(this, _frame) == null) + throw "SOS before SOF"; + readUint16(); + var selectorsCount = data[offset++]; + var components = []; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = __privateGet(this, _frame).componentIds[data[offset++]]; + component = __privateGet(this, _frame).components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, __privateGet(this, _frame), components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + } + if (markerLo == 217) { break; + } + } else { + if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { + offset -= 3; + } + while (data[offset] != 255 && offset < data.length) { + offset++; + } + if (data[offset] != 255) { + throw "bad jpeg "; + } + } + } + if (!__privateGet(this, _frame)) + throw "bad jpeg"; + if (offset < data.length) + __privateSet(this, _tail, data.subarray(offset)); + return this; + } + pack() { + let byteout; + let bytenew; + let bytepos; + let poslast; + let outpos; + let byte; + function writeByte(value) { + var t; + byteout[outpos++] = value; + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function writeBlock(block) { + var t; + if (outpos + block.length > poslast) { + t = new Uint8Array(byteout.length * 2 + block.length); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + byteout.set(block, outpos); + outpos += block.length; + } + function writeAPP0(self) { + writeWord(65504); + if (!__privateGet(self, _jfif)) { + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } else { + writeWord(__privateGet(self, _jfif).length + 2); + writeBlock(__privateGet(self, _jfif)); } } - } catch (e) { - console.error(e); - } finally { - reader.releaseLock(); - } - }; - var buildChunk = (tag, data) => { - const ret = import_buffer3.Buffer.alloc(data.byteLength + 4); - ret.write(tag.slice(0, 4), 0); - data.copy(ret, 4); - return ret; - }; - var BufferWriteStream2 = () => { - let b = import_buffer3.Buffer.from([]); - const ret = new WritableStream({ - write(chunk) { - b = import_buffer3.Buffer.concat([b, chunk]); + function writeDQT(self) { + for (var i2 = 0; i2 < __privateGet(self, _qts).length; i2++) { + writeWord(65499); + writeWord(__privateGet(self, _qts)[i2].length + 2); + writeBlock(__privateGet(self, _qts)[i2]); + } + } + function writeAPPn(self) { + for (var i2 = 0; i2 < __privateGet(self, _APPn).length; i2++) { + writeWord(65280 | __privateGet(self, _APPn)[i2].app); + writeWord(__privateGet(self, _APPn)[i2].data.length + 2); + writeBlock(__privateGet(self, _APPn)[i2].data); + } + } + function writeSOF0(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65472); + writeWord(8 + __privateGet(self, _frame).components.length * 3); + writeByte(__privateGet(self, _frame).precision); + writeWord(__privateGet(self, _frame).scanLines); + writeWord(__privateGet(self, _frame).samplesPerLine); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + writeByte(c2.h << 4 | c2.v); + writeByte(c2.quantizationTable); + } + } + function writeDHT(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65476); + writeWord(31); + writeByte(0); + for (var i2 = 0; i2 < 16; i2++) { + writeByte(std_dc_luminance_nrcodes[i2 + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeWord(65476); + writeWord(181); + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + if (__privateGet(self, _frame).components.length != 1) { + writeWord(65476); + writeWord(31); + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeWord(65476); + writeWord(181); + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } } - }); - return [ret, () => b]; - }; - var inject_data = async (container, injb) => { - let magic4 = false; - const [writestream, extract7] = BufferWriteStream2(); - const encoder = new PNGEncoder(writestream); - const decoder = new PNGDecoder(container.stream().getReader()); - for await (const [name, chunk, crc, offset] of decoder.chunks()) { - if (magic4 && name != "IDAT") - break; - if (!magic4 && name == "IDAT") { - const passed = import_buffer3.Buffer.from(injb); - await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); - magic4 = true; + function writeSOS(self) { + if (!__privateGet(self, _frame)) + throw "Frame not ready"; + writeWord(65498); + writeWord(6 + __privateGet(self, _frame).components.length * 2); + writeByte(__privateGet(self, _frame).components.length); + for (var i2 = 0; i2 < __privateGet(self, _frame).components.length; i2++) { + var c2 = __privateGet(self, _frame).components[i2]; + writeByte(c2.componentId); + if (i2 === 0) { + writeByte(0); + } else { + writeByte(17); + } + } + writeByte(0); + writeByte(63); + writeByte(0); } - await encoder.insertchunk([name, chunk, crc, offset]); - } - await encoder.insertchunk([ - "IEND", - async () => Promise.resolve(buildChunk("IEND", import_buffer3.Buffer.from([]))), - async () => Promise.resolve(0), - 0 - ]); - return extract7(); - }; - var inject = async (container, links) => { - links = links.map((link) => { - for (const h of filehosts) { - if (link.includes(h.serving)) { - const end = link.split("/").slice(-1)[0]; - return `${prefs[h.serving]}${end}`; + function processDU(comp, POS, DC, HTDC, HTAC) { + var pos, posval, t; + if (bytepos === 0) + bytenew = 0; + if (!("blocks" in comp)) + throw "Blocks not parsed"; + var Diff = comp.blocksDC[POS >> 6] - DC; + DC = comp.blocksDC[POS >> 6]; + if (Diff === 0) { + posval = HTDC[0][1]; + bytenew <<= posval; + bytenew += HTDC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } else { + pos = 32767 + Diff; + posval = HTDC[category[pos]][1]; + bytenew <<= posval; + bytenew += HTDC[category[pos]][0]; + bytepos += posval; + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + var end0pos = 63; + for (; end0pos > 0 && comp.blocks[POS + end0pos] === 0; end0pos--) { + } + if (end0pos === 0) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + return DC; } - } - return ""; - }); - const injb = import_buffer3.Buffer.from(bs58.encode(import_buffer3.Buffer.from(links.join(" ")))); - return inject_data(container, injb); - }; - var has_embed = async (png) => { - const reader = BufferReadStream(png).getReader(); - const sneed = new PNGDecoder(reader); - try { - for await (const [name, chunk, crc, offset] of sneed.chunks()) { - let buff; - switch (name) { - case "tEXt": - buff = await chunk(); - if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) - return true; - if (buff.slice(4, 4 + CUM4.length).equals(CUM4)) - return true; - if (buff.slice(4, 4 + CUM5.length).equals(CUM5)) - return true; - if (buff.slice(4, 4 + CUM6.length).equals(CUM6)) { - const passed = buff.slice(4 + CUM6.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; + var i2 = 1; + var lng; + while (i2 <= end0pos) { + var startpos = i2; + for (; comp.blocks[POS + i2] === 0 && i2 <= end0pos; ++i2) { + } + var nrzeroes = i2 - startpos; + if (nrzeroes >= 16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) { + posval = HTAC[240][1]; + bytenew <<= posval; + bytenew += HTAC[240][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; } } - if (buff.slice(4, 4 + CUM7.length).equals(CUM7)) { - const passed = buff.slice(4 + CUM7.length).toString(); - if (passed.match(/^[0-9a-zA-Z+/=]+$/g)) { - if (import_buffer3.Buffer.from(passed, "base64").toString().split(" ").every((l) => l[0] in rprefs)) - return true; - if (import_buffer3.Buffer.from(bs58.decode(passed)).toString().split(" ").every((l) => l[0] in rprefs)) - return true; - } + nrzeroes = nrzeroes & 15; + } + pos = 32767 + comp.blocks[POS + i2]; + posval = HTAC[(nrzeroes << 4) + category[pos]][1]; + bytenew <<= posval; + bytenew += HTAC[(nrzeroes << 4) + category[pos]][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; } - break; - case "IDAT": - case "IEND": - return false; - default: - break; - } - } - } catch (e) { - return; - } finally { - reader.releaseLock(); - } - }; - var pngv3_default = { - extract, - has_embed, - inject, - match: (fn) => !!fn.match(/\.png$/) - }; - - // src/webm.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer4 = __toESM(require_buffer(), 1); - var ebml = __toESM(require_lib2(), 1); - var password2 = import_buffer4.Buffer.from("NOA"); - var xor2 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var findEnclosingTag = (ch, name) => { - const first = ch.findIndex((e) => e.type == "m" && e.name == name); - if (first < 0) - return; - const second = ch.slice(first).findIndex((e) => e.type == "m" && e.name == name); - if (second < 0) - return; - return [ - first, - first + second - ]; - }; - var embed = (webm, data) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const enc = new ebml.Encoder(); - let embed2 = chunks.findIndex((e) => e.name == "Tracks" && e.type == "m" && e.isEnd); - const findOrInsert = (n) => { - let tags = findEnclosingTag(chunks, n); - const stack = []; - if (!tags) { - stack.push({ - type: "m", - isEnd: false, - name: n, - data: import_buffer4.Buffer.from("") - }); - stack.push({ - type: "m", - isEnd: true, - name: n, - data: import_buffer4.Buffer.from("") - }); - chunks.splice(embed2 + 1, 0, ...stack); - tags = findEnclosingTag(chunks, n); - } - embed2 = tags[1]; - }; - findOrInsert("Tags"); - findOrInsert("Tag"); - findOrInsert("Targets"); - embed2++; - chunks.splice(embed2 + 1, 0, ...[ - { - type: "m", - isEnd: false, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - }, - { - type: "8", - isEnd: false, - name: "TagName", - data: import_buffer4.Buffer.from("VOOM") - }, - { - type: "8", - isEnd: false, - name: "TagBinary", - data - }, - { - type: "m", - isEnd: true, - name: "SimpleTag", - data: import_buffer4.Buffer.from("") - } - ]); - return import_buffer4.Buffer.from(enc.encode(chunks.filter((e) => e.name != "unknown"))); - }; - var extract2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return; - if (embed2 == -1) - return; - const echk = chunks[embed2]; - const chk = chunks[embed2 + 1]; - if (chk.type == "b" && chk.name == "TagBinary") { - if (echk.type == "8" && echk.value == "VOOM") { - xor2(chk.data, password2); - } - return decodeCoom3Payload(chk.data); - } - }; - var inject2 = async (container, links) => { - const buff = import_buffer4.Buffer.from(links.join(" ")); - xor2(buff, password2); - return embed(import_buffer4.Buffer.from(await container.arrayBuffer()), buff); - }; - var has_embed2 = (webm) => { - const dec = new ebml.Decoder(); - const chunks = dec.decode(webm); - const embed2 = chunks.findIndex((e) => e.name == "TagName" && e.type == "8" && (e.value == "DOOM" || e.value == "VOOM")); - const cl = chunks.find((e) => e.name == "Cluster"); - if (cl && embed2 == -1) - return false; - if (embed2 == -1) - return; - return true; - }; - var webm_default = { - extract: extract2, - has_embed: has_embed2, - inject: inject2, - match: (fn) => !!fn.match(/\.webm$/) - }; - - // src/gif.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer5 = __toESM(require_buffer(), 1); - var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); - var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); - var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); - var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii"); - var read_section = (gif, pos) => { - const begin = pos; - pos += 3 + gif[pos + 2]; - let buf2 = import_buffer5.Buffer.alloc(0); - while (pos < gif.byteLength) { - const v = gif[pos++]; - buf2 = import_buffer5.Buffer.concat([buf2, gif.slice(pos, pos + v)]); - if (v == 0) - break; - pos += v; - } - const appname = gif.slice(begin + 3, begin + 11).toString("ascii"); - return { - appname, - data: buf2, - end: pos - }; - }; - var password3 = import_buffer5.Buffer.from("NOA"); - var xor3 = (a, p) => { - let n = 0; - for (let i = 0; i < a.byteLength; ++i) { - a[i] ^= p[n]; - n++; - n %= p.byteLength; - } - }; - var extractBuff = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (gif[end] == "!".charCodeAt(0)) { - let sec = read_section(gif, end); - if (sec.appname == "DOOMTECH") { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); - return decodeCoom3Payload(ret); + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + posval = bitcode[pos][1]; + bytenew <<= posval; + bytenew += bitcode[pos][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + i2++; + } + if (end0pos != 63) { + posval = HTAC[0][1]; + bytenew <<= posval; + bytenew += HTAC[0][0]; + bytepos += posval; + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; + bytenew &= (1 << bytepos) - 1; + } + } + if (outpos > poslast) { + t = new Uint8Array(byteout.length * 2); + t.set(byteout); + byteout = t; + poslast = t.length - 128; + } + return DC; + } + byteout = new Uint8Array(65536); + poslast = 65536 - 128; + outpos = 0; + bytenew = 0; + bytepos = 0; + writeWord(65496); + writeAPP0(this); + writeAPPn(this); + writeDQT(this); + writeSOF0(this); + writeDHT(this); + writeSOS(this); + bytenew = 0; + bytepos = 0; + if (!__privateGet(this, _frame)) + throw "Frame not ready"; + var c, mcuRow, mcuCol, blockRow, blockCol, mcu, i, v, h; + var DCdiff = []; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + DCdiff.push(0); + } + for (mcu = 0; mcu < __privateGet(this, _frame).mcusPerLine * __privateGet(this, _frame).mcusPerColumn; mcu++) { + mcuRow = mcu / __privateGet(this, _frame).mcusPerLine | 0; + mcuCol = mcu % __privateGet(this, _frame).mcusPerLine; + for (i = 0; i < __privateGet(this, _frame).components.length; i++) { + c = __privateGet(this, _frame).components[i]; + for (v = 0; v < c.v; v++) { + blockRow = mcuRow * c.v + v; + for (h = 0; h < c.h; h++) { + blockCol = mcuCol * c.h + h; + if (i === 0) { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], YDC_HT, YAC_HT); + } else { + DCdiff[i] = processDU(c, (blockRow * __privateGet(this, _frame).mcusPerLine * c.h + blockCol) * 64, DCdiff[i], UVDC_HT, UVAC_HT); + } + } + } + } } - const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS"; - if (cond()) { - const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); - let ptr = 0; - do { - sec = read_section(gif, sec.end); - sec.data.copy(ret, ptr); - ptr += sec.data.byteLength; - end = sec.end; - } while (cond() && gif[end] == "!".charCodeAt(0)); - xor3(ret, password3); - return decodeCoom3Payload(ret); + while (bytepos > 7) { + byte = 255 & bytenew >>> bytepos - 8; + byteout[outpos++] = byte; + if (byte == 255) { + outpos++; + } + bytepos -= 8; } - end = sec.end; + if (bytepos > 0) { + bytenew <<= 8 - bytepos; + bytenew += (1 << 8 - bytepos) - 1; + byteout[outpos++] = 255 & bytenew; + } + writeWord(65497); + if (__privateGet(this, _tail)) + writeBlock(__privateGet(this, _tail)); + return byteout.slice(0, outpos); } - throw new Error("Shouldn't happen"); }; - var extract3 = extractBuff; - var write_data = async (writer, inj) => { - await writer.write(magic3); - const byte = import_buffer5.Buffer.from([0]); - let size = inj.byteLength; - let ws; - let offset = 0; - while (size != 0) { - ws = size >= 255 ? 255 : size; - byte.writeUInt8(ws, 0); - await writer.write(byte); - await writer.write(inj.slice(offset, offset + ws)); - size -= ws; - offset += ws; + _randPool = new WeakMap(); + __raw = new WeakMap(); + _jfif = new WeakMap(); + _APPn = new WeakMap(); + _qts = new WeakMap(); + _frame = new WeakMap(); + _tail = new WeakMap(); + _shuffleInit = new WeakSet(); + shuffleInit_fn = function(key2) { + __privateSet(this, _randPool, new ArrayBuffer(this.maxPixels * 4.125)); + if (!key2.length) + throw "key needed"; + var i = 0, j = 0, t = 0, k = 0, S = new Uint8Array(256), rnd = new Uint8Array(__privateGet(this, _randPool)); + for (i = 0; i < 256; ++i) + S[i] = i; + for (i = 0; i < 256; ++i) { + j = j + S[i] + key2[i % key2.length] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + } + i = 0; + j = 0; + for (k = 0; k < this.maxPixels * 4.125; ++k) { + i = i + 1 & 255; + j = j + S[i] & 255; + t = S[i]; + S[i] = S[j]; + S[j] = t; + rnd[k] = S[t + S[i] & 255]; } - byte.writeUInt8(0, 0); - await writer.write(byte); }; - var write_embedding = async (writer, inj) => { - const b = import_buffer5.Buffer.alloc(4); - b.writeInt32LE(inj.byteLength, 0); - await write_data(writer, b); - let size = inj.byteLength; - let offset = 0; - while (size != 0) { - const ws = size >= 3 << 13 ? 3 << 13 : size; - await write_data(writer, inj.slice(offset, offset + ws)); - offset += ws; - size -= ws; + _stegShuffle = new WeakSet(); + stegShuffle_fn = function(pm) { + let t, l, k, random_index, rand32Array = new Uint32Array(__privateGet(this, _randPool)); + if (typeof pm == "number") { + l = pm; + pm = new Uint32Array(l); + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + if (random_index != k) + pm[k] = pm[random_index]; + pm[random_index] = k; + } + } else { + l = pm.length; + for (k = 1; k < l; k++) { + random_index = rand32Array[k] % (k + 1); + t = pm[k]; + pm[k] = pm[random_index]; + pm[random_index] = t; + } } + return { pm, gamma: new Uint8Array(__privateGet(this, _randPool), l * 4) }; }; - var inject3 = async (container, links) => { - const [writestream, extract7] = BufferWriteStream(); - const writer = writestream.getWriter(); - const inj = import_buffer5.Buffer.from(links.join(" ")); - xor3(inj, password3); - const contbuff = import_buffer5.Buffer.from(await container.arrayBuffer()); - const field = contbuff.readUInt8(10); - const gcte = !!(field & 1 << 7); - let endo = 13; - if (gcte) - endo += 3 * (1 << (field & 7) + 1); - if (netscape.compare(contbuff, endo, endo + netscape.byteLength) == 0) - endo += 19; - await writer.write(contbuff.slice(0, endo)); - await write_embedding(writer, import_buffer5.Buffer.from(inj)); - await writer.write(contbuff.slice(endo)); - return extract7(); + __analyze = new WeakSet(); + _analyze_fn = function(coeff) { + var _one = 0, _zero = 0, _large, _ratio, usable, i, k, embedded, matched, changed; + for (i = 0; i < coeff.length; i++) { + if (i % 64 === 0) + continue; + if (coeff[i] === 0) + _zero++; + if (coeff[i] == 1 || coeff[i] == -1) + _one++; + } + _large = coeff.length - _zero - _one - coeff.length / 64; + _ratio = _one / (_large + _one); + var res = { + "capacity": [0, (_large + 0.49 * _one >> 3) - 1], + "coeff_total": coeff.length, + "coeff_large": _large, + "coeff_zero": _zero, + "coeff_one": _one, + "coeff_one_ratio": _one / (_large + _one) + }; + for (i = 2; i < 17; i++) { + k = (1 << i) - 1; + usable = _large + _one; + embedded = 0; + while (usable > k) { + matched = usable / k / (1 << i) / (1 << i) | 0; + usable -= matched * k; + changed = usable * (1 - _ratio) / k * 0.96 | 0; + usable -= changed * k; + embedded += changed + matched; + k++; + } + res.capacity[i] = (i * embedded >> 3) - 1; + } + return res; }; - var has_embed3 = (gif) => { - const field = gif.readUInt8(10); - const gcte = !!(field & 1 << 7); - let end = 13; - if (gcte) { - end += 3 * (1 << (field & 7) + 1); - } - while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { - if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { - end += 3 + gif.readUInt8(end + 2); - while (true) { - const v = gif.readUInt8(end++); - if (!v) + __f5write = new WeakSet(); + _f5write_fn = function(coeff, data, k) { + var coeff_count = coeff.length; + var _changed = 0, _embedded = 0, _examined = 0, _thrown = 0, shuffled_index = 0, i, n, ii; + var next_bit_to_embed = 0, byte_to_embed = data.length, data_idx = 0, available_bits_to_embed = 0; + n = (1 << k) - 1; + byte_to_embed = k - 1; + byte_to_embed ^= 0; + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed = 3; + for (ii = 0; ii < coeff_count; ii++) { + shuffled_index = ii; + if (shuffled_index % 64 === 0 || coeff[shuffled_index] === 0) + continue; + var cc = coeff[shuffled_index]; + _examined++; + if (cc > 0 && (cc & 1) != next_bit_to_embed) { + coeff[shuffled_index]--; + _changed++; + } else if (cc < 0 && (cc & 1) == next_bit_to_embed) { + coeff[shuffled_index]++; + _changed++; + } + if (coeff[shuffled_index] !== 0) { + _embedded++; + if (available_bits_to_embed === 0) { + if (k != 1 || data_idx >= data.length) break; - end += v; + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; } else { - return true; + _thrown++; + } + } + if (k == 1 && _embedded < data.length * 8) + throw "capacity exceeded " + _embedded / 8 + " " + data.length; + if (k != 1) { + var is_last_byte = false, k_bits_to_embed = 0; + while (!is_last_byte || available_bits_to_embed !== 0 && is_last_byte) { + k_bits_to_embed = 0; + for (i = 0; i < k; i++) { + if (available_bits_to_embed === 0) { + if (data_idx >= data.length) { + is_last_byte = true; + break; + } + byte_to_embed = data[data_idx++]; + byte_to_embed ^= 0; + available_bits_to_embed = 8; + } + next_bit_to_embed = byte_to_embed & 1; + byte_to_embed >>= 1; + available_bits_to_embed--; + k_bits_to_embed |= next_bit_to_embed << i; + } + var code_word = []; + var ci = null; + for (i = 0; i < n; i++) { + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + code_word.push(ci); + } + _examined += n; + while (true) { + var vhash = 0, extracted_bit; + for (i = 0; i < code_word.length; i++) { + if (coeff[code_word[i]] > 0) { + extracted_bit = coeff[code_word[i]] & 1; + } else { + extracted_bit = 1 - (coeff[code_word[i]] & 1); + } + if (extracted_bit == 1) + vhash ^= i + 1; + } + i = vhash ^ k_bits_to_embed; + if (!i) { + _embedded += k; + break; + } + i--; + coeff[code_word[i]] += coeff[code_word[i]] < 0 ? 1 : -1; + _changed++; + if (coeff[code_word[i]] === 0) { + _thrown++; + code_word.splice(i, 1); + while (true) { + if (++ii >= coeff_count) { + throw "capacity exceeded " + _embedded / 8; + } + ci = ii; + if (ci % 64 !== 0 && coeff[ci] !== 0) + break; + } + _examined++; + code_word.push(ci); + } else { + _embedded += k; + break; + } + } } } - if (end >= gif.byteLength) - return; - return false; - }; - var gif_default = { - extract: extract3, - has_embed: has_embed3, - inject: inject3, - match: (fn) => !!fn.match(/\.gif$/) + return { + "k": k, + "embedded": _embedded / 8, + "examined": _examined, + "changed": _changed, + "thrown": _thrown, + "efficiency": (_embedded / _changed).toFixed(2) + }; }; // src/jpg.ts - init_define_BUILD_VERSION(); - init_esbuild_inject(); - var import_buffer6 = __toESM(require_buffer(), 1); - var import_f5stegojs = __toESM(require_f5stego(), 1); var csettings3; settings.subscribe((b) => { csettings3 = b; }); - var convertToPng = async (f) => { - const can = document.createElement("canvas"); - const url = URL.createObjectURL(f); - try { - let dims; - let source; - if (f.type.startsWith("image")) { - const imgElem = document.createElement("img"); - imgElem.src = url; - await new Promise((_) => imgElem.onload = _); - dims = [imgElem.naturalWidth, imgElem.naturalHeight]; - source = imgElem; - } else if (f.type.startsWith("video")) { - const vidElem = document.createElement("video"); - vidElem.src = url; - await new Promise((_) => vidElem.onloadedmetadata = _); - vidElem.currentTime = 0; - await new Promise((_) => vidElem.onloadeddata = _); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - await new Promise(requestAnimationFrame); - dims = [vidElem.videoWidth, vidElem.videoHeight]; - source = vidElem; - } else - return; - can.width = dims[0]; - can.height = dims[1]; - const ctx = can.getContext("2d"); - if (!ctx) - return; - ctx.drawImage(source, 0, 0, dims[0], dims[1]); - const blob = await new Promise((_) => can.toBlob(_, "image/png")); - if (!blob) - return; - return blob; - } finally { - URL.revokeObjectURL(url); - } - }; var key = import_buffer6.Buffer.from("CUNNYCUNNYCUNNY"); - var f5inst = new import_f5stegojs.default(key); - var injectTrue = async (b, links) => { + var f5inst = new f5stego(key); + var inject4 = async (b, links) => { if (b.size / 20 < links.join(" ").length) throw "Image too small to embed."; const arr = new Uint8Array(new Uint8Array(await b.arrayBuffer())); - const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" "))); + const buff = f5inst.embed(arr, new TextEncoder().encode(links.join(" ")), 1); return import_buffer6.Buffer.from(buff); }; - var inject4 = async (b, links) => { - if (csettings3.jpeg) - return injectTrue(b, links); - const pngfile = await convertToPng(b); - if (!pngfile || pngfile.size > 3e3 * 1024) { - throw new Error("Couldn't convert file to PNG: resulting filesize too big."); - } - return pngv3_default.inject(new File([pngfile], b.name), links); - }; var has_embed4 = (b) => { - if (!csettings3.jpeg) - return false; try { const res = f5inst.extract(b); if (!res) - return; + return false; if (res.length > 1024) - return; + return false; const str = import_buffer6.Buffer.from(res).toString(); if (!str.match(/^[a-zA-Z0-9:/.\-_ ]+$/)) - return; + return false; return str; } catch { - return; + return false; } }; var extract4 = (b, ex) => { @@ -21097,7 +21073,7 @@ const _DOMParser = DOMParser; // src/Components/App.svelte function add_css8(target) { - append_styles(target, "svelte-1d9zqg3", '.bepis.svelte-1d9zqg3.svelte-1d9zqg3{max-height:260px;overflow-y:auto}.tagcont.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-1d9zqg3>input[type="text"].svelte-1d9zqg3,label.svelte-1d9zqg3>input[type="number"].svelte-1d9zqg3{width:95%}.content.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column}.error.svelte-1d9zqg3.svelte-1d9zqg3{color:red}hr.svelte-1d9zqg3.svelte-1d9zqg3{width:100%}h1.svelte-1d9zqg3.svelte-1d9zqg3{text-align:center;margin-bottom:0}h4.svelte-1d9zqg3.svelte-1d9zqg3{margin:0}.form.svelte-1d9zqg3.svelte-1d9zqg3{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-1d9zqg3>label.svelte-1d9zqg3{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-1d9zqg3.svelte-1d9zqg3{max-height:300px;overflow-y:scroll}.backpanel.svelte-1d9zqg3.svelte-1d9zqg3{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); + append_styles(target, "svelte-10fwss6", '.bepis.svelte-10fwss6.svelte-10fwss6{max-height:260px;overflow-y:auto}.tagcont.svelte-10fwss6.svelte-10fwss6{display:flex;gap:5px;margin-bottom:10px;flex-wrap:wrap}label.svelte-10fwss6>input[type="text"].svelte-10fwss6,label.svelte-10fwss6>input[type="number"].svelte-10fwss6{width:95%}.content.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column}.error.svelte-10fwss6.svelte-10fwss6{color:red}hr.svelte-10fwss6.svelte-10fwss6{width:100%}h1.svelte-10fwss6.svelte-10fwss6{text-align:center;margin-bottom:0}h4.svelte-10fwss6.svelte-10fwss6{text-align:center;margin:0}.form.svelte-10fwss6.svelte-10fwss6{display:flex;flex-direction:column;gap:20px;position:absolute;padding:15px;border:1px solid white;background-color:black;border-radius:10px}.form.svelte-10fwss6>label.svelte-10fwss6{display:flex;flex-direction:column;gap:10px}.newsbox.svelte-10fwss6.svelte-10fwss6{max-height:300px;overflow-y:scroll}.backpanel.svelte-10fwss6.svelte-10fwss6{position:absolute;right:32px;padding:10px;width:15%;top:32px;border:1px solid;border-radius:5px;background-color:rgba(0, 0, 0, 0.8);pointer-events:all;backdrop-filter:blur(9px);max-height:80vh;min-width:321px}'); } function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); @@ -21161,11 +21137,11 @@ const _DOMParser = DOMParser; hr = element("hr"); t5 = space(); create_component(tabs.$$.fragment); - attr(h1, "class", "svelte-1d9zqg3"); - attr(h4, "class", "svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div0, "class", "content svelte-1d9zqg3"); - attr(div1, "class", "backpanel svelte-1d9zqg3"); + attr(h1, "class", "svelte-10fwss6"); + attr(h4, "class", "svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div0, "class", "content svelte-10fwss6"); + attr(div1, "class", "backpanel svelte-10fwss6"); }, m(target, anchor) { insert(target, div1, anchor); @@ -21571,8 +21547,8 @@ const _DOMParser = DOMParser; if_block1_anchor = empty(); attr(a, "title", "Only requires Search Files permission. See Hydrus docs on where to set this up."); attr(input, "type", "text"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { if (if_block0) @@ -21648,7 +21624,7 @@ const _DOMParser = DOMParser; c() { span = element("span"); t = text(t_value); - attr(span, "class", "error svelte-1d9zqg3"); + attr(span, "class", "error svelte-10fwss6"); }, m(target, anchor) { insert(target, span, anchor); @@ -21685,12 +21661,12 @@ const _DOMParser = DOMParser; input1 = element("input"); set_style(input0, "width", "5ch"); attr(input0, "type", "number"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "placeholder", "Restrict to these tags (space to separate tags, _ to separate words)"); attr(input1, "type", "text"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label0, anchor); @@ -21734,70 +21710,69 @@ const _DOMParser = DOMParser; let label0; let input0; let t0; - let a0; - let t2; + let t1; let label1; let input1; + let t2; let t3; - let t4; let label2; let input2; + let t4; let t5; - let t6; let label3; let input3; + let t6; let t7; - let t8; let label4; let input4; + let t8; let t9; - let t10; let label5; let input5; + let t10; let t11; - let t12; let label6; let input6; + let t12; let t13; - let t14; let label7; let input7; + let t14; let t15; - let t16; let label8; let input8; + let t16; let t17; let t18; - let t19; let label9; let input9; + let t19; let t20; - let t21; let label10; let input10; + let t21; let t22; - let t23; let label11; let input11; + let t23; let t24; - let t25; let label12; let input12; + let t25; let t26; - let t27; let label13; let input13; + let t27; let t28; - let t29; let label14; let input14; - let t30; - let a1; - let t32; + let t29; + let a; + let t31; let label15; let input15; + let t32; let t33; - let t34; let if_block1_anchor; let mounted; let dispose; @@ -21807,80 +21782,77 @@ const _DOMParser = DOMParser; c() { label0 = element("label"); input0 = element("input"); - t0 = text("\n Enable JPGs support (JPG embed and extract)\n "); - a0 = element("a"); - a0.textContent = "?"; - t2 = space(); + t0 = text("\n Disable loading on catalog"); + t1 = space(); label1 = element("label"); input1 = element("input"); - t3 = text("\n Try to load embeds from server cache"); - t4 = space(); + t2 = text("\n Try to load embeds from server cache"); + t3 = space(); label2 = element("label"); input2 = element("input"); - t5 = text("\n Display view counts"); - t6 = space(); + t4 = text("\n Display view counts"); + t5 = space(); label3 = element("label"); input3 = element("input"); - t7 = text("\n Check for new versions at startup."); - t8 = space(); + t6 = text("\n Check for new versions at startup."); + t7 = space(); label4 = element("label"); input4 = element("input"); - t9 = text("\n Autoexpand Images on opening."); - t10 = space(); + t8 = text("\n Autoexpand Images on opening."); + t9 = space(); label5 = element("label"); input5 = element("input"); - t11 = text("\n Autoexpand Videos on opening."); - t12 = space(); + t10 = text("\n Autoexpand Videos on opening."); + t11 = space(); label6 = element("label"); input6 = element("input"); - t13 = text("\n Loop media content."); - t14 = space(); + t12 = text("\n Loop media content."); + t13 = space(); label7 = element("label"); input7 = element("input"); - t15 = text("\n Disable hover preview."); - t16 = space(); + t14 = text("\n Disable hover preview."); + t15 = space(); label8 = element("label"); input8 = element("input"); - t17 = text("\n Hide embedded content behind an eye."); - t18 = space(); + t16 = text("\n Hide embedded content behind an eye."); + t17 = space(); if (if_block0) if_block0.c(); - t19 = space(); + t18 = space(); label9 = element("label"); input9 = element("input"); - t20 = text("\n Preload external files."); - t21 = space(); + t19 = text("\n Preload external files."); + t20 = space(); label10 = element("label"); input10 = element("input"); - t22 = text("\n Preload external files when they are in view."); - t23 = space(); + t21 = text("\n Preload external files when they are in view."); + t22 = space(); label11 = element("label"); input11 = element("input"); - t24 = text("\n Hotlink content."); - t25 = space(); + t23 = text("\n Hotlink content."); + t24 = space(); label12 = element("label"); input12 = element("input"); - t26 = text("\n Control audio on videos with mouse wheel."); - t27 = space(); + t25 = text("\n Control audio on videos with mouse wheel."); + t26 = space(); label13 = element("label"); input13 = element("input"); - t28 = text("\n Show Minimap"); - t29 = space(); + t27 = text("\n Show Minimap"); + t28 = space(); label14 = element("label"); input14 = element("input"); - t30 = text("\n \n Disable embedded file preloading"); - a1 = element("a"); - a1.textContent = "?"; - t32 = space(); + t29 = text("\n \n Disable embedded file preloading"); + a = element("a"); + a.textContent = "?"; + t31 = space(); label15 = element("label"); input15 = element("input"); - t33 = text("\n \n Enable Hydrus Integration"); - t34 = space(); + t32 = text("\n \n Enable Hydrus Integration"); + t33 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); attr(input0, "type", "checkbox"); - attr(a0, "title", "JPG embed detection is relatively slow, heavy, so you might want to also enable server cache loading"); attr(input1, "type", "checkbox"); attr(input2, "type", "checkbox"); attr(input3, "type", "checkbox"); @@ -21895,95 +21867,94 @@ const _DOMParser = DOMParser; attr(input12, "type", "checkbox"); attr(input13, "type", "checkbox"); attr(input14, "type", "checkbox"); - attr(a1, "title", "You might still want to enable 'preload external files'"); + attr(a, "title", "You might still want to enable 'preload external files'"); attr(input15, "type", "checkbox"); }, m(target, anchor) { insert(target, label0, anchor); append(label0, input0); - input0.checked = ctx[7].jpeg; + input0.checked = ctx[7].notcata; append(label0, t0); - append(label0, a0); - insert(target, t2, anchor); + insert(target, t1, anchor); insert(target, label1, anchor); append(label1, input1); input1.checked = ctx[9]; - append(label1, t3); - insert(target, t4, anchor); + append(label1, t2); + insert(target, t3, anchor); insert(target, label2, anchor); append(label2, input2); input2.checked = ctx[7].dvc; - append(label2, t5); - insert(target, t6, anchor); + append(label2, t4); + insert(target, t5, anchor); insert(target, label3, anchor); append(label3, input3); input3.checked = ctx[7].vercheck; - append(label3, t7); - insert(target, t8, anchor); + append(label3, t6); + insert(target, t7, anchor); insert(target, label4, anchor); append(label4, input4); input4.checked = ctx[7].xpi; - append(label4, t9); - insert(target, t10, anchor); + append(label4, t8); + insert(target, t9, anchor); insert(target, label5, anchor); append(label5, input5); input5.checked = ctx[7].xpv; - append(label5, t11); - insert(target, t12, anchor); + append(label5, t10); + insert(target, t11, anchor); insert(target, label6, anchor); append(label6, input6); input6.checked = ctx[7].loop; - append(label6, t13); - insert(target, t14, anchor); + append(label6, t12); + insert(target, t13, anchor); insert(target, label7, anchor); append(label7, input7); input7.checked = ctx[7].dh; - append(label7, t15); - insert(target, t16, anchor); + append(label7, t14); + insert(target, t15, anchor); insert(target, label8, anchor); append(label8, input8); input8.checked = ctx[7].eye; - append(label8, t17); - insert(target, t18, anchor); + append(label8, t16); + insert(target, t17, anchor); if (if_block0) if_block0.m(target, anchor); - insert(target, t19, anchor); + insert(target, t18, anchor); insert(target, label9, anchor); append(label9, input9); input9.checked = ctx[7].pre; - append(label9, t20); - insert(target, t21, anchor); + append(label9, t19); + insert(target, t20, anchor); insert(target, label10, anchor); append(label10, input10); input10.checked = ctx[7].prev; - append(label10, t22); - insert(target, t23, anchor); + append(label10, t21); + insert(target, t22, anchor); insert(target, label11, anchor); append(label11, input11); input11.checked = ctx[7].hotlink; - append(label11, t24); - insert(target, t25, anchor); + append(label11, t23); + insert(target, t24, anchor); insert(target, label12, anchor); append(label12, input12); input12.checked = ctx[7].ca; - append(label12, t26); - insert(target, t27, anchor); + append(label12, t25); + insert(target, t26, anchor); insert(target, label13, anchor); append(label13, input13); input13.checked = ctx[7].sh; - append(label13, t28); - insert(target, t29, anchor); + append(label13, t27); + insert(target, t28, anchor); insert(target, label14, anchor); append(label14, input14); input14.checked = ctx[7].ep; - append(label14, t30); - append(label14, a1); - insert(target, t32, anchor); + append(label14, t29); + append(label14, a); + insert(target, t31, anchor); insert(target, label15, anchor); append(label15, input15); input15.checked = ctx[7].hyd; - append(label15, t33); - insert(target, t34, anchor); + append(label15, t32); + insert(target, t33, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); @@ -22011,7 +21982,7 @@ const _DOMParser = DOMParser; }, p(ctx2, dirty) { if (dirty[0] & 128) { - input0.checked = ctx2[7].jpeg; + input0.checked = ctx2[7].notcata; } if (dirty[0] & 512) { input1.checked = ctx2[9]; @@ -22043,7 +22014,7 @@ const _DOMParser = DOMParser; } else { if_block0 = create_if_block_10(ctx2); if_block0.c(); - if_block0.m(t19.parentNode, t19); + if_block0.m(t18.parentNode, t18); } } else if (if_block0) { if_block0.d(1); @@ -22087,71 +22058,71 @@ const _DOMParser = DOMParser; if (detaching) detach(label0); if (detaching) - detach(t2); + detach(t1); if (detaching) detach(label1); if (detaching) - detach(t4); + detach(t3); if (detaching) detach(label2); if (detaching) - detach(t6); + detach(t5); if (detaching) detach(label3); if (detaching) - detach(t8); + detach(t7); if (detaching) detach(label4); if (detaching) - detach(t10); + detach(t9); if (detaching) detach(label5); if (detaching) - detach(t12); + detach(t11); if (detaching) detach(label6); if (detaching) - detach(t14); + detach(t13); if (detaching) detach(label7); if (detaching) - detach(t16); + detach(t15); if (detaching) detach(label8); if (detaching) - detach(t18); + detach(t17); if (if_block0) if_block0.d(detaching); if (detaching) - detach(t19); + detach(t18); if (detaching) detach(label9); if (detaching) - detach(t21); + detach(t20); if (detaching) detach(label10); if (detaching) - detach(t23); + detach(t22); if (detaching) detach(label11); if (detaching) - detach(t25); + detach(t24); if (detaching) detach(label12); if (detaching) - detach(t27); + detach(t26); if (detaching) detach(label13); if (detaching) - detach(t29); + detach(t28); if (detaching) detach(label14); if (detaching) - detach(t32); + detach(t31); if (detaching) detach(label15); if (detaching) - detach(t34); + detach(t33); if (if_block1) if_block1.d(detaching); if (detaching) @@ -22247,9 +22218,9 @@ const _DOMParser = DOMParser; t13 = space(); input1 = element("input"); attr(input0, "type", "checkbox"); - attr(div0, "class", "tagcont svelte-1d9zqg3"); - attr(hr, "class", "svelte-1d9zqg3"); - attr(div1, "class", "tagcont svelte-1d9zqg3"); + attr(div0, "class", "tagcont svelte-10fwss6"); + attr(hr, "class", "svelte-10fwss6"); + attr(div1, "class", "tagcont svelte-10fwss6"); attr(input1, "placeholder", "Press enter after typing your tag"); }, m(target, anchor) { @@ -22459,9 +22430,9 @@ const _DOMParser = DOMParser; a = element("a"); a.textContent = "?"; attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); attr(a, "title", "Higher will filter more potentially different images, lower will let more identical images through"); - attr(label, "class", "svelte-1d9zqg3"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, label, anchor); @@ -22600,21 +22571,21 @@ const _DOMParser = DOMParser; button.textContent = "Add"; attr(input0, "type", "text"); attr(input0, "placeholder", "Safebooru"); - attr(input0, "class", "svelte-1d9zqg3"); - attr(label0, "class", "svelte-1d9zqg3"); + attr(input0, "class", "svelte-10fwss6"); + attr(label0, "class", "svelte-10fwss6"); attr(input1, "type", "text"); attr(input1, "placeholder", "safebooru.com"); - attr(input1, "class", "svelte-1d9zqg3"); - attr(label1, "class", "svelte-1d9zqg3"); + attr(input1, "class", "svelte-10fwss6"); + attr(label1, "class", "svelte-10fwss6"); attr(input2, "type", "text"); attr(input2, "placeholder", "/post.json?tags=md5:"); - attr(input2, "class", "svelte-1d9zqg3"); - attr(label2, "class", "svelte-1d9zqg3"); + attr(input2, "class", "svelte-10fwss6"); + attr(label2, "class", "svelte-10fwss6"); attr(input3, "type", "text"); attr(input3, "placeholder", "https://safebooru.com/post/show/"); - attr(input3, "class", "svelte-1d9zqg3"); - attr(label3, "class", "svelte-1d9zqg3"); - attr(div, "class", "form svelte-1d9zqg3"); + attr(input3, "class", "svelte-10fwss6"); + attr(label3, "class", "svelte-10fwss6"); + attr(div, "class", "form svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -22848,8 +22819,8 @@ const _DOMParser = DOMParser; if (ctx[7].fhost === void 0) add_render_callback(() => ctx[54].call(select)); attr(input, "type", "number"); - attr(input, "class", "svelte-1d9zqg3"); - attr(label, "class", "svelte-1d9zqg3"); + attr(input, "class", "svelte-10fwss6"); + attr(label, "class", "svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -22950,7 +22921,7 @@ const _DOMParser = DOMParser; for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(div, "class", "bepis svelte-1d9zqg3"); + attr(div, "class", "bepis svelte-10fwss6"); }, m(target, anchor) { insert(target, div, anchor); @@ -23238,7 +23209,7 @@ const _DOMParser = DOMParser; t2 = space(); div = element("div"); if_block.c(); - attr(div, "class", "newsbox svelte-1d9zqg3"); + attr(div, "class", "newsbox svelte-10fwss6"); }, m(target, anchor) { insert(target, p, anchor); @@ -23643,7 +23614,7 @@ const _DOMParser = DOMParser; const select_handler = () => updateThreads(); const select_handler_1 = () => updateNews(); function input0_change_handler() { - $settings.jpeg = this.checked; + $settings.notcata = this.checked; settings.set($settings); } function input1_change_handler() { @@ -26860,22 +26831,26 @@ Use the WebExtension version of PEE if you want to use b4k!`); qr.files = dt.files; }); } - const mo = new MutationObserver((reco) => { - for (const rec of reco) - if (rec.type == "childList") - rec.addedNodes.forEach((e) => { - if (!(e instanceof HTMLElement)) - return; - let el = qp.postsWithFiles(e); - if (!el && e.classList.contains("postContainer")) - el = [e]; - if (el) - [...el].map((el2) => processPost(el2)); - }); - }); - document.querySelectorAll(".board").forEach((e) => { - mo.observe(e, { childList: true, subtree: true }); - }); + if (!cappState.isCatalog) { + const mo = new MutationObserver((reco) => { + for (const rec of reco) + if (rec.type == "childList") + rec.addedNodes.forEach((e) => { + if (!(e instanceof HTMLElement)) + return; + if (cappState.isCatalog && csettings6.notcata) + return; + let el = qp.postsWithFiles(e); + if (!el && e.classList.contains("postContainer")) + el = [e]; + if (el) + [...el].map((el2) => processPost(el2)); + }); + }); + document.querySelectorAll(".board").forEach((e) => { + mo.observe(e, { childList: true, subtree: true }); + }); + } if (!document.body) { let bodyRes; const bodyInit = new Promise((r) => bodyRes = r); @@ -26925,6 +26900,8 @@ Use the WebExtension version of PEE if you want to use b4k!`); button2.onclick = () => scrapeBoard(button2); opts.insertAdjacentElement("beforebegin", button2); } + if (csettings6.notcata) + return; } const n = 7; const range = ~~(posts.length / n) + 1; diff --git a/pngextraembedder-0.273.xpi b/pngextraembedder-0.273.xpi new file mode 100644 index 0000000..af8256e Binary files /dev/null and b/pngextraembedder-0.273.xpi differ diff --git a/src/Components/App.svelte b/src/Components/App.svelte index 339d921..ff64ec4 100644 --- a/src/Components/App.svelte +++ b/src/Components/App.svelte @@ -125,12 +125,8 @@