{"version":3,"file":"pica.mjs","names":[],"sources":["../../multimath/lib/base64decode.mjs","../../multimath/lib/wa_detect.mjs","../../multimath/lib/multimath.mjs","../node_modules/glur/lib/blur_mono16.mjs","../src/mm_unsharp_mask/unsharp_mask.ts","../src/mm_unsharp_mask/unsharp_mask_wasm.ts","../src/mm_unsharp_mask/unsharp_mask_wasm_base64.ts","../src/mm_unsharp_mask/index.ts","../src/mm_resize/resize_filter_info.ts","../src/mm_resize/resize_filter_gen.ts","../src/mm_resize/convolve.ts","../src/mm_resize/resize.ts","../src/mm_resize/resize_wasm.ts","../src/mm_resize/convolve_wasm_base64.ts","../src/mm_resize/index.ts","../src/mathlib.ts","../src/pool.ts","../src/utils.ts","../src/stepper.ts","../src/tiler.ts","../src/supported_features.ts","../src/pica_main.ts"],"sourcesContent":["// base64 decode str -> Uint8Array, to load WA modules\n//\nconst BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nexport default function base64decode (str) {\n  const input = str.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n    max = input.length\n\n  const out = new Uint8Array((max * 3) >> 2)\n\n  // Collect by 6*4 bits (3 bytes)\n\n  let bits = 0\n  let ptr = 0\n\n  for (let idx = 0; idx < max; idx++) {\n    if ((idx % 4 === 0) && idx) {\n      out[ptr++] = (bits >> 16) & 0xFF\n      out[ptr++] = (bits >> 8) & 0xFF\n      out[ptr++] = bits & 0xFF\n    }\n\n    bits = (bits << 6) | BASE64_MAP.indexOf(input.charAt(idx))\n  }\n\n  // Dump tail\n\n  const tailbits = (max % 4) * 6\n\n  if (tailbits === 0) {\n    out[ptr++] = (bits >> 16) & 0xFF\n    out[ptr++] = (bits >> 8) & 0xFF\n    out[ptr++] = bits & 0xFF\n  } else if (tailbits === 18) {\n    out[ptr++] = (bits >> 10) & 0xFF\n    out[ptr++] = (bits >> 2) & 0xFF\n  } else if (tailbits === 12) {\n    out[ptr++] = (bits >> 4) & 0xFF\n  }\n\n  return out\n}\n","// Detect WebAssembly support.\n// - Check global WebAssembly object\n// - Try to load simple module (can be disabled via CSP)\n//\nlet wa\n\nexport default function hasWebAssembly () {\n  // use cache if called before;\n  if (typeof wa !== 'undefined') return wa\n\n  wa = false\n\n  if (typeof WebAssembly === 'undefined') return wa\n\n  // If WebAssenbly is disabled, code can throw on compile\n  try {\n    // https://github.com/brion/min-wasm-fail/blob/master/min-wasm-fail.in.js\n    // Additional check that WA internals are correct\n\n    const bin = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 6, 1, 96, 1, 127, 1, 127, 3, 2, 1, 0, 5, 3, 1, 0, 1, 7, 8, 1, 4, 116, 101, 115, 116, 0, 0, 10, 16, 1, 14, 0, 32, 0, 65, 1, 54, 2, 0, 32, 0, 40, 2, 0, 11])\n    const module = new WebAssembly.Module(bin)\n    const instance = new WebAssembly.Instance(module, {})\n\n    // test storing to and loading from a non-zero location via a parameter.\n    // Safari on iOS 11.2.5 returns 0 unexpectedly at non-zero locations\n    if (instance.exports.test(4) !== 0) wa = true\n\n    return wa\n  } catch (__) {}\n\n  return wa\n}\n","import base64decode from './base64decode.mjs'\nimport hasWebAssembly from './wa_detect.mjs'\n\nconst DEFAULT_OPTIONS = {\n  js: true,\n  wasm: true\n}\n\nclass MultiMath {\n  constructor (options) {\n    const opts = Object.assign({}, DEFAULT_OPTIONS, options || {})\n\n    this.options = opts\n\n    this.__cache = {}\n\n    this.__init_promise = null\n    this.__modules = opts.modules || {}\n    this.__memory = null\n    this.__wasm = {}\n\n    this.__isLE = ((new Uint32Array((new Uint8Array([1, 0, 0, 0])).buffer))[0] === 1)\n\n    if (!this.options.js && !this.options.wasm) {\n      throw new Error('mathlib: at least \"js\" or \"wasm\" should be enabled')\n    }\n  }\n\n  has_wasm () { return hasWebAssembly() }\n\n  use (module) {\n    this.__modules[module.name] = module\n\n    // Pin the best possible implementation\n    if (this.options.wasm && this.has_wasm() && module.wasm_fn) {\n      this[module.name] = module.wasm_fn\n    } else {\n      this[module.name] = module.fn\n    }\n\n    return this\n  }\n\n  init () {\n    if (this.__init_promise) return this.__init_promise\n\n    if (!this.options.js && this.options.wasm && !this.has_wasm()) {\n      return Promise.reject(new Error('mathlib: only \"wasm\" was enabled, but it\\'s not supported'))\n    }\n\n    this.__init_promise = Promise.all(Object.keys(this.__modules).map(name => {\n      const module = this.__modules[name]\n\n      if (!this.options.wasm || !this.has_wasm() || !module.wasm_fn) return null\n\n      // If already compiled - exit\n      if (this.__wasm[name]) return null\n\n      // Compile wasm source\n      return WebAssembly.compile(base64decode(module.wasm_src))\n        .then(m => { this.__wasm[name] = m })\n    }))\n      .then(() => this)\n\n    return this.__init_promise\n  }\n\n  // //////////////////////////////////////////////////////////////////////////////\n  // Methods below are for internal use from plugins\n\n  // Increase current memory to include specified number of bytes. Do nothing if\n  // size is already ok. You probably don't need to call this method directly,\n  // because it will be invoked from `.__instance()`.\n  //\n  __reallocate (bytes) {\n    if (!this.__memory) {\n      this.__memory = new WebAssembly.Memory({\n        initial: Math.ceil(bytes / (64 * 1024))\n      })\n      return this.__memory\n    }\n\n    const mem_size = this.__memory.buffer.byteLength\n\n    if (mem_size < bytes) {\n      this.__memory.grow(Math.ceil((bytes - mem_size) / (64 * 1024)))\n    }\n\n    return this.__memory\n  }\n\n  // Returns instantinated webassembly item by name, with specified memory size\n  // and environment.\n  // - use cache if available\n  // - do sync module init, if async init was not called earlier\n  // - allocate memory if not enougth\n  // - can export functions to webassembly via \"env_extra\",\n  //   for example, { exp: Math.exp }\n  //\n  __instance (name, memsize, env_extra) {\n    if (memsize) this.__reallocate(memsize)\n\n    // If .init() was not called, do sync compile\n    if (!this.__wasm[name]) {\n      const module = this.__modules[name]\n      this.__wasm[name] = new WebAssembly.Module(base64decode(module.wasm_src))\n    }\n\n    if (!this.__cache[name]) {\n      const env_base = {\n        memoryBase: 0,\n        memory: this.__memory,\n        tableBase: 0,\n        table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })\n      }\n\n      this.__cache[name] = new WebAssembly.Instance(this.__wasm[name], {\n        env: Object.assign(env_base, env_extra || {})\n      })\n    }\n\n    return this.__cache[name]\n  }\n\n  // Helper to calculate memory aligh for pointers. Webassembly does not require\n  // this, but you may wish to experiment. Default base = 8;\n  //\n  __align (number, base) {\n    base = base || 8\n    const reminder = number % base\n    return number + (reminder ? base - reminder : 0)\n  }\n}\n\nexport default MultiMath\n","// Calculate Gaussian blur of an image using IIR filter\n// The method is taken from Intel's white paper and code example attached to it:\n// https://software.intel.com/en-us/articles/iir-gaussian-blur-filter\n// -implementation-using-intel-advanced-vector-extensions\n\nfunction gaussCoef (sigma) {\n  if (sigma < 0.5) {\n    sigma = 0.5\n  }\n\n  const a = Math.exp(0.726 * 0.726) / sigma,\n    g1 = Math.exp(-a),\n    g2 = Math.exp(-2 * a),\n    k = (1 - g1) * (1 - g1) / (1 + 2 * a * g1 - g2)\n\n  const a0 = k\n  const a1 = k * (a - 1) * g1\n  const a2 = k * (a + 1) * g1\n  const a3 = -k * g2\n  const b1 = 2 * g1\n  const b2 = -g2\n  const left_corner = (a0 + a1) / (1 - b1 - b2)\n  const right_corner = (a2 + a3) / (1 - b1 - b2)\n\n  // Attempt to force type to FP32.\n  return new Float32Array([a0, a1, a2, a3, b1, b2, left_corner, right_corner])\n}\n\nfunction convolveMono16 (src, out, line, coeff, width, height) {\n  // takes src image and writes the blurred and transposed result into out\n\n  let prev_src, curr_src, curr_out, prev_out, prev_prev_out\n  let src_index, out_index, line_index\n  let i, j\n  let coeff_a0, coeff_a1, coeff_b1, coeff_b2\n\n  for (i = 0; i < height; i++) {\n    src_index = i * width\n    out_index = i\n    line_index = 0\n\n    // left to right\n    prev_src = src[src_index]\n    prev_prev_out = prev_src * coeff[6]\n    prev_out = prev_prev_out\n\n    coeff_a0 = coeff[0]\n    coeff_a1 = coeff[1]\n    coeff_b1 = coeff[4]\n    coeff_b2 = coeff[5]\n\n    for (j = 0; j < width; j++) {\n      curr_src = src[src_index]\n\n      curr_out = curr_src * coeff_a0 +\n                 prev_src * coeff_a1 +\n                 prev_out * coeff_b1 +\n                 prev_prev_out * coeff_b2\n\n      prev_prev_out = prev_out\n      prev_out = curr_out\n      prev_src = curr_src\n\n      line[line_index] = prev_out\n      line_index++\n      src_index++\n    }\n\n    src_index--\n    line_index--\n    out_index += height * (width - 1)\n\n    // right to left\n    prev_src = src[src_index]\n    prev_prev_out = prev_src * coeff[7]\n    prev_out = prev_prev_out\n    curr_src = prev_src\n\n    coeff_a0 = coeff[2]\n    coeff_a1 = coeff[3]\n\n    for (j = width - 1; j >= 0; j--) {\n      curr_out = curr_src * coeff_a0 +\n                 prev_src * coeff_a1 +\n                 prev_out * coeff_b1 +\n                 prev_prev_out * coeff_b2\n\n      prev_prev_out = prev_out\n      prev_out = curr_out\n\n      prev_src = curr_src\n      curr_src = src[src_index]\n\n      out[out_index] = line[line_index] + prev_out\n\n      src_index--\n      line_index--\n      out_index -= height\n    }\n  }\n}\n\nfunction blurMono16 (src, width, height, radius) {\n  // Quick exit on zero radius\n  if (!radius) { return }\n\n  const out = new Uint16Array(src.length),\n    tmp_line = new Float32Array(Math.max(width, height))\n\n  const coeff = gaussCoef(radius)\n\n  convolveMono16(src, out, tmp_line, coeff, width, height, radius)\n  convolveMono16(out, src, tmp_line, coeff, height, width, radius)\n}\n\nexport default blurMono16\n","// Unsharp mask filter\n//\n// http://stackoverflow.com/a/23322820/1031804\n// USM(O) = O + (2 * (Amount / 100) * (O - GB))\n// GB - gaussian blur.\n//\n// Image is converted from RGB to HSV, unsharp mask is applied to the\n// brightness channel and then image is converted back to RGB.\n//\nimport { blurMono16 } from 'glur'\nimport type { MathImageBuffer } from '../mathlib'\n\nfunction hsv_v16 (img: MathImageBuffer, width: number, height: number): Uint16Array {\n  const size = width * height\n  const out = new Uint16Array(size)\n  let r, g, b, max\n  for (let i = 0; i < size; i++) {\n    r = img[4 * i]\n    g = img[4 * i + 1]\n    b = img[4 * i + 2]\n    max = (r >= g && r >= b) ? r : (g >= b && g >= r) ? g : b\n    out[i] = max << 8\n  }\n  return out\n}\n\nexport default function unsharp (\n  img: MathImageBuffer,\n  width: number,\n  height: number,\n  amount: number,\n  radius: number,\n  threshold: number\n): void {\n  let v1, v2, vmul\n  let diff, iTimes4\n\n  if (amount === 0 || radius < 0.5) {\n    return\n  }\n  if (radius > 2.0) {\n    radius = 2.0\n  }\n\n  const brightness = hsv_v16(img, width, height)\n\n  const blured = new Uint16Array(brightness) // copy, because blur modifies src\n\n  blurMono16(blured, width, height, radius)\n\n  const amountFp = (amount / 100 * 0x1000 + 0.5)|0\n  const thresholdFp = threshold << 8\n\n  const size = width * height\n\n  for (let i = 0; i < size; i++) {\n    v1 = brightness[i]\n    diff = v1 - blured[i]\n\n    if (Math.abs(diff) >= thresholdFp) {\n      // add unsharp mask to the brightness channel\n      v2 = v1 + ((amountFp * diff + 0x800) >> 12)\n\n      // Both v1 and v2 are within [0.0 .. 255.0] (0000-FF00) range, never going into\n      // [255.003 .. 255.996] (FF01-FFFF). This allows to round this value as (x+.5)|0\n      // later without overflowing.\n      v2 = v2 > 0xff00 ? 0xff00 : v2\n      v2 = v2 < 0x0000 ? 0x0000 : v2\n\n      // Avoid division by 0. V=0 means rgb(0,0,0), unsharp with unsharpAmount>0 cannot\n      // change this value (because diff between colors gets inflated), so no need to verify correctness.\n      v1 = v1 !== 0 ? v1 : 1\n\n      // Multiplying V in HSV model by a constant is equivalent to multiplying each component\n      // in RGB by the same constant (same for HSL), see also:\n      // https://beesbuzz.biz/code/16-hsv-color-transforms\n      vmul = ((v2 << 12) / v1)|0\n\n      // Result will be in [0..255] range because:\n      //  - all numbers are positive\n      //  - r,g,b <= (v1/256)\n      //  - r,g,b,(v1/256),(v2/256) <= 255\n      // So highest this number can get is X*255/X+0.5=255.5 which is < 256 and rounds down.\n\n      iTimes4 = i * 4\n      img[iTimes4] = (img[iTimes4] * vmul + 0x800) >> 12 // R\n      img[iTimes4 + 1] = (img[iTimes4 + 1] * vmul + 0x800) >> 12 // G\n      img[iTimes4 + 2] = (img[iTimes4 + 2] * vmul + 0x800) >> 12 // B\n    }\n  }\n}\n","import type { MathWasmContext, MathImageBuffer } from '../mathlib'\n\nexport default function unsharp (\n  this: MathWasmContext,\n  img: MathImageBuffer,\n  width: number,\n  height: number,\n  amount: number,\n  radius: number,\n  threshold: number\n): void {\n  if (amount === 0 || radius < 0.5) {\n    return\n  }\n\n  if (radius > 2.0) {\n    radius = 2.0\n  }\n\n  const pixels = width * height\n\n  const img_bytes_cnt = pixels * 4\n  const hsv_bytes_cnt = pixels * 2\n  const blur_bytes_cnt = pixels * 2\n  const blur_line_byte_cnt = Math.max(width, height) * 4 // float32 array\n  const blur_coeffs_byte_cnt = 8 * 4 // float32 array\n\n  const img_offset = 0\n  const hsv_offset = img_bytes_cnt\n  const blur_offset = hsv_offset + hsv_bytes_cnt\n  const blur_tmp_offset = blur_offset + blur_bytes_cnt\n  const blur_line_offset = blur_tmp_offset + blur_bytes_cnt\n  const blur_coeffs_offset = blur_line_offset + blur_line_byte_cnt\n\n  const instance = this.__instance(\n    'unsharp_mask',\n    img_bytes_cnt + hsv_bytes_cnt + blur_bytes_cnt * 2 + blur_line_byte_cnt + blur_coeffs_byte_cnt,\n    { exp: Math.exp }\n  )\n\n  // 32-bit copy is much faster in chrome\n  const img32 = new Uint32Array(img.buffer)\n  const mem32 = new Uint32Array(this.__memory!.buffer)\n  mem32.set(img32)\n\n  // HSL\n  let fn = (instance.exports.hsv_v16 || instance.exports._hsv_v16) as Function | undefined\n  if (!fn) throw new Error('WASM hsv_v16 function is not available')\n  fn(img_offset, hsv_offset, width, height)\n\n  // BLUR\n  fn = (instance.exports.blurMono16 || instance.exports._blurMono16) as Function | undefined\n  if (!fn) throw new Error('WASM blurMono16 function is not available')\n  fn(hsv_offset, blur_offset, blur_tmp_offset,\n    blur_line_offset, blur_coeffs_offset, width, height, radius)\n\n  // UNSHARP\n  fn = (instance.exports.unsharp || instance.exports._unsharp) as Function | undefined\n  if (!fn) throw new Error('WASM unsharp function is not available')\n  fn(img_offset, img_offset, hsv_offset,\n    blur_offset, width, height, amount, threshold)\n\n  // 32-bit copy is much faster in chrome\n  img32.set(new Uint32Array(this.__memory!.buffer, 0, pixels))\n}\n","// This is autogenerated file from math.wasm, don't edit.\n//\nexport default 'AGFzbQEAAAAADAZkeWxpbmsAAAAAAAE0B2AAAGAEf39/fwBgBn9/f39/fwBgCH9/f39/f39/AGAIf39/f39/f30AYAJ9fwBgAXwBfAIZAgNlbnYDZXhwAAYDZW52Bm1lbW9yeQIAAAMHBgAFAgQBAwYGAX8AQQALB4oBCBFfX3dhc21fY2FsbF9jdG9ycwABFl9fYnVpbGRfZ2F1c3NpYW5fY29lZnMAAg5fX2dhdXNzMTZfbGluZQADCmJsdXJNb25vMTYABAdoc3ZfdjE2AAUHdW5zaGFycAAGDF9fZHNvX2hhbmRsZQMAGF9fd2FzbV9hcHBseV9kYXRhX3JlbG9jcwABCsUMBgMAAQvWAQEHfCABRNuGukOCGvs/IAC7oyICRAAAAAAAAADAohAAIgW2jDgCFCABIAKaEAAiAyADoCIGtjgCECABRAAAAAAAAPA/IAOhIgQgBKIgAyACIAKgokQAAAAAAADwP6AgBaGjIgS2OAIAIAEgBSAEmqIiB7Y4AgwgASADIAJEAAAAAAAA8D+gIASioiIItjgCCCABIAMgAkQAAAAAAADwv6AgBKKiIgK2OAIEIAEgByAIoCAFRAAAAAAAAPA/IAahoCIDo7Y4AhwgASAEIAKgIAOjtjgCGAuGBQMGfwl8An0gAyoCDCEVIAMqAgghFiADKgIUuyERIAMqAhC7IRACQCAEQQFrIghBAEgiCQRAIAIhByAAIQYMAQsgAiAALwEAuCIPIAMqAhi7oiIMIBGiIg0gDCAQoiAPIAMqAgS7IhOiIhQgAyoCALsiEiAPoqCgoCIOtjgCACACQQRqIQcgAEECaiEGIAhFDQAgCEEBIAhBAUgbIgpBf3MhCwJ/IAQgCmtBAXFFBEAgDiENIAgMAQsgAiANIA4gEKIgFCASIAAvAQK4Ig+ioKCgIg22OAIEIAJBCGohByAAQQRqIQYgDiEMIARBAmsLIQIgC0EAIARrRg0AA0AgByAMIBGiIA0gEKIgDyAToiASIAYvAQC4Ig6ioKCgIgy2OAIAIAcgDSARoiAMIBCiIA4gE6IgEiAGLwECuCIPoqCgoCINtjgCBCAHQQhqIQcgBkEEaiEGIAJBAkohACACQQJrIQIgAA0ACwsCQCAJDQAgASAFIAhsQQF0aiIAAn8gBkECay8BACICuCINIBW7IhKiIA0gFrsiE6KgIA0gAyoCHLuiIgwgEKKgIAwgEaKgIg8gB0EEayIHKgIAu6AiDkQAAAAAAADwQWMgDkQAAAAAAAAAAGZxBEAgDqsMAQtBAAs7AQAgCEUNACAGQQRrIQZBACAFa0EBdCEBA0ACfyANIBKiIAJB//8DcbgiDSAToqAgDyIOIBCioCAMIBGioCIPIAdBBGsiByoCALugIgxEAAAAAAAA8EFjIAxEAAAAAAAAAABmcQRAIAyrDAELQQALIQMgBi8BACECIAAgAWoiACADOwEAIAZBAmshBiAIQQFKIQMgDiEMIAhBAWshCCADDQALCwvRAgIBfwd8AkAgB0MAAAAAWw0AIARE24a6Q4Ia+z8gB0MAAAA/l7ujIglEAAAAAAAAAMCiEAAiDLaMOAIUIAQgCZoQACIKIAqgIg22OAIQIAREAAAAAAAA8D8gCqEiCyALoiAKIAkgCaCiRAAAAAAAAPA/oCAMoaMiC7Y4AgAgBCAMIAuaoiIOtjgCDCAEIAogCUQAAAAAAADwP6AgC6KiIg+2OAIIIAQgCiAJRAAAAAAAAPC/oCALoqIiCbY4AgQgBCAOIA+gIAxEAAAAAAAA8D8gDaGgIgqjtjgCHCAEIAsgCaAgCqO2OAIYIAYEQANAIAAgBSAIbEEBdGogAiAIQQF0aiADIAQgBSAGEAMgCEEBaiIIIAZHDQALCyAFRQ0AQQAhCANAIAIgBiAIbEEBdGogASAIQQF0aiADIAQgBiAFEAMgCEEBaiIIIAVHDQALCwtxAQN/IAIgA2wiBQRAA0AgASAAKAIAIgRBEHZB/wFxIgIgAiAEQQh2Qf8BcSIDIAMgBEH/AXEiBEkbIAIgA0sbIgYgBiAEIAIgBEsbIAMgBEsbQQh0OwEAIAFBAmohASAAQQRqIQAgBUEBayIFDQALCwuZAgIDfwF8IAQgBWwhBAJ/IAazQwAAgEWUQwAAyEKVu0QAAAAAAADgP6AiC5lEAAAAAAAA4EFjBEAgC6oMAQtBgICAgHgLIQUgBARAIAdBCHQhCUEAIQYDQCAJIAIgBkEBdCIHai8BACIBIAMgB2ovAQBrIgcgB0EfdSIIaiAIc00EQCAAIAZBAnQiCGoiCiAFIAdsQYAQakEMdSABaiIHQYD+AyAHQYD+A0gbIgdBACAHQQBKG0EMdCABQQEgARtuIgEgCi0AAGxBgBBqQQx2OgAAIAAgCEEBcmoiByABIActAABsQYAQakEMdjoAACAAIAhBAnJqIgcgASAHLQAAbEGAEGpBDHY6AAALIAZBAWoiBiAERw0ACwsL'\n","import fn from './unsharp_mask'\nimport wasm_fn from './unsharp_mask_wasm'\nimport wasm_src from './unsharp_mask_wasm_base64'\n\nexport default {\n  name: 'unsharp_mask' as const,\n  fn,\n  wasm_fn,\n  wasm_src\n}\n","import type { MathResizeFilter } from '../mathlib'\n\n// Filter definitions to build tables for\n// resizing convolvers.\n//\n// Presets for quality 0..3. Filter functions + window size\n//\nexport interface FilterInfo {\n  win: number\n  fn: (x: number) => number\n}\n\nconst filter: Record<MathResizeFilter, FilterInfo> = {\n  // Nearest neighbor\n  box: {\n    win: 0.5,\n    fn (x: number) {\n      if (x < 0) x = -x\n      return (x < 0.5) ? 1.0 : 0.0\n    }\n  },\n  // // Hamming\n  hamming: {\n    win: 1.0,\n    fn (x: number) {\n      if (x < 0) x = -x\n      if (x >= 1.0) { return 0.0 }\n      if (x < 1.19209290E-07) { return 1.0 }\n      const xpi = x * Math.PI\n      return ((Math.sin(xpi) / xpi) * (0.54 + 0.46 * Math.cos(xpi / 1.0)))\n    }\n  },\n  // Lanczos, win = 2\n  lanczos2: {\n    win: 2.0,\n    fn (x: number) {\n      if (x < 0) x = -x\n      if (x >= 2.0) { return 0.0 }\n      if (x < 1.19209290E-07) { return 1.0 }\n      const xpi = x * Math.PI\n      return (Math.sin(xpi) / xpi) * Math.sin(xpi / 2.0) / (xpi / 2.0)\n    }\n  },\n  // Lanczos, win = 3\n  lanczos3: {\n    win: 3.0,\n    fn (x: number) {\n      if (x < 0) x = -x\n      if (x >= 3.0) { return 0.0 }\n      if (x < 1.19209290E-07) { return 1.0 }\n      const xpi = x * Math.PI\n      return (Math.sin(xpi) / xpi) * Math.sin(xpi / 3.0) / (xpi / 3.0)\n    }\n  },\n  // Magic Kernel Sharp 2013, win = 2.5\n  // http://johncostella.com/magic/\n  mks2013: {\n    win: 2.5,\n    fn (x: number) {\n      if (x < 0) x = -x\n      if (x >= 2.5) { return 0.0 }\n      if (x >= 1.5) { return -0.125 * (x - 2.5) * (x - 2.5) }\n      if (x >= 0.5) { return 0.25 * (4 * x * x - 11 * x + 7) }\n      return 1.0625 - 1.75 * x * x\n    }\n  }\n}\n\nexport default {\n  filter\n}\n","// Calculate convolution filters for each destination point,\n// and pack data to Int16Array:\n//\n// [ shift, length, data..., shift2, length2, data..., ... ]\n//\n// - shift - offset in src image\n// - length - filter length (in src points)\n// - data - filter values sequence\n//\nimport FILTER_INFO from './resize_filter_info'\nimport type { MathResizeFilter } from '../mathlib'\n\n// Precision of fixed FP values\nconst FIXED_FRAC_BITS = 14\n\nfunction toFixedPoint (num: number): number {\n  return Math.round(num * ((1 << FIXED_FRAC_BITS) - 1))\n}\n\nexport default function resizeFilterGen (\n  filter: MathResizeFilter,\n  srcSize: number,\n  destSize: number,\n  scale: number,\n  offset: number\n): Int16Array {\n  const filterFunction = FILTER_INFO.filter[filter].fn\n\n  const scaleInverted = 1.0 / scale\n  const scaleClamped = Math.min(1.0, scale) // For upscale\n\n  // Filter window (averaging interval), scaled to src image\n  const srcWindow = FILTER_INFO.filter[filter].win / scaleClamped\n\n  let destPixel, srcPixel, srcFirst, srcLast, filterElementSize,\n    floatFilter, fxpFilter, total, pxl, idx, floatVal, filterTotal, filterVal\n  let leftNotEmpty, rightNotEmpty, filterShift, filterSize\n\n  const maxFilterElementSize = Math.floor((srcWindow + 1) * 2)\n  const packedFilter = new Int16Array((maxFilterElementSize + 2) * destSize)\n  let packedFilterPtr = 0\n\n  const slowCopy = !packedFilter.subarray || !packedFilter.set\n\n  // For each destination pixel calculate source range and built filter values\n  for (destPixel = 0; destPixel < destSize; destPixel++) {\n    // Scaling should be done relative to central pixel point\n    srcPixel = (destPixel + 0.5) * scaleInverted + offset\n\n    srcFirst = Math.max(0, Math.floor(srcPixel - srcWindow))\n    srcLast = Math.min(srcSize - 1, Math.ceil(srcPixel + srcWindow))\n\n    filterElementSize = srcLast - srcFirst + 1\n    floatFilter = new Float32Array(filterElementSize)\n    fxpFilter = new Int16Array(filterElementSize)\n\n    total = 0.0\n\n    // Fill filter values for calculated range\n    for (pxl = srcFirst, idx = 0; pxl <= srcLast; pxl++, idx++) {\n      floatVal = filterFunction(((pxl + 0.5) - srcPixel) * scaleClamped)\n      total += floatVal\n      floatFilter[idx] = floatVal\n    }\n\n    // Normalize filter, convert to fixed point and accumulate conversion error\n    filterTotal = 0\n\n    for (idx = 0; idx < floatFilter.length; idx++) {\n      filterVal = floatFilter[idx] / total\n      filterTotal += filterVal\n      fxpFilter[idx] = toFixedPoint(filterVal)\n    }\n\n    // Compensate normalization error, to minimize brightness drift\n    fxpFilter[destSize >> 1] += toFixedPoint(1.0 - filterTotal)\n\n    //\n    // Now pack filter to useable form\n    //\n    // 1. Trim leading and trailing zero values, and compensate shift/length\n    // 2. Put all to single array in this format:\n    //\n    //    [ pos shift, data length, value1, value2, value3, ... ]\n    //\n\n    leftNotEmpty = 0\n    while (leftNotEmpty < fxpFilter.length && fxpFilter[leftNotEmpty] === 0) {\n      leftNotEmpty++\n    }\n\n    if (leftNotEmpty < fxpFilter.length) {\n      rightNotEmpty = fxpFilter.length - 1\n      while (rightNotEmpty > 0 && fxpFilter[rightNotEmpty] === 0) {\n        rightNotEmpty--\n      }\n\n      filterShift = srcFirst + leftNotEmpty\n      filterSize = rightNotEmpty - leftNotEmpty + 1\n\n      packedFilter[packedFilterPtr++] = filterShift // shift\n      packedFilter[packedFilterPtr++] = filterSize // size\n\n      if (!slowCopy) {\n        packedFilter.set(fxpFilter.subarray(leftNotEmpty, rightNotEmpty + 1), packedFilterPtr)\n        packedFilterPtr += filterSize\n      } else {\n        // fallback for old IE < 11, without subarray/set methods\n        for (idx = leftNotEmpty; idx <= rightNotEmpty; idx++) {\n          packedFilter[packedFilterPtr++] = fxpFilter[idx]\n        }\n      }\n    } else {\n      // zero data, write header only\n      packedFilter[packedFilterPtr++] = 0 // shift\n      packedFilter[packedFilterPtr++] = 0 // size\n    }\n  }\n  return packedFilter\n}\n","// Resize convolvers, pure JS implementation\n//\n// Precision of fixed FP values\n// var FIXED_FRAC_BITS = 14;\n\nfunction clampTo8 (i: number): number { return i < 0 ? 0 : (i > 255 ? 255 : i) }\nfunction clampNegative (i: number): number { return i >= 0 ? i : 0 }\n\nimport type { MathImageBuffer } from '../mathlib'\n\n// Convolve image data in horizontal direction. Can be used for:\n//\n// 1. bitmap with premultiplied alpha\n// 2. bitmap without alpha (all values 255)\n//\n// Notes:\n//\n// - output is transposed\n// - output resolution is ~15 bits per channel(for better precision).\n//\nfunction convolveHor (\n  src: MathImageBuffer,\n  dest: Uint16Array,\n  srcW: number,\n  srcH: number,\n  destW: number,\n  filters: Int16Array\n): void {\n  let r, g, b, a\n  let filterPtr, filterShift, filterSize\n  let srcPtr, srcY, destX, filterVal\n  let srcOffset = 0, destOffset = 0\n\n  // For each row\n  for (srcY = 0; srcY < srcH; srcY++) {\n    filterPtr = 0\n\n    // Apply precomputed filters to each destination row point\n    for (destX = 0; destX < destW; destX++) {\n      // Get the filter that determines the current output pixel.\n      filterShift = filters[filterPtr++]\n      filterSize = filters[filterPtr++]\n\n      srcPtr = (srcOffset + (filterShift * 4))|0\n\n      r = g = b = a = 0\n\n      // Apply the filter to the row to get the destination pixel r, g, b, a\n      for (; filterSize > 0; filterSize--) {\n        filterVal = filters[filterPtr++]\n\n        // Use reverse order to workaround deopts in old v8 (node v.10)\n        // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n        a = (a + filterVal * src[srcPtr + 3])|0\n        b = (b + filterVal * src[srcPtr + 2])|0\n        g = (g + filterVal * src[srcPtr + 1])|0\n        r = (r + filterVal * src[srcPtr])|0\n        srcPtr = (srcPtr + 4)|0\n      }\n\n      // Store 15 bits between passes for better precision\n      // Instead of shift to 14 (FIXED_FRAC_BITS), shift to 7 only\n      //\n      dest[destOffset + 3] = clampNegative(a >> 7)\n      dest[destOffset + 2] = clampNegative(b >> 7)\n      dest[destOffset + 1] = clampNegative(g >> 7)\n      dest[destOffset] = clampNegative(r >> 7)\n      destOffset = (destOffset + srcH * 4)|0\n    }\n\n    destOffset = ((srcY + 1) * 4)|0\n    srcOffset = ((srcY + 1) * srcW * 4)|0\n  }\n}\n\n// Supplementary method for `convolveHor()`\n//\nfunction convolveVert (\n  src: Uint16Array,\n  dest: Uint8Array,\n  srcW: number,\n  srcH: number,\n  destW: number,\n  filters: Int16Array\n): void {\n  let r, g, b, a\n  let filterPtr, filterShift, filterSize\n  let srcPtr, srcY, destX, filterVal\n  let srcOffset = 0, destOffset = 0\n\n  // For each row\n  for (srcY = 0; srcY < srcH; srcY++) {\n    filterPtr = 0\n\n    // Apply precomputed filters to each destination row point\n    for (destX = 0; destX < destW; destX++) {\n      // Get the filter that determines the current output pixel.\n      filterShift = filters[filterPtr++]\n      filterSize = filters[filterPtr++]\n\n      srcPtr = (srcOffset + (filterShift * 4))|0\n\n      r = g = b = a = 0\n\n      // Apply the filter to the row to get the destination pixel r, g, b, a\n      for (; filterSize > 0; filterSize--) {\n        filterVal = filters[filterPtr++]\n\n        // Use reverse order to workaround deopts in old v8 (node v.10)\n        // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n        a = (a + filterVal * src[srcPtr + 3])|0\n        b = (b + filterVal * src[srcPtr + 2])|0\n        g = (g + filterVal * src[srcPtr + 1])|0\n        r = (r + filterVal * src[srcPtr])|0\n        srcPtr = (srcPtr + 4)|0\n      }\n\n      // Sync with premultiplied version for exact result match\n      r >>= 7\n      g >>= 7\n      b >>= 7\n      a >>= 7\n\n      // Bring this value back in range + round result.\n      //\n      dest[destOffset + 3] = clampTo8((a + (1 << 13)) >> 14)\n      dest[destOffset + 2] = clampTo8((b + (1 << 13)) >> 14)\n      dest[destOffset + 1] = clampTo8((g + (1 << 13)) >> 14)\n      dest[destOffset] = clampTo8((r + (1 << 13)) >> 14)\n      destOffset = (destOffset + srcH * 4)|0\n    }\n\n    destOffset = ((srcY + 1) * 4)|0\n    srcOffset = ((srcY + 1) * srcW * 4)|0\n  }\n}\n\n// Premultiply & convolve image data in horizontal direction. Can be used for:\n//\n// - Any bitmap data, extracted with `.getImageData()` method (with\n//   non-premultiplied alpha)\n//\n// For images without alpha channel this method is slower than `convolveHor()`\n//\nfunction convolveHorWithPre (\n  src: MathImageBuffer,\n  dest: Uint16Array,\n  srcW: number,\n  srcH: number,\n  destW: number,\n  filters: Int16Array\n): void {\n  let r, g, b, a, alpha\n  let filterPtr, filterShift, filterSize\n  let srcPtr, srcY, destX, filterVal\n  let srcOffset = 0, destOffset = 0\n\n  // For each row\n  for (srcY = 0; srcY < srcH; srcY++) {\n    filterPtr = 0\n\n    // Apply precomputed filters to each destination row point\n    for (destX = 0; destX < destW; destX++) {\n      // Get the filter that determines the current output pixel.\n      filterShift = filters[filterPtr++]\n      filterSize = filters[filterPtr++]\n\n      srcPtr = (srcOffset + (filterShift * 4))|0\n\n      r = g = b = a = 0\n\n      // Apply the filter to the row to get the destination pixel r, g, b, a\n      for (; filterSize > 0; filterSize--) {\n        filterVal = filters[filterPtr++]\n\n        // Use reverse order to workaround deopts in old v8 (node v.10)\n        // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n        alpha = src[srcPtr + 3]\n        a = (a + filterVal * alpha)|0\n        b = (b + filterVal * src[srcPtr + 2] * alpha)|0\n        g = (g + filterVal * src[srcPtr + 1] * alpha)|0\n        r = (r + filterVal * src[srcPtr] * alpha)|0\n        srcPtr = (srcPtr + 4)|0\n      }\n\n      // Premultiply is (* alpha / 255).\n      // Postpone division for better performance\n      b = (b / 255)|0\n      g = (g / 255)|0\n      r = (r / 255)|0\n\n      // Store 15 bits between passes for better precision\n      // Instead of shift to 14 (FIXED_FRAC_BITS), shift to 7 only\n      //\n      dest[destOffset + 3] = clampNegative(a >> 7)\n      dest[destOffset + 2] = clampNegative(b >> 7)\n      dest[destOffset + 1] = clampNegative(g >> 7)\n      dest[destOffset] = clampNegative(r >> 7)\n      destOffset = (destOffset + srcH * 4)|0\n    }\n\n    destOffset = ((srcY + 1) * 4)|0\n    srcOffset = ((srcY + 1) * srcW * 4)|0\n  }\n}\n\n// Supplementary method for `convolveHorWithPre()`\n//\nfunction convolveVertWithPre (\n  src: Uint16Array,\n  dest: Uint8Array,\n  srcW: number,\n  srcH: number,\n  destW: number,\n  filters: Int16Array\n): void {\n  let r, g, b, a\n  let filterPtr, filterShift, filterSize\n  let srcPtr, srcY, destX, filterVal\n  let srcOffset = 0, destOffset = 0\n\n  // For each row\n  for (srcY = 0; srcY < srcH; srcY++) {\n    filterPtr = 0\n\n    // Apply precomputed filters to each destination row point\n    for (destX = 0; destX < destW; destX++) {\n      // Get the filter that determines the current output pixel.\n      filterShift = filters[filterPtr++]\n      filterSize = filters[filterPtr++]\n\n      srcPtr = (srcOffset + (filterShift * 4))|0\n\n      r = g = b = a = 0\n\n      // Apply the filter to the row to get the destination pixel r, g, b, a\n      for (; filterSize > 0; filterSize--) {\n        filterVal = filters[filterPtr++]\n\n        // Use reverse order to workaround deopts in old v8 (node v.10)\n        // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n        a = (a + filterVal * src[srcPtr + 3])|0\n        b = (b + filterVal * src[srcPtr + 2])|0\n        g = (g + filterVal * src[srcPtr + 1])|0\n        r = (r + filterVal * src[srcPtr])|0\n        srcPtr = (srcPtr + 4)|0\n      }\n\n      // Downscale to leave room for un-premultiply\n      r >>= 7\n      g >>= 7\n      b >>= 7\n      a >>= 7\n\n      // Un-premultiply\n      a = clampTo8((a + (1 << 13)) >> 14)\n      if (a > 0) {\n        r = (r * 255 / a)|0\n        g = (g * 255 / a)|0\n        b = (b * 255 / a)|0\n      }\n\n      // Bring this value back in range + round result.\n      // Shift value = FIXED_FRAC_BITS + 7\n      //\n      dest[destOffset + 3] = a\n      dest[destOffset + 2] = clampTo8((b + (1 << 13)) >> 14)\n      dest[destOffset + 1] = clampTo8((g + (1 << 13)) >> 14)\n      dest[destOffset] = clampTo8((r + (1 << 13)) >> 14)\n      destOffset = (destOffset + srcH * 4)|0\n    }\n\n    destOffset = ((srcY + 1) * 4)|0\n    srcOffset = ((srcY + 1) * srcW * 4)|0\n  }\n}\n\nexport {\n  convolveHor,\n  convolveVert,\n  convolveHorWithPre,\n  convolveVertWithPre\n}\n","import createFilters from './resize_filter_gen'\nimport { convolveHor, convolveVert, convolveHorWithPre, convolveVertWithPre } from './convolve'\nimport type { MathResizeOptions, MathImageBuffer } from '../mathlib'\n\nfunction hasAlpha (src: MathImageBuffer, width: number, height: number): boolean {\n  let ptr = 3\n  const len = (width * height * 4)|0\n  while (ptr < len) {\n    if (src[ptr] !== 255) return true\n    ptr = (ptr + 4)|0\n  }\n  return false\n}\n\nfunction resetAlpha (dst: Uint8Array, width: number, height: number): void {\n  let ptr = 3\n  const len = (width * height * 4)|0\n  while (ptr < len) { dst[ptr] = 0xFF; ptr = (ptr + 4)|0 }\n}\n\nexport default function resize (options: MathResizeOptions): Uint8Array {\n  const src = options.src\n  const srcW = options.width\n  const srcH = options.height\n  const destW = options.toWidth\n  const destH = options.toHeight\n  const scaleX = options.scaleX || options.toWidth / options.width\n  const scaleY = options.scaleY || options.toHeight / options.height\n  const offsetX = options.offsetX || 0\n  const offsetY = options.offsetY || 0\n  const dest = options.dest || new Uint8Array(destW * destH * 4)\n\n  const filter = typeof options.filter === 'undefined' ? 'mks2013' : options.filter\n  const filtersX = createFilters(filter, srcW, destW, scaleX, offsetX),\n    filtersY = createFilters(filter, srcH, destH, scaleY, offsetY)\n\n  const tmp = new Uint16Array(destW * srcH * 4)\n\n  // Autodetect if alpha channel exists, and use appropriate method\n  if (hasAlpha(src, srcW, srcH)) {\n    convolveHorWithPre(src, tmp, srcW, srcH, destW, filtersX)\n    convolveVertWithPre(tmp, dest, srcH, destW, destH, filtersY)\n  } else {\n    convolveHor(src, tmp, srcW, srcH, destW, filtersX)\n    convolveVert(tmp, dest, srcH, destW, destH, filtersY)\n    resetAlpha(dest, destW, destH)\n  }\n\n  return dest\n}\n","import createFilters from './resize_filter_gen'\nimport type { MathResizeOptions, MathWasmContext, MathImageBuffer } from '../mathlib'\n\nfunction hasAlpha (src: MathImageBuffer, width: number, height: number): boolean {\n  let ptr = 3\n  const len = (width * height * 4)|0\n  while (ptr < len) {\n    if (src[ptr] !== 255) return true\n    ptr = (ptr + 4)|0\n  }\n  return false\n}\n\nfunction resetAlpha (dst: Uint8Array, width: number, height: number): void {\n  let ptr = 3\n  const len = (width * height * 4)|0\n  while (ptr < len) { dst[ptr] = 0xFF; ptr = (ptr + 4)|0 }\n}\n\nfunction asUint8Array (src: Int16Array): Uint8Array {\n  return new Uint8Array(src.buffer, 0, src.byteLength)\n}\n\nlet IS_LE = true\n// should not crash everything on module load in old browsers\ntry {\n  IS_LE = ((new Uint32Array((new Uint8Array([1, 0, 0, 0])).buffer))[0] === 1)\n} catch (__) {}\n\nfunction copyInt16asLE (src: Int16Array, target: Uint8Array, target_offset: number): void {\n  if (IS_LE) {\n    target.set(asUint8Array(src), target_offset)\n    return\n  }\n\n  for (let ptr = target_offset, i = 0; i < src.length; i++) {\n    const data = src[i]\n    target[ptr++] = data & 0xFF\n    target[ptr++] = (data >> 8) & 0xFF\n  }\n}\n\nexport default function resize_wasm (this: MathWasmContext, options: MathResizeOptions): Uint8Array {\n  const src = options.src\n  const srcW = options.width\n  const srcH = options.height\n  const destW = options.toWidth\n  const destH = options.toHeight\n  const scaleX = options.scaleX || options.toWidth / options.width\n  const scaleY = options.scaleY || options.toHeight / options.height\n  const offsetX = options.offsetX || 0.0\n  const offsetY = options.offsetY || 0.0\n  const dest = options.dest || new Uint8Array(destW * destH * 4)\n\n  const filter = typeof options.filter === 'undefined' ? 'mks2013' : options.filter\n  const filtersX = createFilters(filter, srcW, destW, scaleX, offsetX),\n    filtersY = createFilters(filter, srcH, destH, scaleY, offsetY)\n\n  // destination is 0 too.\n  const src_offset = 0\n  const src_size = Math.max(src.byteLength, dest.byteLength)\n  // buffer between convolve passes\n  const tmp_offset = this.__align(src_offset + src_size)\n  const tmp_size = srcH * destW * 4 * 2 // 2 bytes per channel\n\n  const filtersX_offset = this.__align(tmp_offset + tmp_size)\n  const filtersY_offset = this.__align(filtersX_offset + filtersX.byteLength)\n  const alloc_bytes = filtersY_offset + filtersY.byteLength\n\n  const instance = this.__instance('resize', alloc_bytes)\n\n  //\n  // Fill memory block with data to process\n  //\n\n  const mem = new Uint8Array(this.__memory!.buffer)\n  const mem32 = new Uint32Array(this.__memory!.buffer)\n\n  // 32-bit copy is much faster in chrome\n  const src32 = new Uint32Array(src.buffer)\n  mem32.set(src32)\n\n  // We should guarantee LE bytes order. Filters are not big, so\n  // speed difference is not significant vs direct .set()\n  copyInt16asLE(filtersX, mem, filtersX_offset)\n  copyInt16asLE(filtersY, mem, filtersY_offset)\n\n  // Now call webassembly method\n  // emsdk does method names with '_'\n  const fn = (instance.exports.convolveHV || instance.exports._convolveHV) as Function | undefined\n  if (!fn) throw new Error('WASM resize function is not available')\n\n  if (hasAlpha(src, srcW, srcH)) {\n    fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH, 1)\n  } else {\n    fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH, 0)\n    resetAlpha(dest, destW, destH)\n  }\n\n  //\n  // Copy data back to typed array\n  //\n\n  // 32-bit copy is much faster in chrome\n  const dest32 = new Uint32Array(dest.buffer)\n  dest32.set(new Uint32Array(this.__memory!.buffer, 0, destH * destW))\n\n  return dest\n}\n","// This is autogenerated file from math.wasm, don't edit.\n//\nexport default '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'\n","import fn from './resize'\nimport wasm_fn from './resize_wasm'\nimport wasm_src from './convolve_wasm_base64'\n\nexport default {\n  name: 'resize' as const,\n  fn,\n  wasm_fn,\n  wasm_src\n}\n","// Collection of math functions\n//\n// 1. Combine components together\n// 2. Has async init to load wasm modules\n//\nimport { MultiMath } from 'multimath'\n\nimport mm_unsharp_mask from './mm_unsharp_mask'\nimport mm_resize from './mm_resize'\n\nexport type MathFeaturesMap = { js: boolean; wasm: boolean }\nexport type { MultiMathPlugin as MathPlugin } from 'multimath'\nexport type MathImageBuffer = Uint8Array | Uint8ClampedArray\nexport type MathWasmContext = MultiMath\n\nexport type MathResizeFilter = 'box' | 'hamming' | 'lanczos2' | 'lanczos3' | 'mks2013'\n\nexport interface MathResizeOptions {\n  src: MathImageBuffer\n  width: number\n  height: number\n  toWidth: number\n  toHeight: number\n  dest?: Uint8Array\n  scaleX: number\n  scaleY: number\n  offsetX: number\n  offsetY: number\n  filter: MathResizeFilter\n}\n\nexport interface MathResizeAndUnsharpOptions extends MathResizeOptions {\n  unsharpAmount: number\n  unsharpRadius: number\n  unsharpThreshold: number\n}\n\nexport default class MathLib extends MultiMath {\n  declare features: MathFeaturesMap\n  declare resize: typeof mm_resize.fn\n  declare unsharp_mask: typeof mm_unsharp_mask.fn\n\n  constructor (requested_features?: readonly string[]) {\n    const __requested_features = requested_features || []\n\n    const features = {\n      js: __requested_features.indexOf('js') >= 0,\n      wasm: __requested_features.indexOf('wasm') >= 0\n    }\n\n    super(features)\n\n    this.features = {\n      js: features.js,\n      wasm: features.wasm && this.has_wasm()\n    }\n\n    this.use(mm_unsharp_mask)\n    this.use(mm_resize)\n  }\n\n  resizeAndUnsharp (options: MathResizeAndUnsharpOptions): Uint8Array {\n    const result = this.resize(options)\n\n    if (options.unsharpAmount) {\n      this.unsharp_mask(\n        result,\n        options.toWidth,\n        options.toHeight,\n        options.unsharpAmount,\n        options.unsharpRadius,\n        options.unsharpThreshold\n      )\n    }\n\n    return result\n  }\n}\n","const GC_INTERVAL = 100\n\n// Acquired items\nexport interface PoolResource<T> {\n  value: T\n  release: () => void\n}\n\n// Internal storage format\ninterface PoolResourceDescriptor<T> {\n  id: number\n  lastUsed: number\n  value: T\n  destroy: () => void\n}\n\nexport default class Pool<T> {\n  create: () => { value: T, destroy: () => void }\n  available: Array<PoolResourceDescriptor<T>>\n  acquired: Record<number, PoolResourceDescriptor<T>>\n  lastId: number\n  timeoutId: ReturnType<typeof setTimeout> | 0\n  idle: number\n\n  constructor (create: () => { value: T, destroy: () => void }, idle?: number) {\n    this.create = create\n\n    this.available = []\n    this.acquired = {}\n    this.lastId = 1\n\n    this.timeoutId = 0\n    this.idle = idle || 2000\n  }\n\n  acquire (): PoolResource<T> {\n    let descriptor: PoolResourceDescriptor<T>\n\n    if (this.available.length !== 0) {\n      descriptor = this.available.pop() as PoolResourceDescriptor<T>\n    } else {\n      const init = this.create()\n      descriptor = { ...init, id: this.lastId++, lastUsed: 0 }\n    }\n    this.acquired[descriptor.id] = descriptor\n    return { value: descriptor.value, release: () => this.release(descriptor) }\n  }\n\n  release (descriptor: PoolResourceDescriptor<T>): void {\n    delete this.acquired[descriptor.id]\n\n    descriptor.lastUsed = Date.now()\n    this.available.push(descriptor)\n\n    if (this.timeoutId === 0) {\n      this.timeoutId = setTimeout(() => this.gc(), GC_INTERVAL)\n    }\n  }\n\n  gc (): void {\n    const now = Date.now()\n\n    this.available = this.available.filter(descriptor => {\n      if (now - descriptor.lastUsed > this.idle) {\n        descriptor.destroy()\n        return false\n      }\n      return true\n    })\n\n    if (this.available.length !== 0) {\n      this.timeoutId = setTimeout(() => this.gc(), GC_INTERVAL)\n    } else {\n      this.timeoutId = 0\n    }\n  }\n}\n","import type { CibResizeQuality, Filter, Limiter, PicaCanvas } from './types'\n\n// Uses constructor.name — safe because all targets are browser built-ins or\n// native Node.js library classes that minifiers don't rename. If this ever\n// breaks after a toolchain change, fall back to Object.prototype.toString:\n//   Object.prototype.toString.call(obj) === '[object HTMLCanvasElement]'  etc.\nfunction objClass (obj: unknown): string {\n  return (obj as any)?.constructor?.name ?? ''\n}\n\nexport function isCanvas (element: unknown): element is PicaCanvas {\n  const cname = objClass(element)\n\n  return cname === 'HTMLCanvasElement' ||\n         cname === 'OffscreenCanvas' ||\n         cname === 'Canvas' /* node-canvas */ ||\n         cname === 'CanvasElement' /* @napi-rs/canvas */\n}\n\nexport function isImage (element: unknown): element is HTMLImageElement {\n  return objClass(element) === 'HTMLImageElement'\n}\n\nexport function isImageBitmap (element: unknown): element is ImageBitmap {\n  return objClass(element) === 'ImageBitmap'\n}\n\nexport function limiter (concurrency: number): Limiter {\n  let active = 0\n  const queue: Array<() => void> = []\n\n  function roll () {\n    if (active < concurrency && queue.length) {\n      active++\n      queue.shift()?.()\n    }\n  }\n\n  return function limit<T> (fn: () => Promise<T>): Promise<T> {\n    return new Promise((resolve, reject) => {\n      queue.push(() => {\n        fn().then(\n          result => {\n            resolve(result)\n            active--\n            roll()\n          },\n          err => {\n            reject(err)\n            active--\n            roll()\n          }\n        )\n      })\n\n      roll()\n    })\n  }\n}\n\nexport function cib_quality_name (num: number): ResizeQuality {\n  switch (num) {\n    case 0: return 'pixelated'\n    case 1: return 'low'\n    case 2: return 'medium'\n  }\n  return 'high'\n}\n\nconst CIB_QUALITY_FILTERS: Filter[] = ['box', 'hamming', 'lanczos2', 'lanczos3']\n\nexport function cib_quality_filter (num: CibResizeQuality): Filter {\n  return CIB_QUALITY_FILTERS[num]\n}\n\nexport function is_cib_filter (filter: Filter): boolean {\n  return CIB_QUALITY_FILTERS.indexOf(filter) >= 0\n}\n\nexport function filter_to_cib_quality (filter: Filter): CibResizeQuality | undefined {\n  const index = CIB_QUALITY_FILTERS.indexOf(filter)\n\n  return index >= 0 ? index as CibResizeQuality : undefined\n}\n\ntype ResizeQuality = 'pixelated' | 'low' | 'medium' | 'high'\n","export type Stage = [width: number, height: number]\n\n// Add intermediate resizing steps when scaling down by a very large factor.\n//\n// For example, when resizing 10000x10000 down to 10x10, it'll resize it to\n// 300x300 first.\n//\n// It's needed because tiler has issues when the entire tile is scaled down\n// to a few pixels (1024px source tile with border size 3 should result in\n// at least 3+3+2 = 8px target tile, so max scale factor is 128 here).\n//\n// Also, adding intermediate steps can speed up processing if we use lower\n// quality algorithms for first stages.\n//\n\n// min size = 0 results in infinite loop,\n// min size = 1 can consume large amount of memory\nconst MIN_INNER_TILE_SIZE = 2\n\nconst DEST_TILE_BORDER = 3 // Max possible filter window size\n\nexport default function createStages (\n  fromWidth: number,\n  fromHeight: number,\n  toWidth: number,\n  toHeight: number,\n  srcTileSize: number\n): Stage[] {\n  const scaleX = toWidth / fromWidth\n  const scaleY = toHeight / fromHeight\n\n  // derived from createRegions equation:\n  // innerTileWidth = pixelFloor(srcTileSize * scaleX) - 2 * destTileBorder;\n  const minScale = (2 * DEST_TILE_BORDER + MIN_INNER_TILE_SIZE + 1) / srcTileSize\n\n  // refuse to scale image multiple times by less than twice each time,\n  // it could only happen because of invalid options\n  if (minScale > 0.5) return [[toWidth, toHeight]]\n\n  const stageCount = Math.ceil(Math.log(Math.min(scaleX, scaleY)) / Math.log(minScale))\n\n  // no additional resizes are necessary,\n  // stageCount can be zero or be negative when enlarging the image\n  if (stageCount <= 1) return [[toWidth, toHeight]]\n\n  const result: Stage[] = []\n\n  for (let i = 0; i < stageCount; i++) {\n    const width = Math.round(\n      Math.pow(\n        Math.pow(fromWidth, stageCount - i - 1) * Math.pow(toWidth, i + 1),\n        1 / stageCount\n      )\n    )\n\n    const height = Math.round(\n      Math.pow(\n        Math.pow(fromHeight, stageCount - i - 1) * Math.pow(toHeight, i + 1),\n        1 / stageCount\n      )\n    )\n\n    result.push([width, height])\n  }\n\n  return result\n}\n","export interface Tile {\n  toX: number\n  toY: number\n  toWidth: number\n  toHeight: number\n  toInnerX: number\n  toInnerY: number\n  toInnerWidth: number\n  toInnerHeight: number\n  offsetX: number\n  offsetY: number\n  scaleX: number\n  scaleY: number\n  x: number\n  y: number\n  width: number\n  height: number\n}\n\nexport interface TilerOptions {\n  width: number\n  height: number\n  srcTileSize: number\n  toWidth: number\n  toHeight: number\n  destTileBorder: number\n}\n\n// Split original image into multiple 1024x1024 chunks to reduce memory usage\n// (images have to be unpacked into typed arrays for resizing) and allow\n// parallel processing of multiple tiles at a time.\n//\n\n/*\n * pixelFloor and pixelCeil are modified versions of Math.floor and Math.ceil\n * functions which take into account floating point arithmetic errors.\n * Those errors can cause undesired increments/decrements of sizes and offsets:\n * Math.ceil(36 / (36 / 500)) = 501\n * pixelCeil(36 / (36 / 500)) = 500\n */\n\nconst PIXEL_EPSILON = 1e-5\n\nfunction pixelFloor (x: number): number {\n  const nearest = Math.round(x)\n\n  if (Math.abs(x - nearest) < PIXEL_EPSILON) { return nearest }\n  return Math.floor(x)\n}\n\nfunction pixelCeil (x: number): number {\n  const nearest = Math.round(x)\n\n  if (Math.abs(x - nearest) < PIXEL_EPSILON) { return nearest }\n  return Math.ceil(x)\n}\n\nexport default function createRegions (options: TilerOptions): Tile[] {\n  const scaleX = options.toWidth / options.width\n  const scaleY = options.toHeight / options.height\n\n  const innerTileWidth = pixelFloor(options.srcTileSize * scaleX) - 2 * options.destTileBorder\n  const innerTileHeight = pixelFloor(options.srcTileSize * scaleY) - 2 * options.destTileBorder\n\n  // prevent infinite loop, this should never happen\n  if (innerTileWidth < 1 || innerTileHeight < 1) {\n    throw new Error('Internal error in pica: target tile width/height is too small.')\n  }\n\n  let x, y\n  let innerX, innerY, toTileWidth, toTileHeight\n  const tiles: Tile[] = []\n  let tile: Tile\n\n  // we go top-to-bottom instead of left-to-right so the image is displayed\n  // from top to bottom in the browser\n  for (innerY = 0; innerY < options.toHeight; innerY += innerTileHeight) {\n    for (innerX = 0; innerX < options.toWidth; innerX += innerTileWidth) {\n      x = innerX - options.destTileBorder\n      if (x < 0) { x = 0 }\n      toTileWidth = innerX + innerTileWidth + options.destTileBorder - x\n      if (x + toTileWidth >= options.toWidth) {\n        toTileWidth = options.toWidth - x\n      }\n\n      y = innerY - options.destTileBorder\n      if (y < 0) { y = 0 }\n      toTileHeight = innerY + innerTileHeight + options.destTileBorder - y\n      if (y + toTileHeight >= options.toHeight) {\n        toTileHeight = options.toHeight - y\n      }\n\n      tile = {\n        toX: x,\n        toY: y,\n        toWidth: toTileWidth,\n        toHeight: toTileHeight,\n\n        toInnerX: innerX,\n        toInnerY: innerY,\n        toInnerWidth: innerTileWidth,\n        toInnerHeight: innerTileHeight,\n\n        offsetX: x / scaleX - pixelFloor(x / scaleX),\n        offsetY: y / scaleY - pixelFloor(y / scaleY),\n        scaleX,\n        scaleY,\n\n        x: pixelFloor(x / scaleX),\n        y: pixelFloor(y / scaleY),\n        width: pixelCeil(toTileWidth / scaleX),\n        height: pixelCeil(toTileHeight / scaleY)\n      }\n\n      tiles.push(tile)\n    }\n  }\n\n  return tiles\n}\n","import type { PicaCanvas, PicaCanvasCtx } from './types'\n\nexport interface SupportedFeatures {\n  canvas: boolean\n  offscreen_canvas: boolean\n  may_be_worker: boolean\n  create_image_bitmap: boolean\n  safari_put_image_data_fix: boolean\n  bug_canvas_orientation_region: boolean\n  bug_image_bitmap_orientation_region: boolean\n  cib_resize: boolean\n}\n\n// 3x2 JPEG with EXIF orientation 6 (rotate 90deg clockwise when decoded).\n//\n// Stored pixels, before orientation (Black, White):\n//\n//   B W B\n//   B B B\n//\n// After orientation is applied, decoded image should be 2x3:\n//\n//   B B\n//   B W  <- pixel at (1, 1) should be white if region crop is correct\n//   B B\n//\n// If crop coordinates are applied before orientation, region (1, 1, 1, 1)\n// returns black instead. The checks below use this to detect region/orientation\n// bugs in canvas drawImage() and createImageBitmap().\nconst ORIENTED_JPEG_BASE64 =\n  '/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/4AAQskZJRgABAQAAA' +\n  'QABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCw' +\n  'kJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAACAAMBAREA/8QAFAABAAAAAAAAAAAAAAAA' +\n  'AAAACf/EABsQAAMBAQADAAAAAAAAAAAAAAECAwQFABEx/9oACAEBAAA/AC06fW6va0ps' +\n  '7PT179E88MiV02arrCEkjGQZiSEnKc5ovxURVHoADz//2Q=='\n\nconst features: SupportedFeatures = {\n  canvas: false,\n  offscreen_canvas: false,\n  may_be_worker: false,\n  create_image_bitmap: false,\n  safari_put_image_data_fix: false,\n  bug_canvas_orientation_region: true,\n  bug_image_bitmap_orientation_region: true,\n  cib_resize: false\n}\n\nlet checked = false\nlet checking: Promise<SupportedFeatures> | null = null\n\nfunction check_canvas (): boolean {\n  if (typeof document === 'undefined' || !document.createElement) return false\n\n  try {\n    const canvas = document.createElement('canvas')\n    canvas.width = 2\n    canvas.height = 1\n\n    const ctx = canvas.getContext('2d')!\n\n    // Fingerprinting protection can randomize readback.\n    // In that case we can not rely on canvas pixel data.\n    let d = ctx.createImageData(2, 1)\n\n    d.data[0] = 12; d.data[1] = 23; d.data[2] = 34; d.data[3] = 255\n    d.data[4] = 45; d.data[5] = 56; d.data[6] = 67; d.data[7] = 255\n    ctx.putImageData(d, 0, 0)\n    d = ctx.getImageData(0, 0, 2, 1)\n\n    return d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 &&\n           d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255\n  } catch (__) {\n    return false\n  }\n}\n\nfunction check_offscreen_canvas (): boolean {\n  if (typeof OffscreenCanvas === 'undefined') return false\n\n  try {\n    const canvas = new OffscreenCanvas(2, 1)\n    const ctx = canvas.getContext('2d')!\n\n    // Fingerprinting protection can randomize readback.\n    // In that case we can not rely on canvas pixel data.\n    let d = ctx.createImageData(2, 1)\n\n    d.data[0] = 12; d.data[1] = 23; d.data[2] = 34; d.data[3] = 255\n    d.data[4] = 45; d.data[5] = 56; d.data[6] = 67; d.data[7] = 255\n    ctx.putImageData(d, 0, 0)\n    d = ctx.getImageData(0, 0, 2, 1)\n\n    return d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 &&\n           d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255\n  } catch (__) {\n    return false\n  }\n}\n\nfunction check_create_image_bitmap (): boolean {\n  return typeof createImageBitmap !== 'undefined'\n}\n\nfunction check_may_be_worker (): boolean {\n  return typeof Worker !== 'undefined' &&\n    // Filter out IE <= 11 for sure\n    (typeof URL !== 'undefined' && !!URL.createObjectURL)\n}\n\nfunction check_safari_put_image_data_fix (): boolean {\n  try {\n    return !!(typeof navigator !== 'undefined' &&\n           navigator.userAgent &&\n           navigator.userAgent.indexOf('Safari') >= 0 &&\n           navigator.userAgent.indexOf('Chrome') < 0)\n  } catch (__) {\n    return false\n  }\n}\n\nfunction check_bug_canvas_orientation_region_async (): Promise<boolean> {\n  return Promise.resolve().then(() => {\n    const canOffscreenCanvas = check_offscreen_canvas() &&\n                             check_create_image_bitmap() &&\n                             typeof Blob !== 'undefined' &&\n                             typeof atob !== 'undefined'\n\n    if (canOffscreenCanvas) {\n      const binary = atob(ORIENTED_JPEG_BASE64)\n      const bytes = new Uint8Array(binary.length)\n\n      for (let i = 0; i < binary.length; i++) {\n        bytes[i] = binary.charCodeAt(i)\n      }\n\n      return createImageBitmap(new Blob([bytes], { type: 'image/jpeg' }))\n        .then(bitmap => {\n          const canvas = new OffscreenCanvas(1, 1)\n\n          try {\n            const ctx = canvas.getContext('2d')!\n            ctx.drawImage(bitmap, 1, 1, 1, 1, 0, 0, 1, 1)\n\n            return ctx.getImageData(0, 0, 1, 1).data[0] < 240\n          } finally {\n            bitmap.close()\n          }\n        })\n    }\n\n    if (check_canvas() && typeof Image !== 'undefined') {\n      return new Promise<boolean>(resolve => {\n        const image = new Image()\n\n        image.onload = () => {\n          try {\n            const canvas = document.createElement('canvas')\n            canvas.width = 1\n            canvas.height = 1\n\n            const ctx = canvas.getContext('2d')!\n            ctx.drawImage(image, 1, 1, 1, 1, 0, 0, 1, 1)\n\n            resolve(ctx.getImageData(0, 0, 1, 1).data[0] < 240)\n          } catch (__) {\n            resolve(true)\n          }\n        }\n\n        image.onerror = () => resolve(true)\n        image.src = `data:image/jpeg;base64,${ORIENTED_JPEG_BASE64}`\n      })\n    }\n\n    return true\n  })\n    .catch(() => true)\n}\n\nfunction check_bug_image_bitmap_orientation_region_async (): Promise<boolean> {\n  return Promise.resolve().then(() => {\n    if (!features.create_image_bitmap && !check_create_image_bitmap()) return true\n    if (typeof Blob === 'undefined' || typeof atob === 'undefined') return true\n\n    const canOffscreenCanvas = check_offscreen_canvas()\n    const canCanvas = check_canvas()\n\n    if (!canOffscreenCanvas && !canCanvas) return true\n\n    const binary = atob(ORIENTED_JPEG_BASE64)\n    const bytes = new Uint8Array(binary.length)\n\n    for (let i = 0; i < binary.length; i++) {\n      bytes[i] = binary.charCodeAt(i)\n    }\n\n    return createImageBitmap(new Blob([bytes], { type: 'image/jpeg' }))\n      .then(imageBitmap => createImageBitmap(imageBitmap, 1, 1, 1, 1)\n        .then(bitmap => {\n          let canvas: PicaCanvas\n\n          if (canOffscreenCanvas) {\n            canvas = new OffscreenCanvas(1, 1)\n          } else {\n            canvas = document.createElement('canvas')\n            canvas.width = 1\n            canvas.height = 1\n          }\n\n          try {\n            const ctx = canvas.getContext('2d') as PicaCanvasCtx\n            ctx.drawImage(bitmap, 0, 0)\n\n            return bitmap.width !== 1 || bitmap.height !== 1 ||\n                   ctx.getImageData(0, 0, 1, 1).data[0] < 240\n          } finally {\n            imageBitmap.close()\n            bitmap.close()\n          }\n        }, () => {\n          imageBitmap.close()\n          return true\n        }))\n  })\n    .catch(() => true)\n}\n\nfunction check_cib_resize_async (): Promise<boolean> {\n  return Promise.resolve().then(() => {\n    if (!check_create_image_bitmap()) return false\n\n    const SRC_SIZE = 20\n    const DST_SIZE = 5\n\n    let canvas: PicaCanvas | null\n\n    if (features.canvas || check_canvas()) {\n      canvas = document.createElement('canvas')\n      canvas.width = SRC_SIZE\n      canvas.height = SRC_SIZE\n    } else if (features.offscreen_canvas || check_offscreen_canvas()) {\n      canvas = new OffscreenCanvas(SRC_SIZE, SRC_SIZE)\n      // Chrome fails to createImageBitmap() from canvas without drawing\n      // anything on it.\n      const ctx = canvas.getContext('2d')!\n      ctx.clearRect(0, 0, SRC_SIZE, SRC_SIZE)\n    } else {\n      return false\n    }\n\n    return createImageBitmap(canvas, 0, 0, SRC_SIZE, SRC_SIZE, {\n      resizeWidth: DST_SIZE,\n      resizeHeight: DST_SIZE,\n      resizeQuality: 'high'\n    })\n      .then(bitmap => {\n        const status = bitmap.width === DST_SIZE && !!bitmap.close\n\n        if (bitmap.close) bitmap.close()\n        canvas = null\n        return status\n      })\n  })\n    .catch(() => false)\n}\n\nexport function get_supported_features (): Promise<SupportedFeatures> {\n  if (checked) return Promise.resolve(Object.assign({}, features))\n  if (checking) return checking.then(() => Object.assign({}, features))\n\n  features.canvas = check_canvas()\n  features.offscreen_canvas = check_offscreen_canvas()\n  features.may_be_worker = check_may_be_worker()\n  features.create_image_bitmap = check_create_image_bitmap()\n  features.safari_put_image_data_fix = check_safari_put_image_data_fix()\n\n  const bugCanvasOrientationRegion = check_bug_canvas_orientation_region_async()\n    .then(result => { features.bug_canvas_orientation_region = result })\n    .catch(() => {})\n\n  const bugImageBitmapOrientationRegion = check_bug_image_bitmap_orientation_region_async()\n    .then(result => { features.bug_image_bitmap_orientation_region = result })\n    .catch(() => {})\n\n  const cibResize = check_cib_resize_async()\n    .then(result => { features.cib_resize = result })\n    .catch(() => {})\n\n  checking = Promise.all([\n    bugCanvasOrientationRegion,\n    bugImageBitmapOrientationRegion,\n    cibResize\n  ]).then(() => {\n    checked = true\n    checking = null\n    return Object.assign({}, features)\n  }, err => {\n    checking = null\n    throw err\n  })\n\n  return checking\n}\n","import MathLib, { type MathResizeAndUnsharpOptions } from './mathlib'\nimport Pool from './pool'\nimport * as utils from './utils'\nimport createStages from './stepper'\nimport createRegions, { type Tile } from './tiler'\nimport * as supported_features from './supported_features'\nimport type {\n  Capabilities,\n  CreateCanvasPreference,\n  PicaFeaturesFlat,\n  Filter,\n  Limiter,\n  PicaCanvas,\n  PicaCanvasCtx,\n  PicaOptions,\n  PicaSource,\n  ResizeBufferOptions,\n  ResizeContext,\n  ResizeFeaturesMap,\n  ResizeParams,\n  TileResizeJob,\n  TileResizeJobBase,\n  ResizeOptions,\n  ResizeResult,\n  ResolvedPicaOptions,\n  StageEnv,\n  WorkerFeaturesResult,\n  WorkerMethod,\n  WorkerResizePayload\n} from './types'\n\nexport type {\n  PicaFeaturesFlat,\n  Filter,\n  PicaCanvas,\n  PicaOptions,\n  PicaSource,\n  ResizeBufferOptions,\n  ResizeOptions,\n  CibResizeQuality\n} from './types'\n\ndeclare const __PICA_WORKER_SRC__: string | undefined\n\nconst WORKER_SRC = typeof __PICA_WORKER_SRC__ !== 'undefined' ? __PICA_WORKER_SRC__ : ''\n\nlet concurrency = 1\nif (typeof navigator !== 'undefined') {\n  concurrency = Math.min(navigator.hardwareConcurrency || 1, 4)\n}\n\nconst DEFAULT_PICA_OPTS: ResolvedPicaOptions = {\n  tile: 1024,\n  concurrency,\n  features: ['js', 'wasm', 'ww'],\n  idle: 2000,\n}\n\nconst DEFAULT_RESIZE_OPTS = {\n  filter: 'mks2013',\n  unsharpAmount: 0,\n  unsharpRadius: 0.0,\n  unsharpThreshold: 0\n}\n\n// //////////////////////////////////////////////////////////////////////////////\n// API methods\n\nexport class Pica {\n  private options: ResolvedPicaOptions\n  private __limit: Limiter\n  private resize_features: ResizeFeaturesMap\n  private __workersPool: Pool<Worker> | null\n  private capabilities: Capabilities\n  private __requested_features: PicaFeaturesFlat\n  private __mathlib: MathLib | null\n  private __initPromise?: Promise<this>\n\n  constructor (options?: PicaOptions) {\n    this.options = Object.assign({}, DEFAULT_PICA_OPTS, options || {})\n\n    const workerRequested = this.options.features.indexOf('ww') >= 0 || this.options.features.indexOf('all') >= 0\n\n    if (workerRequested && !this.options.workerURL && !WORKER_SRC) {\n      throw new Error('Pica: cannot use WebWorker without workerURL')\n    }\n\n    this.__limit = utils.limiter(this.options.concurrency)\n\n    // List of enabled resize methods, according to options & browser/node.js\n    this.resize_features = {\n      js: false, // pure JS implementation, can be disabled for testing\n      wasm: false, // webassembly implementation for heavy functions\n      cib: false, // resize via createImageBitmap (only FF at this moment)\n      ww: false // webworkers\n    }\n\n    this.__workersPool = null\n    this.capabilities = {\n      worker: false,\n      ww_offscreen_canvas: false,\n      canvas: false,\n      offscreen_canvas: false,\n      may_be_worker: false,\n      create_image_bitmap: false,\n      safari_put_image_data_fix: false,\n      bug_canvas_orientation_region: true,\n      bug_image_bitmap_orientation_region: true,\n      cib_resize: false\n    }\n\n    // Store requested features for webworkers\n    this.__requested_features = []\n\n    this.__mathlib = null\n  }\n\n  init (): Promise<this> {\n    if (this.__initPromise) return this.__initPromise\n\n    this.__initPromise = this.__init()\n\n    return this.__initPromise\n  }\n\n  private async __init (): Promise<this> {\n    let features = this.options.features.slice()\n\n    if (features.indexOf('all') >= 0) {\n      features = ['cib', 'wasm', 'js', 'ww']\n    }\n\n    this.__requested_features = features\n\n    this.__mathlib = new MathLib(features)\n\n    const result = await supported_features.get_supported_features()\n    Object.assign(this.capabilities, result)\n\n    if (this.capabilities.cib_resize && features.indexOf('cib') >= 0) {\n      this.resize_features.cib = true\n    }\n\n    // Check WebWorker support if requested\n    if (this.capabilities.may_be_worker && features.indexOf('ww') >= 0 && (WORKER_SRC || this.options.workerURL)) {\n      this.__workersPool = new Pool(() => this.__createWorkerSlot(), this.options.idle)\n    }\n\n    if (this.__workersPool) {\n      try {\n        const result = await this.__invokeWorker<WorkerFeaturesResult>('get_supported_features')\n        const resultData = result && result.data\n        if (resultData) {\n          this.capabilities.worker = true\n          this.resize_features.ww = true\n          this.capabilities.ww_offscreen_canvas = !!resultData.offscreen_canvas\n        }\n      } catch (__) {}\n    }\n\n    const mathlib = await this.__mathlib.init()\n    // Copy detected resize methods\n    Object.assign(this.resize_features, mathlib.features)\n\n    return this\n  }\n\n  createCanvas (width: number, height: number, preferOffscreen?: CreateCanvasPreference): PicaCanvas {\n    if (preferOffscreen && this.capabilities.offscreen_canvas) {\n      return new OffscreenCanvas(width, height)\n    }\n\n    if (this.capabilities.canvas) {\n      const canvas = document.createElement('canvas')\n      canvas.width = width\n      canvas.height = height\n      return canvas\n    }\n\n    if (this.capabilities.ww_offscreen_canvas) {\n      return new OffscreenCanvas(width, height)\n    }\n\n    throw new Error('Pica: cannot create canvas')\n  }\n\n  private __createWorkerSlot (): { value: Worker, destroy: () => void } {\n    if (this.options.workerURL) {\n      const worker = new Worker(String(this.options.workerURL))\n      return { value: worker, destroy () { worker.terminate() } }\n    }\n\n    if (WORKER_SRC) {\n      const objectURL = window.URL.createObjectURL(new Blob([WORKER_SRC], { type: 'text/javascript' }))\n      const worker = new Worker(objectURL)\n      return {\n        value: worker,\n        destroy () {\n          worker.terminate()\n          if (typeof window !== 'undefined') {\n            window.URL?.revokeObjectURL?.(objectURL)\n          }\n        }\n      }\n    }\n\n    throw new Error('Pica: no worker source available')\n  }\n\n  // Call resizer in webworker or locally, depending on config\n  private __invokeWorker<TResult> (\n    method: WorkerMethod,\n    payload?: Record<string, unknown>,\n    transfer?: Transferable[],\n    opts?: { cancelToken?: Promise<unknown> }\n  ): Promise<TResult> {\n    return new Promise((resolve, reject) => {\n      const w = this.__workersPool!.acquire()\n\n      if (opts && opts.cancelToken) opts.cancelToken.catch(err => reject(err))\n\n      w.value.onmessage = ev => {\n        w.release()\n\n        if (ev.data.err) reject(ev.data.err)\n        else resolve(ev.data)\n      }\n\n      w.value.postMessage(Object.assign({ method }, payload || {}), transfer || [])\n    })\n  }\n\n  private async __invokeResize (tileJob: TileResizeJob, ctx: ResizeContext): Promise<ResizeResult> {\n    await Promise.resolve()\n\n    if (!this.resize_features.ww) {\n    // not possible to have ImageBitmap here if user disabled WW\n      if (tileJob.kind !== 'array') throw new Error('Pica: resize tile data is missing')\n\n      const mathOpts: MathResizeAndUnsharpOptions = {\n        src: tileJob.src,\n        width: tileJob.width,\n        height: tileJob.height,\n        toWidth: tileJob.toWidth,\n        toHeight: tileJob.toHeight,\n        scaleX: tileJob.scaleX,\n        scaleY: tileJob.scaleY,\n        offsetX: tileJob.offsetX,\n        offsetY: tileJob.offsetY,\n        filter: tileJob.filter,\n        unsharpAmount: tileJob.unsharpAmount,\n        unsharpRadius: tileJob.unsharpRadius,\n        unsharpThreshold: tileJob.unsharpThreshold\n      }\n\n      return { kind: 'array', data: this.__mathlib!.resizeAndUnsharp(mathOpts) }\n    }\n\n    const transfer = []\n\n    if (tileJob.kind === 'array') transfer.push(tileJob.src.buffer)\n    else transfer.push(tileJob.src)\n\n    return this.__invokeWorker<ResizeResult>(\n      'resize',\n      {\n        job: tileJob,\n        features: this.__requested_features\n      } satisfies Omit<WorkerResizePayload, 'method'>,\n      transfer,\n      ctx\n    )\n  }\n\n  // this function can return promise if createImageBitmap is used\n  private __extractTileData (\n    tile: Tile,\n    from: PicaSource,\n    stageEnv: StageEnv,\n    extractTo: TileResizeJobBase\n  ): TileResizeJob {\n    if (this.resize_features.ww && this.capabilities.ww_offscreen_canvas) {\n      this.debug('Create tile imageBitmap')\n\n      const tileCanvas = this.createCanvas(tile.width, tile.height, { preferOffscreen: true })\n      const tileCtx = tileCanvas.getContext('2d') as PicaCanvasCtx\n\n      tileCtx.drawImage(stageEnv.srcImageBitmap || from,\n        tile.x, tile.y, tile.width, tile.height,\n        0, 0, tile.width, tile.height)\n\n      if (!('transferToImageBitmap' in tileCanvas)) {\n        throw new Error('Pica: offscreen canvas is not available for worker transfer')\n      }\n\n      return Object.assign({}, extractTo, {\n        kind: 'bitmap' as const,\n        src: tileCanvas.transferToImageBitmap()\n      })\n\n    // Direct region extraction, intentionally disabled. This can be faster,\n    // but has known EXIF orientation bugs in some browsers.\n    //\n    // return createImageBitmap(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height)\n    //   .then(bitmap => {\n    //     extractTo.src = bitmap;\n    //     return extractTo;\n    //   });\n    }\n\n    // Extract tile RGBA buffer, depending on input type\n    if (utils.isCanvas(from)) {\n      if (!stageEnv.srcCtx) stageEnv.srcCtx = from.getContext('2d') as PicaCanvasCtx\n\n      // If input is Canvas - extract region data directly\n      this.debug('Get tile pixel data')\n      return Object.assign({}, extractTo, {\n        kind: 'array' as const,\n        src: stageEnv.srcCtx.getImageData(tile.x, tile.y, tile.width, tile.height).data\n      })\n    }\n\n    // If input is Image or decoded to ImageBitmap,\n    // draw region to temporary canvas and extract data from it\n    //\n    // Note! Attempt to reuse this canvas causes significant slowdown in chrome\n    //\n    this.debug('Draw tile imageBitmap/image to temporary canvas')\n\n    const tmpCanvas = this.createCanvas(tile.width, tile.height, { preferOffscreen: true })\n\n    const tmpCtx = tmpCanvas.getContext('2d') as PicaCanvasCtx\n    tmpCtx.globalCompositeOperation = 'copy'\n    tmpCtx.drawImage(stageEnv.srcImageBitmap || from,\n      tile.x, tile.y, tile.width, tile.height,\n      0, 0, tile.width, tile.height)\n\n    this.debug('Get tile pixel data')\n\n    const src = tmpCtx.getImageData(0, 0, tile.width, tile.height).data\n\n    // Safari 12 workaround\n    // https://github.com/nodeca/pica/issues/199\n    tmpCanvas.width = tmpCanvas.height = 0\n\n    return Object.assign({}, extractTo, {\n      kind: 'array' as const,\n      src\n    })\n  }\n\n  private __landTileData (tile: Tile, result: ResizeResult, stageEnv: StageEnv): null {\n    if (result.kind === 'bitmap') {\n      stageEnv.toCtx!.drawImage(result.data, tile.toX, tile.toY)\n      result.data.close()\n      return null\n    }\n\n    this.debug('Draw tile')\n\n    const toImageData = stageEnv.toCtx!.createImageData(tile.toWidth, tile.toHeight)\n    toImageData.data.set(result.data)\n\n    if (this.capabilities.safari_put_image_data_fix) {\n    // Safari draws thin white stripes between tiles without this fix\n      stageEnv.toCtx!.putImageData(toImageData, tile.toX, tile.toY,\n        tile.toInnerX - tile.toX, tile.toInnerY - tile.toY,\n        tile.toInnerWidth + 1e-5, tile.toInnerHeight + 1e-5)\n    } else {\n      stageEnv.toCtx!.putImageData(toImageData, tile.toX, tile.toY,\n        tile.toInnerX - tile.toX, tile.toInnerY - tile.toY,\n        tile.toInnerWidth, tile.toInnerHeight)\n    }\n\n    return null\n  }\n\n  private async __tileAndResize (\n    from: PicaSource,\n    to: PicaCanvas,\n    resizeParams: ResizeParams,\n    ctx: ResizeContext\n  ): Promise<PicaCanvas> {\n    const stageEnv: StageEnv = {\n      srcCtx: null,\n      srcImageBitmap: null,\n      isImageBitmapReused: false,\n      toCtx: null\n    }\n\n    const processTile = (tile: Tile) => this.__limit(async () => {\n      if (ctx.canceled) return ctx.cancelToken\n\n      const tileJob: TileResizeJobBase = {\n        width: tile.width,\n        height: tile.height,\n        toWidth: tile.toWidth,\n        toHeight: tile.toHeight,\n        scaleX: tile.scaleX,\n        scaleY: tile.scaleY,\n        offsetX: tile.offsetX,\n        offsetY: tile.offsetY,\n        filter: resizeParams.filter,\n        unsharpAmount: resizeParams.unsharpAmount,\n        unsharpRadius: resizeParams.unsharpRadius,\n        unsharpThreshold: resizeParams.unsharpThreshold\n      }\n\n      this.debug('Invoke resize math')\n\n      const extractedTileJob = await this.__extractTileData(tile, from, stageEnv, tileJob)\n\n      this.debug('Invoke resize math')\n      const result = await this.__invokeResize(extractedTileJob, ctx)\n\n      if (ctx.canceled) return ctx.cancelToken\n      return this.__landTileData(tile, result, stageEnv)\n    })\n\n    // Need to normalize data source first. It can be canvas or image.\n    // If image - try to decode in background if possible\n    await Promise.resolve()\n\n    stageEnv.toCtx = to.getContext('2d') as PicaCanvasCtx\n\n    if (utils.isCanvas(from)) {\n    // Source is ready as-is.\n    } else if (utils.isImageBitmap(from)) {\n      stageEnv.srcImageBitmap = from\n      stageEnv.isImageBitmapReused = true\n    } else if (utils.isImage(from)) {\n    // try to decode image in background for faster next operations;\n    // if we're using offscreen canvas, cib is called per tile, so not needed here\n      if (this.capabilities.create_image_bitmap) {\n        this.debug('Decode image via createImageBitmap')\n\n        // Suppress error to use fallback, if method fails\n        // https://github.com/nodeca/pica/issues/190\n        try {\n          stageEnv.srcImageBitmap = await createImageBitmap(from)\n        } catch (__) {}\n      }\n    } else {\n      throw new Error('Pica: \".from\" should be Image, Canvas or ImageBitmap')\n    }\n\n    if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n    this.debug('Calculate tiles')\n\n    //\n    // Here we are with \"normalized\" source,\n    // follow to tiling\n    //\n\n    const regions = createRegions({\n      width: resizeParams.width,\n      height: resizeParams.height,\n      srcTileSize: this.options.tile,\n      toWidth: resizeParams.toWidth,\n      toHeight: resizeParams.toHeight,\n      destTileBorder: Math.ceil(Math.max(3, 2.5 * resizeParams.unsharpRadius | 0))\n    })\n\n    const jobs = regions.map(tile => processTile(tile))\n\n    function cleanup (stageEnv: StageEnv) {\n      if (stageEnv.srcImageBitmap) {\n        if (!stageEnv.isImageBitmapReused) stageEnv.srcImageBitmap.close()\n        stageEnv.srcImageBitmap = null\n      }\n    }\n\n    this.debug('Process tiles')\n\n    try {\n      await Promise.all(jobs)\n      this.debug('Finished!')\n      cleanup(stageEnv)\n      return to\n    } catch (err) {\n      cleanup(stageEnv)\n      throw err\n    }\n  }\n\n  private async __planStagesAndResize (\n    from: PicaSource,\n    to: PicaCanvas,\n    resizeParams: ResizeParams,\n    ctx: ResizeContext\n  ): Promise<PicaCanvas> {\n    let src: PicaSource = from\n    let srcWidth = resizeParams.width\n    let srcHeight = resizeParams.height\n\n    const stages = createStages(\n      resizeParams.width,\n      resizeParams.height,\n      resizeParams.toWidth,\n      resizeParams.toHeight,\n      this.options.tile\n    )\n\n    while (stages.length > 0) {\n      if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n      const [toWidth, toHeight] = stages.shift()!\n      const isLastStage = stages.length === 0\n\n      // Optimization for legacy filters -\n      // only use user-defined quality for the last stage,\n      // use simpler (Hamming) filter for the first stages where\n      // scale factor is large enough (more than 2-3)\n      //\n      // For advanced filters (mks2013 and custom) - skip optimization,\n      // because need to apply sharpening every time\n      let filter: Filter\n      if (isLastStage || !utils.is_cib_filter(resizeParams.filter)) filter = resizeParams.filter\n      else if (resizeParams.filter === 'box') filter = 'box'\n      else filter = 'hamming'\n\n      const stageParams: ResizeParams = { ...resizeParams, filter, width: srcWidth, height: srcHeight, toWidth, toHeight }\n      const dest = isLastStage ? to : this.createCanvas(toWidth, toHeight, { preferOffscreen: true })\n\n      // Previous intermediate canvas (not the original `from`) can be freed after use\n      const prevTmp = src !== from ? src as PicaCanvas : undefined\n\n      try {\n        await this.__tileAndResize(src, dest, stageParams, ctx)\n      } finally {\n        // Safari 12 workaround: https://github.com/nodeca/pica/issues/199\n        if (prevTmp) prevTmp.width = prevTmp.height = 0\n      }\n\n      src = dest\n      srcWidth = toWidth\n      srcHeight = toHeight\n    }\n\n    return to\n  }\n\n  private async __resizeViaCreateImageBitmap (\n    from: PicaSource,\n    to: PicaCanvas,\n    resizeParams: ResizeParams,\n    ctx: ResizeContext\n  ): Promise<PicaCanvas> {\n    let toCtx: PicaCanvasCtx | null = to.getContext('2d') as PicaCanvasCtx\n\n    this.debug('Resize via createImageBitmap()')\n\n    const imageBitmap = await createImageBitmap(from, {\n      resizeWidth: resizeParams.toWidth,\n      resizeHeight: resizeParams.toHeight,\n      resizeQuality: utils.cib_quality_name(utils.filter_to_cib_quality(resizeParams.filter) ?? 3)\n    })\n    if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n    // if no unsharp - draw directly to output canvas\n    if (!resizeParams.unsharpAmount) {\n      toCtx.drawImage(imageBitmap, 0, 0)\n      imageBitmap.close()\n      toCtx = null\n\n      this.debug('Finished!')\n\n      return to\n    }\n\n    this.debug('Unsharp result')\n\n    let tmpCanvas: PicaCanvas | null = this.createCanvas(resizeParams.toWidth, resizeParams.toHeight)\n\n    let tmpCtx: PicaCanvasCtx | null = tmpCanvas.getContext('2d') as PicaCanvasCtx\n\n    tmpCtx.drawImage(imageBitmap, 0, 0)\n    imageBitmap.close()\n\n    let iData: ImageData | null = tmpCtx.getImageData(0, 0, resizeParams.toWidth, resizeParams.toHeight)\n\n    this.__mathlib!.unsharp_mask(\n      iData.data,\n      resizeParams.toWidth,\n      resizeParams.toHeight,\n      resizeParams.unsharpAmount,\n      resizeParams.unsharpRadius,\n      resizeParams.unsharpThreshold\n    )\n\n    toCtx.putImageData(iData, 0, 0)\n\n    // Safari 12 workaround\n    // https://github.com/nodeca/pica/issues/199\n    tmpCanvas.width = tmpCanvas.height = 0\n\n    iData = tmpCtx = tmpCanvas = toCtx = null\n\n    this.debug('Finished!')\n\n    return to\n  }\n\n  async resize<TCanvas extends PicaCanvas> (\n    from: PicaSource,\n    to: TCanvas,\n    options?: ResizeOptions\n  ): Promise<TCanvas> {\n    this.debug('Start resize...')\n\n    const requested: ResizeOptions = {}\n\n    if (options) {\n      Object.assign(requested, options)\n    }\n\n    let filter: Filter = (requested.filter || DEFAULT_RESIZE_OPTS.filter) as Filter\n\n    // Legacy `.quality` option\n    if (Object.prototype.hasOwnProperty.call(requested, 'quality')) {\n      const quality = requested.quality\n      if (typeof quality !== 'number' || quality < 0 || quality > 3) {\n        throw new Error(`Pica: .quality should be [0..3], got ${quality}`)\n      }\n      filter = utils.cib_quality_filter(quality)\n    }\n\n    const resizeParams: ResizeParams = {\n      filter,\n      unsharpAmount: requested.unsharpAmount || DEFAULT_RESIZE_OPTS.unsharpAmount,\n      unsharpRadius: requested.unsharpRadius || DEFAULT_RESIZE_OPTS.unsharpRadius,\n      unsharpThreshold: requested.unsharpThreshold || DEFAULT_RESIZE_OPTS.unsharpThreshold,\n      width: utils.isImage(from) ? from.naturalWidth : from.width,\n      height: utils.isImage(from) ? from.naturalHeight : from.height,\n      toWidth: to.width,\n      toHeight: to.height\n    }\n\n    if (resizeParams.unsharpRadius > 2) resizeParams.unsharpRadius = 2\n\n    // Prevent stepper from infinite loop\n    if (to.width === 0 || to.height === 0) {\n      return Promise.reject(new Error(`Invalid output size: ${to.width}x${to.height}`))\n    }\n\n    const ctx: ResizeContext = {\n      cancelToken: requested.cancelToken,\n      canceled: false\n    }\n\n    if (ctx.cancelToken) {\n    // Wrap cancelToken to avoid successive resolve & set flag\n      ctx.cancelToken = ctx.cancelToken.then(\n        data => { ctx.canceled = true; throw data },\n        err => { ctx.canceled = true; throw err }\n      )\n    }\n\n    await this.init()\n\n    if (ctx.canceled) return ctx.cancelToken as Promise<TCanvas>\n\n    // createImageBitmap doesn't work for images (Image, ImageBitmap) with\n    // Exif orientation in Chrome. Enforce canvas use for such inputs.\n    // see https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n    if (this.capabilities.bug_image_bitmap_orientation_region &&\n        (utils.isImage(from) || (utils.isImageBitmap(from)))) {\n      const tmpCanvas = this.createCanvas(resizeParams.width, resizeParams.height)\n      const tmpCtx = tmpCanvas.getContext('2d') as PicaCanvasCtx\n      tmpCtx.drawImage(from, 0, 0)\n      from = tmpCanvas\n    }\n\n    // if createImageBitmap supports resize, just do it and return\n    if (this.resize_features.cib) {\n      if (utils.is_cib_filter(resizeParams.filter)) {\n        return this.__resizeViaCreateImageBitmap(from, to, resizeParams, ctx) as Promise<TCanvas>\n      }\n\n      this.debug('cib is enabled, but not supports provided filter, fallback to manual math')\n    }\n\n    if (!this.capabilities.canvas && !this.capabilities.offscreen_canvas) {\n      const err = new Error('Pica: cannot use getImageData on canvas, ' +\n                        \"make sure fingerprinting protection isn't enabled\")\n      // @ts-ignore\n      err.code = 'ERR_GET_IMAGE_DATA'\n      throw err\n    }\n\n    //\n    // No easy way, let's resize manually via arrays\n    //\n\n    return this.__planStagesAndResize(from, to, resizeParams, ctx) as Promise<TCanvas>\n  }\n\n  // RGBA buffer resize\n  //\n  async resizeBuffer (options: ResizeBufferOptions): Promise<Uint8Array> {\n    const opts = Object.assign({}, DEFAULT_RESIZE_OPTS, options)\n\n    // Legacy `.quality` option\n    if (Object.prototype.hasOwnProperty.call(opts, 'quality')) {\n      const quality = opts.quality\n      if (typeof quality !== 'number' || quality < 0 || quality > 3) {\n        throw new Error(`Pica: .quality should be [0..3], got ${quality}`)\n      }\n      opts.filter = utils.cib_quality_filter(quality)\n    }\n\n    await this.init()\n    if (!this.__mathlib) throw new Error('Pica: math library is not initialized')\n\n    const mathOpts: MathResizeAndUnsharpOptions = {\n      src: opts.src,\n      width: opts.width,\n      height: opts.height,\n      toWidth: opts.toWidth,\n      toHeight: opts.toHeight,\n      dest: opts.dest,\n      scaleX: opts.toWidth / opts.width,\n      scaleY: opts.toHeight / opts.height,\n      offsetX: 0,\n      offsetY: 0,\n      filter: opts.filter,\n      unsharpAmount: opts.unsharpAmount,\n      unsharpRadius: opts.unsharpRadius,\n      unsharpThreshold: opts.unsharpThreshold\n    }\n\n    return this.__mathlib.resizeAndUnsharp(mathOpts)\n  }\n\n  async toBlob (canvas: HTMLCanvasElement | OffscreenCanvas, mimeType?: string, quality?: number): Promise<Blob> {\n    mimeType = mimeType || 'image/png'\n\n    // Ordinary Canvas\n    if ('toBlob' in canvas && canvas.toBlob) {\n      return new Promise(resolve => {\n        canvas.toBlob(blob => resolve(blob as Blob), mimeType, quality)\n      })\n    }\n\n    // OffscreenCanvas\n    if ('convertToBlob' in canvas && canvas.convertToBlob) {\n      return canvas.convertToBlob({\n        type: mimeType,\n        quality\n      })\n    }\n\n    // Fallback for old browsers\n    const asString = atob((canvas as HTMLCanvasElement).toDataURL(mimeType, quality).split(',')[1])\n    const len = asString.length\n    const asBuffer = new Uint8Array(len)\n\n    for (let i = 0; i < len; i++) {\n      asBuffer[i] = asString.charCodeAt(i)\n    }\n\n    return new Blob([asBuffer], { type: mimeType })\n  }\n\n  debug (..._args: unknown[]): void {}\n}\n\nexport default function pica (options?: PicaOptions): Pica {\n  return new Pica(options)\n}\n"],"x_google_ignoreList":[3],"mappings":"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"}