]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js
Update to iD v2.20.0
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js
index 2f5ed53516c93df077c2ee17c443a2c48406cb4f..c1e2898718a58fb3b5dc5369460b3c898628beb5 100644 (file)
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mapillary = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-'use strict';
-
-var Queue = require('tinyqueue');
-
-module.exports = polylabel;
-module.exports.default = polylabel;
-
-function polylabel(polygon, precision, debug) {
-    precision = precision || 1.0;
-
-    // find the bounding box of the outer ring
-    var minX, minY, maxX, maxY;
-    for (var i = 0; i < polygon[0].length; i++) {
-        var p = polygon[0][i];
-        if (!i || p[0] < minX) minX = p[0];
-        if (!i || p[1] < minY) minY = p[1];
-        if (!i || p[0] > maxX) maxX = p[0];
-        if (!i || p[1] > maxY) maxY = p[1];
-    }
-
-    var width = maxX - minX;
-    var height = maxY - minY;
-    var cellSize = Math.min(width, height);
-    var h = cellSize / 2;
-
-    // a priority queue of cells in order of their "potential" (max distance to polygon)
-    var cellQueue = new Queue(null, compareMax);
-
-    if (cellSize === 0) return [minX, minY];
-
-    // cover polygon with initial cells
-    for (var x = minX; x < maxX; x += cellSize) {
-        for (var y = minY; y < maxY; y += cellSize) {
-            cellQueue.push(new Cell(x + h, y + h, h, polygon));
-        }
-    }
-
-    // take centroid as the first best guess
-    var bestCell = getCentroidCell(polygon);
-
-    // special case for rectangular polygons
-    var bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, polygon);
-    if (bboxCell.d > bestCell.d) bestCell = bboxCell;
-
-    var numProbes = cellQueue.length;
-
-    while (cellQueue.length) {
-        // pick the most promising cell from the queue
-        var cell = cellQueue.pop();
-
-        // update the best cell if we found a better one
-        if (cell.d > bestCell.d) {
-            bestCell = cell;
-            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
-        }
-
-        // do not drill down further if there's no chance of a better solution
-        if (cell.max - bestCell.d <= precision) continue;
-
-        // split the cell into four cells
-        h = cell.h / 2;
-        cellQueue.push(new Cell(cell.x - h, cell.y - h, h, polygon));
-        cellQueue.push(new Cell(cell.x + h, cell.y - h, h, polygon));
-        cellQueue.push(new Cell(cell.x - h, cell.y + h, h, polygon));
-        cellQueue.push(new Cell(cell.x + h, cell.y + h, h, polygon));
-        numProbes += 4;
-    }
-
-    if (debug) {
-        console.log('num probes: ' + numProbes);
-        console.log('best distance: ' + bestCell.d);
-    }
-
-    return [bestCell.x, bestCell.y];
-}
-
-function compareMax(a, b) {
-    return b.max - a.max;
-}
-
-function Cell(x, y, h, polygon) {
-    this.x = x; // cell center x
-    this.y = y; // cell center y
-    this.h = h; // half the cell size
-    this.d = pointToPolygonDist(x, y, polygon); // distance from cell center to polygon
-    this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
-}
-
-// signed distance from point to polygon outline (negative if point is outside)
-function pointToPolygonDist(x, y, polygon) {
-    var inside = false;
-    var minDistSq = Infinity;
-
-    for (var k = 0; k < polygon.length; k++) {
-        var ring = polygon[k];
-
-        for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
-            var a = ring[i];
-            var b = ring[j];
-
-            if ((a[1] > y !== b[1] > y) &&
-                (x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0])) inside = !inside;
-
-            minDistSq = Math.min(minDistSq, getSegDistSq(x, y, a, b));
-        }
-    }
-
-    return (inside ? 1 : -1) * Math.sqrt(minDistSq);
-}
-
-// get polygon centroid
-function getCentroidCell(polygon) {
-    var area = 0;
-    var x = 0;
-    var y = 0;
-    var points = polygon[0];
-
-    for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) {
-        var a = points[i];
-        var b = points[j];
-        var f = a[0] * b[1] - b[0] * a[1];
-        x += (a[0] + b[0]) * f;
-        y += (a[1] + b[1]) * f;
-        area += f * 3;
-    }
-    if (area === 0) return new Cell(points[0][0], points[0][1], 0, polygon);
-    return new Cell(x / area, y / area, 0, polygon);
-}
-
-// get squared distance from a point to a segment
-function getSegDistSq(px, py, a, b) {
-
-    var x = a[0];
-    var y = a[1];
-    var dx = b[0] - x;
-    var dy = b[1] - y;
-
-    if (dx !== 0 || dy !== 0) {
-
-        var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
-
-        if (t > 1) {
-            x = b[0];
-            y = b[1];
-
-        } else if (t > 0) {
-            x += dx * t;
-            y += dy * t;
-        }
-    }
-
-    dx = px - x;
-    dy = py - y;
-
-    return dx * dx + dy * dy;
-}
-
-},{"tinyqueue":243}],2:[function(require,module,exports){
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Ported from Webkit
- * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h
- */
-
-module.exports = UnitBezier;
-
-function UnitBezier(p1x, p1y, p2x, p2y) {
-    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
-    this.cx = 3.0 * p1x;
-    this.bx = 3.0 * (p2x - p1x) - this.cx;
-    this.ax = 1.0 - this.cx - this.bx;
-
-    this.cy = 3.0 * p1y;
-    this.by = 3.0 * (p2y - p1y) - this.cy;
-    this.ay = 1.0 - this.cy - this.by;
-
-    this.p1x = p1x;
-    this.p1y = p2y;
-    this.p2x = p2x;
-    this.p2y = p2y;
-}
-
-UnitBezier.prototype.sampleCurveX = function(t) {
-    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
-    return ((this.ax * t + this.bx) * t + this.cx) * t;
-};
-
-UnitBezier.prototype.sampleCurveY = function(t) {
-    return ((this.ay * t + this.by) * t + this.cy) * t;
-};
-
-UnitBezier.prototype.sampleCurveDerivativeX = function(t) {
-    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
-};
-
-UnitBezier.prototype.solveCurveX = function(x, epsilon) {
-    if (typeof epsilon === 'undefined') epsilon = 1e-6;
-
-    var t0, t1, t2, x2, i;
-
-    // First try a few iterations of Newton's method -- normally very fast.
-    for (t2 = x, i = 0; i < 8; i++) {
-
-        x2 = this.sampleCurveX(t2) - x;
-        if (Math.abs(x2) < epsilon) return t2;
-
-        var d2 = this.sampleCurveDerivativeX(t2);
-        if (Math.abs(d2) < 1e-6) break;
-
-        t2 = t2 - x2 / d2;
-    }
-
-    // Fall back to the bisection method for reliability.
-    t0 = 0.0;
-    t1 = 1.0;
-    t2 = x;
-
-    if (t2 < t0) return t0;
-    if (t2 > t1) return t1;
-
-    while (t0 < t1) {
-
-        x2 = this.sampleCurveX(t2);
-        if (Math.abs(x2 - x) < epsilon) return t2;
-
-        if (x > x2) {
-            t0 = t2;
-        } else {
-            t1 = t2;
-        }
-
-        t2 = (t1 - t0) * 0.5 + t0;
-    }
-
-    // Failure.
-    return t2;
-};
-
-UnitBezier.prototype.solve = function(x, epsilon) {
-    return this.sampleCurveY(this.solveCurveX(x, epsilon));
-};
-
-},{}],3:[function(require,module,exports){
-'use strict'
-
-exports.byteLength = byteLength
-exports.toByteArray = toByteArray
-exports.fromByteArray = fromByteArray
-
-var lookup = []
-var revLookup = []
-var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
-
-var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-for (var i = 0, len = code.length; i < len; ++i) {
-  lookup[i] = code[i]
-  revLookup[code.charCodeAt(i)] = i
-}
-
-revLookup['-'.charCodeAt(0)] = 62
-revLookup['_'.charCodeAt(0)] = 63
-
-function placeHoldersCount (b64) {
-  var len = b64.length
-  if (len % 4 > 0) {
-    throw new Error('Invalid string. Length must be a multiple of 4')
-  }
-
-  // the number of equal signs (place holders)
-  // if there are two placeholders, than the two characters before it
-  // represent one byte
-  // if there is only one, then the three characters before it represent 2 bytes
-  // this is just a cheap hack to not do indexOf twice
-  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
-}
-
-function byteLength (b64) {
-  // base64 is 4/3 + up to two characters of the original data
-  return (b64.length * 3 / 4) - placeHoldersCount(b64)
-}
-
-function toByteArray (b64) {
-  var i, l, tmp, placeHolders, arr
-  var len = b64.length
-  placeHolders = placeHoldersCount(b64)
-
-  arr = new Arr((len * 3 / 4) - placeHolders)
-
-  // if there are placeholders, only get up to the last complete 4 chars
-  l = placeHolders > 0 ? len - 4 : len
-
-  var L = 0
-
-  for (i = 0; i < l; i += 4) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
-    arr[L++] = (tmp >> 16) & 0xFF
-    arr[L++] = (tmp >> 8) & 0xFF
-    arr[L++] = tmp & 0xFF
-  }
-
-  if (placeHolders === 2) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
-    arr[L++] = tmp & 0xFF
-  } else if (placeHolders === 1) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
-    arr[L++] = (tmp >> 8) & 0xFF
-    arr[L++] = tmp & 0xFF
-  }
-
-  return arr
-}
-
-function tripletToBase64 (num) {
-  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
-}
-
-function encodeChunk (uint8, start, end) {
-  var tmp
-  var output = []
-  for (var i = start; i < end; i += 3) {
-    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-    output.push(tripletToBase64(tmp))
-  }
-  return output.join('')
-}
-
-function fromByteArray (uint8) {
-  var tmp
-  var len = uint8.length
-  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
-  var output = ''
-  var parts = []
-  var maxChunkLength = 16383 // must be multiple of 3
-
-  // go through the array every three bytes, we'll deal with trailing stuff later
-  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
-    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
-  }
-
-  // pad the end with zeros, but make sure to not forget the extra bytes
-  if (extraBytes === 1) {
-    tmp = uint8[len - 1]
-    output += lookup[tmp >> 2]
-    output += lookup[(tmp << 4) & 0x3F]
-    output += '=='
-  } else if (extraBytes === 2) {
-    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
-    output += lookup[tmp >> 10]
-    output += lookup[(tmp >> 4) & 0x3F]
-    output += lookup[(tmp << 2) & 0x3F]
-    output += '='
-  }
-
-  parts.push(output)
-
-  return parts.join('')
-}
-
-},{}],4:[function(require,module,exports){
-
-},{}],5:[function(require,module,exports){
-/*!
- * Cross-Browser Split 1.1.1
- * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
- * Available under the MIT License
- * ECMAScript compliant, uniform cross-browser split method
- */
-
-/**
- * Splits a string into an array of strings using a regex or string separator. Matches of the
- * separator are not included in the result array. However, if `separator` is a regex that contains
- * capturing groups, backreferences are spliced into the result each time `separator` is matched.
- * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
- * cross-browser.
- * @param {String} str String to split.
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- * @example
- *
- * // Basic use
- * split('a b c d', ' ');
- * // -> ['a', 'b', 'c', 'd']
- *
- * // With limit
- * split('a b c d', ' ', 2);
- * // -> ['a', 'b']
- *
- * // Backreferences in result array
- * split('..word1 word2..', /([a-z]+)(\d+)/i);
- * // -> ['..', 'word', '1', ' ', 'word', '2', '..']
- */
-module.exports = (function split(undef) {
-
-  var nativeSplit = String.prototype.split,
-    compliantExecNpcg = /()??/.exec("")[1] === undef,
-    // NPCG: nonparticipating capturing group
-    self;
-
-  self = function(str, separator, limit) {
-    // If `separator` is not a regex, use `nativeSplit`
-    if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
-      return nativeSplit.call(str, separator, limit);
-    }
-    var output = [],
-      flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6
-      (separator.sticky ? "y" : ""),
-      // Firefox 3+
-      lastLastIndex = 0,
-      // Make `global` and avoid `lastIndex` issues by working with a copy
-      separator = new RegExp(separator.source, flags + "g"),
-      separator2, match, lastIndex, lastLength;
-    str += ""; // Type-convert
-    if (!compliantExecNpcg) {
-      // Doesn't need flags gy, but they don't hurt
-      separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
-    }
-    /* Values for `limit`, per the spec:
-     * If undefined: 4294967295 // Math.pow(2, 32) - 1
-     * If 0, Infinity, or NaN: 0
-     * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
-     * If negative number: 4294967296 - Math.floor(Math.abs(limit))
-     * If other: Type-convert, then use the above rules
-     */
-    limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1
-    limit >>> 0; // ToUint32(limit)
-    while (match = separator.exec(str)) {
-      // `separator.lastIndex` is not reliable cross-browser
-      lastIndex = match.index + match[0].length;
-      if (lastIndex > lastLastIndex) {
-        output.push(str.slice(lastLastIndex, match.index));
-        // Fix browsers whose `exec` methods don't consistently return `undefined` for
-        // nonparticipating capturing groups
-        if (!compliantExecNpcg && match.length > 1) {
-          match[0].replace(separator2, function() {
-            for (var i = 1; i < arguments.length - 2; i++) {
-              if (arguments[i] === undef) {
-                match[i] = undef;
-              }
-            }
-          });
-        }
-        if (match.length > 1 && match.index < str.length) {
-          Array.prototype.push.apply(output, match.slice(1));
-        }
-        lastLength = match[0].length;
-        lastLastIndex = lastIndex;
-        if (output.length >= limit) {
-          break;
-        }
-      }
-      if (separator.lastIndex === match.index) {
-        separator.lastIndex++; // Avoid an infinite loop
-      }
-    }
-    if (lastLastIndex === str.length) {
-      if (lastLength || !separator.test("")) {
-        output.push("");
-      }
-    } else {
-      output.push(str.slice(lastLastIndex));
-    }
-    return output.length > limit ? output.slice(0, limit) : output;
-  };
-
-  return self;
-})();
-
-},{}],6:[function(require,module,exports){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <https://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-var K_MAX_LENGTH = 0x7fffffff
-exports.kMaxLength = K_MAX_LENGTH
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Print warning and recommend using `buffer` v4.x which has an Object
- *               implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * We report that the browser does not support typed arrays if the are not subclassable
- * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
- * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
- * for __proto__ and has a buggy typed array implementation.
- */
-Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
-
-if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
-    typeof console.error === 'function') {
-  console.error(
-    'This browser lacks typed array (Uint8Array) support which is required by ' +
-    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
-  )
-}
-
-function typedArraySupport () {
-  // Can typed array instances can be augmented?
-  try {
-    var arr = new Uint8Array(1)
-    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
-    return arr.foo() === 42
-  } catch (e) {
-    return false
-  }
-}
-
-Object.defineProperty(Buffer.prototype, 'parent', {
-  enumerable: true,
-  get: function () {
-    if (!Buffer.isBuffer(this)) return undefined
-    return this.buffer
-  }
-})
-
-Object.defineProperty(Buffer.prototype, 'offset', {
-  enumerable: true,
-  get: function () {
-    if (!Buffer.isBuffer(this)) return undefined
-    return this.byteOffset
-  }
-})
-
-function createBuffer (length) {
-  if (length > K_MAX_LENGTH) {
-    throw new RangeError('The value "' + length + '" is invalid for option "size"')
-  }
-  // Return an augmented `Uint8Array` instance
-  var buf = new Uint8Array(length)
-  buf.__proto__ = Buffer.prototype
-  return buf
-}
-
-/**
- * The Buffer constructor returns instances of `Uint8Array` that have their
- * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
- * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
- * and the `Uint8Array` methods. Square bracket notation works as expected -- it
- * returns a single octet.
- *
- * The `Uint8Array` prototype remains unmodified.
- */
-
-function Buffer (arg, encodingOrOffset, length) {
-  // Common case.
-  if (typeof arg === 'number') {
-    if (typeof encodingOrOffset === 'string') {
-      throw new TypeError(
-        'The "string" argument must be of type string. Received type number'
-      )
-    }
-    return allocUnsafe(arg)
-  }
-  return from(arg, encodingOrOffset, length)
-}
-
-// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-if (typeof Symbol !== 'undefined' && Symbol.species != null &&
-    Buffer[Symbol.species] === Buffer) {
-  Object.defineProperty(Buffer, Symbol.species, {
-    value: null,
-    configurable: true,
-    enumerable: false,
-    writable: false
-  })
-}
-
-Buffer.poolSize = 8192 // not used by this implementation
-
-function from (value, encodingOrOffset, length) {
-  if (typeof value === 'string') {
-    return fromString(value, encodingOrOffset)
-  }
-
-  if (ArrayBuffer.isView(value)) {
-    return fromArrayLike(value)
-  }
-
-  if (value == null) {
-    throw TypeError(
-      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
-      'or Array-like Object. Received type ' + (typeof value)
-    )
-  }
-
-  if (isInstance(value, ArrayBuffer) ||
-      (value && isInstance(value.buffer, ArrayBuffer))) {
-    return fromArrayBuffer(value, encodingOrOffset, length)
-  }
-
-  if (typeof value === 'number') {
-    throw new TypeError(
-      'The "value" argument must not be of type number. Received type number'
-    )
-  }
-
-  var valueOf = value.valueOf && value.valueOf()
-  if (valueOf != null && valueOf !== value) {
-    return Buffer.from(valueOf, encodingOrOffset, length)
-  }
-
-  var b = fromObject(value)
-  if (b) return b
-
-  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
-      typeof value[Symbol.toPrimitive] === 'function') {
-    return Buffer.from(
-      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
-    )
-  }
-
-  throw new TypeError(
-    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
-    'or Array-like Object. Received type ' + (typeof value)
-  )
-}
-
-/**
- * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
- * if value is a number.
- * Buffer.from(str[, encoding])
- * Buffer.from(array)
- * Buffer.from(buffer)
- * Buffer.from(arrayBuffer[, byteOffset[, length]])
- **/
-Buffer.from = function (value, encodingOrOffset, length) {
-  return from(value, encodingOrOffset, length)
-}
-
-// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
-// https://github.com/feross/buffer/pull/148
-Buffer.prototype.__proto__ = Uint8Array.prototype
-Buffer.__proto__ = Uint8Array
-
-function assertSize (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('"size" argument must be of type number')
-  } else if (size < 0) {
-    throw new RangeError('The value "' + size + '" is invalid for option "size"')
-  }
-}
-
-function alloc (size, fill, encoding) {
-  assertSize(size)
-  if (size <= 0) {
-    return createBuffer(size)
-  }
-  if (fill !== undefined) {
-    // Only pay attention to encoding if it's a string. This
-    // prevents accidentally sending in a number that would
-    // be interpretted as a start offset.
-    return typeof encoding === 'string'
-      ? createBuffer(size).fill(fill, encoding)
-      : createBuffer(size).fill(fill)
-  }
-  return createBuffer(size)
-}
-
-/**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
-Buffer.alloc = function (size, fill, encoding) {
-  return alloc(size, fill, encoding)
-}
-
-function allocUnsafe (size) {
-  assertSize(size)
-  return createBuffer(size < 0 ? 0 : checked(size) | 0)
-}
-
-/**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
-Buffer.allocUnsafe = function (size) {
-  return allocUnsafe(size)
-}
-/**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
-Buffer.allocUnsafeSlow = function (size) {
-  return allocUnsafe(size)
-}
-
-function fromString (string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') {
-    encoding = 'utf8'
-  }
-
-  if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('Unknown encoding: ' + encoding)
-  }
-
-  var length = byteLength(string, encoding) | 0
-  var buf = createBuffer(length)
-
-  var actual = buf.write(string, encoding)
-
-  if (actual !== length) {
-    // Writing a hex string, for example, that contains invalid characters will
-    // cause everything after the first invalid character to be ignored. (e.g.
-    // 'abxxcd' will be treated as 'ab')
-    buf = buf.slice(0, actual)
-  }
-
-  return buf
-}
-
-function fromArrayLike (array) {
-  var length = array.length < 0 ? 0 : checked(array.length) | 0
-  var buf = createBuffer(length)
-  for (var i = 0; i < length; i += 1) {
-    buf[i] = array[i] & 255
-  }
-  return buf
-}
-
-function fromArrayBuffer (array, byteOffset, length) {
-  if (byteOffset < 0 || array.byteLength < byteOffset) {
-    throw new RangeError('"offset" is outside of buffer bounds')
-  }
-
-  if (array.byteLength < byteOffset + (length || 0)) {
-    throw new RangeError('"length" is outside of buffer bounds')
-  }
-
-  var buf
-  if (byteOffset === undefined && length === undefined) {
-    buf = new Uint8Array(array)
-  } else if (length === undefined) {
-    buf = new Uint8Array(array, byteOffset)
-  } else {
-    buf = new Uint8Array(array, byteOffset, length)
-  }
-
-  // Return an augmented `Uint8Array` instance
-  buf.__proto__ = Buffer.prototype
-  return buf
-}
-
-function fromObject (obj) {
-  if (Buffer.isBuffer(obj)) {
-    var len = checked(obj.length) | 0
-    var buf = createBuffer(len)
-
-    if (buf.length === 0) {
-      return buf
-    }
-
-    obj.copy(buf, 0, 0, len)
-    return buf
-  }
-
-  if (obj.length !== undefined) {
-    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
-      return createBuffer(0)
-    }
-    return fromArrayLike(obj)
-  }
-
-  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
-    return fromArrayLike(obj.data)
-  }
-}
-
-function checked (length) {
-  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
-  // length is NaN (which is otherwise coerced to zero.)
-  if (length >= K_MAX_LENGTH) {
-    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
-  }
-  return length | 0
-}
-
-function SlowBuffer (length) {
-  if (+length != length) { // eslint-disable-line eqeqeq
-    length = 0
-  }
-  return Buffer.alloc(+length)
-}
-
-Buffer.isBuffer = function isBuffer (b) {
-  return b != null && b._isBuffer === true &&
-    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
-}
-
-Buffer.compare = function compare (a, b) {
-  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
-  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
-  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError(
-      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
-    )
-  }
-
-  if (a === b) return 0
-
-  var x = a.length
-  var y = b.length
-
-  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
-    if (a[i] !== b[i]) {
-      x = a[i]
-      y = b[i]
-      break
-    }
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
-  switch (String(encoding).toLowerCase()) {
-    case 'hex':
-    case 'utf8':
-    case 'utf-8':
-    case 'ascii':
-    case 'latin1':
-    case 'binary':
-    case 'base64':
-    case 'ucs2':
-    case 'ucs-2':
-    case 'utf16le':
-    case 'utf-16le':
-      return true
-    default:
-      return false
-  }
-}
-
-Buffer.concat = function concat (list, length) {
-  if (!Array.isArray(list)) {
-    throw new TypeError('"list" argument must be an Array of Buffers')
-  }
-
-  if (list.length === 0) {
-    return Buffer.alloc(0)
-  }
-
-  var i
-  if (length === undefined) {
-    length = 0
-    for (i = 0; i < list.length; ++i) {
-      length += list[i].length
-    }
-  }
-
-  var buffer = Buffer.allocUnsafe(length)
-  var pos = 0
-  for (i = 0; i < list.length; ++i) {
-    var buf = list[i]
-    if (isInstance(buf, Uint8Array)) {
-      buf = Buffer.from(buf)
-    }
-    if (!Buffer.isBuffer(buf)) {
-      throw new TypeError('"list" argument must be an Array of Buffers')
-    }
-    buf.copy(buffer, pos)
-    pos += buf.length
-  }
-  return buffer
-}
-
-function byteLength (string, encoding) {
-  if (Buffer.isBuffer(string)) {
-    return string.length
-  }
-  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
-    return string.byteLength
-  }
-  if (typeof string !== 'string') {
-    throw new TypeError(
-      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
-      'Received type ' + typeof string
-    )
-  }
-
-  var len = string.length
-  var mustMatch = (arguments.length > 2 && arguments[2] === true)
-  if (!mustMatch && len === 0) return 0
-
-  // Use a for loop to avoid recursion
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'ascii':
-      case 'latin1':
-      case 'binary':
-        return len
-      case 'utf8':
-      case 'utf-8':
-        return utf8ToBytes(string).length
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return len * 2
-      case 'hex':
-        return len >>> 1
-      case 'base64':
-        return base64ToBytes(string).length
-      default:
-        if (loweredCase) {
-          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
-        }
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-Buffer.byteLength = byteLength
-
-function slowToString (encoding, start, end) {
-  var loweredCase = false
-
-  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
-  // property of a typed array.
-
-  // This behaves neither like String nor Uint8Array in that we set start/end
-  // to their upper/lower bounds if the value passed is out of range.
-  // undefined is handled specially as per ECMA-262 6th Edition,
-  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
-  if (start === undefined || start < 0) {
-    start = 0
-  }
-  // Return early if start > this.length. Done here to prevent potential uint32
-  // coercion fail below.
-  if (start > this.length) {
-    return ''
-  }
-
-  if (end === undefined || end > this.length) {
-    end = this.length
-  }
-
-  if (end <= 0) {
-    return ''
-  }
-
-  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
-  end >>>= 0
-  start >>>= 0
-
-  if (end <= start) {
-    return ''
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  while (true) {
-    switch (encoding) {
-      case 'hex':
-        return hexSlice(this, start, end)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Slice(this, start, end)
-
-      case 'ascii':
-        return asciiSlice(this, start, end)
-
-      case 'latin1':
-      case 'binary':
-        return latin1Slice(this, start, end)
-
-      case 'base64':
-        return base64Slice(this, start, end)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return utf16leSlice(this, start, end)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = (encoding + '').toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
-// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
-// reliably in a browserify context because there could be multiple different
-// copies of the 'buffer' package in use. This method works even for Buffer
-// instances that were created from another copy of the `buffer` package.
-// See: https://github.com/feross/buffer/issues/154
-Buffer.prototype._isBuffer = true
-
-function swap (b, n, m) {
-  var i = b[n]
-  b[n] = b[m]
-  b[m] = i
-}
-
-Buffer.prototype.swap16 = function swap16 () {
-  var len = this.length
-  if (len % 2 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 16-bits')
-  }
-  for (var i = 0; i < len; i += 2) {
-    swap(this, i, i + 1)
-  }
-  return this
-}
-
-Buffer.prototype.swap32 = function swap32 () {
-  var len = this.length
-  if (len % 4 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 32-bits')
-  }
-  for (var i = 0; i < len; i += 4) {
-    swap(this, i, i + 3)
-    swap(this, i + 1, i + 2)
-  }
-  return this
-}
-
-Buffer.prototype.swap64 = function swap64 () {
-  var len = this.length
-  if (len % 8 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 64-bits')
-  }
-  for (var i = 0; i < len; i += 8) {
-    swap(this, i, i + 7)
-    swap(this, i + 1, i + 6)
-    swap(this, i + 2, i + 5)
-    swap(this, i + 3, i + 4)
-  }
-  return this
-}
-
-Buffer.prototype.toString = function toString () {
-  var length = this.length
-  if (length === 0) return ''
-  if (arguments.length === 0) return utf8Slice(this, 0, length)
-  return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.toLocaleString = Buffer.prototype.toString
-
-Buffer.prototype.equals = function equals (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return true
-  return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
-  var str = ''
-  var max = exports.INSPECT_MAX_BYTES
-  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
-  if (this.length > max) str += ' ... '
-  return '<Buffer ' + str + '>'
-}
-
-Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
-  if (isInstance(target, Uint8Array)) {
-    target = Buffer.from(target, target.offset, target.byteLength)
-  }
-  if (!Buffer.isBuffer(target)) {
-    throw new TypeError(
-      'The "target" argument must be one of type Buffer or Uint8Array. ' +
-      'Received type ' + (typeof target)
-    )
-  }
-
-  if (start === undefined) {
-    start = 0
-  }
-  if (end === undefined) {
-    end = target ? target.length : 0
-  }
-  if (thisStart === undefined) {
-    thisStart = 0
-  }
-  if (thisEnd === undefined) {
-    thisEnd = this.length
-  }
-
-  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
-    throw new RangeError('out of range index')
-  }
-
-  if (thisStart >= thisEnd && start >= end) {
-    return 0
-  }
-  if (thisStart >= thisEnd) {
-    return -1
-  }
-  if (start >= end) {
-    return 1
-  }
-
-  start >>>= 0
-  end >>>= 0
-  thisStart >>>= 0
-  thisEnd >>>= 0
-
-  if (this === target) return 0
-
-  var x = thisEnd - thisStart
-  var y = end - start
-  var len = Math.min(x, y)
-
-  var thisCopy = this.slice(thisStart, thisEnd)
-  var targetCopy = target.slice(start, end)
-
-  for (var i = 0; i < len; ++i) {
-    if (thisCopy[i] !== targetCopy[i]) {
-      x = thisCopy[i]
-      y = targetCopy[i]
-      break
-    }
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
-// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
-//
-// Arguments:
-// - buffer - a Buffer to search
-// - val - a string, Buffer, or number
-// - byteOffset - an index into `buffer`; will be clamped to an int32
-// - encoding - an optional encoding, relevant is val is a string
-// - dir - true for indexOf, false for lastIndexOf
-function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
-  // Empty buffer means no match
-  if (buffer.length === 0) return -1
-
-  // Normalize byteOffset
-  if (typeof byteOffset === 'string') {
-    encoding = byteOffset
-    byteOffset = 0
-  } else if (byteOffset > 0x7fffffff) {
-    byteOffset = 0x7fffffff
-  } else if (byteOffset < -0x80000000) {
-    byteOffset = -0x80000000
-  }
-  byteOffset = +byteOffset // Coerce to Number.
-  if (numberIsNaN(byteOffset)) {
-    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
-    byteOffset = dir ? 0 : (buffer.length - 1)
-  }
-
-  // Normalize byteOffset: negative offsets start from the end of the buffer
-  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
-  if (byteOffset >= buffer.length) {
-    if (dir) return -1
-    else byteOffset = buffer.length - 1
-  } else if (byteOffset < 0) {
-    if (dir) byteOffset = 0
-    else return -1
-  }
-
-  // Normalize val
-  if (typeof val === 'string') {
-    val = Buffer.from(val, encoding)
-  }
-
-  // Finally, search either indexOf (if dir is true) or lastIndexOf
-  if (Buffer.isBuffer(val)) {
-    // Special case: looking for empty string/buffer always fails
-    if (val.length === 0) {
-      return -1
-    }
-    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
-  } else if (typeof val === 'number') {
-    val = val & 0xFF // Search for a byte value [0-255]
-    if (typeof Uint8Array.prototype.indexOf === 'function') {
-      if (dir) {
-        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
-      } else {
-        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
-      }
-    }
-    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
-  }
-
-  throw new TypeError('val must be string, number or Buffer')
-}
-
-function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
-  var indexSize = 1
-  var arrLength = arr.length
-  var valLength = val.length
-
-  if (encoding !== undefined) {
-    encoding = String(encoding).toLowerCase()
-    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
-        encoding === 'utf16le' || encoding === 'utf-16le') {
-      if (arr.length < 2 || val.length < 2) {
-        return -1
-      }
-      indexSize = 2
-      arrLength /= 2
-      valLength /= 2
-      byteOffset /= 2
-    }
-  }
-
-  function read (buf, i) {
-    if (indexSize === 1) {
-      return buf[i]
-    } else {
-      return buf.readUInt16BE(i * indexSize)
-    }
-  }
-
-  var i
-  if (dir) {
-    var foundIndex = -1
-    for (i = byteOffset; i < arrLength; i++) {
-      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
-        if (foundIndex === -1) foundIndex = i
-        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
-      } else {
-        if (foundIndex !== -1) i -= i - foundIndex
-        foundIndex = -1
-      }
-    }
-  } else {
-    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
-    for (i = byteOffset; i >= 0; i--) {
-      var found = true
-      for (var j = 0; j < valLength; j++) {
-        if (read(arr, i + j) !== read(val, j)) {
-          found = false
-          break
-        }
-      }
-      if (found) return i
-    }
-  }
-
-  return -1
-}
-
-Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
-  return this.indexOf(val, byteOffset, encoding) !== -1
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
-  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
-}
-
-Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
-  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
-}
-
-function hexWrite (buf, string, offset, length) {
-  offset = Number(offset) || 0
-  var remaining = buf.length - offset
-  if (!length) {
-    length = remaining
-  } else {
-    length = Number(length)
-    if (length > remaining) {
-      length = remaining
-    }
-  }
-
-  var strLen = string.length
-
-  if (length > strLen / 2) {
-    length = strLen / 2
-  }
-  for (var i = 0; i < length; ++i) {
-    var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (numberIsNaN(parsed)) return i
-    buf[offset + i] = parsed
-  }
-  return i
-}
-
-function utf8Write (buf, string, offset, length) {
-  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
-  return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function latin1Write (buf, string, offset, length) {
-  return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
-  return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
-  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
-  // Buffer#write(string)
-  if (offset === undefined) {
-    encoding = 'utf8'
-    length = this.length
-    offset = 0
-  // Buffer#write(string, encoding)
-  } else if (length === undefined && typeof offset === 'string') {
-    encoding = offset
-    length = this.length
-    offset = 0
-  // Buffer#write(string, offset[, length][, encoding])
-  } else if (isFinite(offset)) {
-    offset = offset >>> 0
-    if (isFinite(length)) {
-      length = length >>> 0
-      if (encoding === undefined) encoding = 'utf8'
-    } else {
-      encoding = length
-      length = undefined
-    }
-  } else {
-    throw new Error(
-      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
-    )
-  }
-
-  var remaining = this.length - offset
-  if (length === undefined || length > remaining) length = remaining
-
-  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
-    throw new RangeError('Attempt to write outside buffer bounds')
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'hex':
-        return hexWrite(this, string, offset, length)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Write(this, string, offset, length)
-
-      case 'ascii':
-        return asciiWrite(this, string, offset, length)
-
-      case 'latin1':
-      case 'binary':
-        return latin1Write(this, string, offset, length)
-
-      case 'base64':
-        // Warning: maxLength not taken into account in base64Write
-        return base64Write(this, string, offset, length)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return ucs2Write(this, string, offset, length)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
-  return {
-    type: 'Buffer',
-    data: Array.prototype.slice.call(this._arr || this, 0)
-  }
-}
-
-function base64Slice (buf, start, end) {
-  if (start === 0 && end === buf.length) {
-    return base64.fromByteArray(buf)
-  } else {
-    return base64.fromByteArray(buf.slice(start, end))
-  }
-}
-
-function utf8Slice (buf, start, end) {
-  end = Math.min(buf.length, end)
-  var res = []
-
-  var i = start
-  while (i < end) {
-    var firstByte = buf[i]
-    var codePoint = null
-    var bytesPerSequence = (firstByte > 0xEF) ? 4
-      : (firstByte > 0xDF) ? 3
-        : (firstByte > 0xBF) ? 2
-          : 1
-
-    if (i + bytesPerSequence <= end) {
-      var secondByte, thirdByte, fourthByte, tempCodePoint
-
-      switch (bytesPerSequence) {
-        case 1:
-          if (firstByte < 0x80) {
-            codePoint = firstByte
-          }
-          break
-        case 2:
-          secondByte = buf[i + 1]
-          if ((secondByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
-            if (tempCodePoint > 0x7F) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 3:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
-            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 4:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          fourthByte = buf[i + 3]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
-            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
-              codePoint = tempCodePoint
-            }
-          }
-      }
-    }
-
-    if (codePoint === null) {
-      // we did not generate a valid codePoint so insert a
-      // replacement char (U+FFFD) and advance only 1 byte
-      codePoint = 0xFFFD
-      bytesPerSequence = 1
-    } else if (codePoint > 0xFFFF) {
-      // encode to utf16 (surrogate pair dance)
-      codePoint -= 0x10000
-      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
-      codePoint = 0xDC00 | codePoint & 0x3FF
-    }
-
-    res.push(codePoint)
-    i += bytesPerSequence
-  }
-
-  return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
-  var len = codePoints.length
-  if (len <= MAX_ARGUMENTS_LENGTH) {
-    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
-  }
-
-  // Decode in chunks to avoid "call stack size exceeded".
-  var res = ''
-  var i = 0
-  while (i < len) {
-    res += String.fromCharCode.apply(
-      String,
-      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
-    )
-  }
-  return res
-}
-
-function asciiSlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; ++i) {
-    ret += String.fromCharCode(buf[i] & 0x7F)
-  }
-  return ret
-}
-
-function latin1Slice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; ++i) {
-    ret += String.fromCharCode(buf[i])
-  }
-  return ret
-}
-
-function hexSlice (buf, start, end) {
-  var len = buf.length
-
-  if (!start || start < 0) start = 0
-  if (!end || end < 0 || end > len) end = len
-
-  var out = ''
-  for (var i = start; i < end; ++i) {
-    out += toHex(buf[i])
-  }
-  return out
-}
-
-function utf16leSlice (buf, start, end) {
-  var bytes = buf.slice(start, end)
-  var res = ''
-  for (var i = 0; i < bytes.length; i += 2) {
-    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
-  }
-  return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
-  var len = this.length
-  start = ~~start
-  end = end === undefined ? len : ~~end
-
-  if (start < 0) {
-    start += len
-    if (start < 0) start = 0
-  } else if (start > len) {
-    start = len
-  }
-
-  if (end < 0) {
-    end += len
-    if (end < 0) end = 0
-  } else if (end > len) {
-    end = len
-  }
-
-  if (end < start) end = start
-
-  var newBuf = this.subarray(start, end)
-  // Return an augmented `Uint8Array` instance
-  newBuf.__proto__ = Buffer.prototype
-  return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
-  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
-  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    checkOffset(offset, byteLength, this.length)
-  }
-
-  var val = this[offset + --byteLength]
-  var mul = 1
-  while (byteLength > 0 && (mul *= 0x100)) {
-    val += this[offset + --byteLength] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return ((this[offset]) |
-      (this[offset + 1] << 8) |
-      (this[offset + 2] << 16)) +
-      (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] * 0x1000000) +
-    ((this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var i = byteLength
-  var mul = 1
-  var val = this[offset + --i]
-  while (i > 0 && (mul *= 0x100)) {
-    val += this[offset + --i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  if (!(this[offset] & 0x80)) return (this[offset])
-  return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset] | (this[offset + 1] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset + 1] | (this[offset] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset]) |
-    (this[offset + 1] << 8) |
-    (this[offset + 2] << 16) |
-    (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] << 24) |
-    (this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
-  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
-  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('Index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    var maxBytes = Math.pow(2, 8 * byteLength) - 1
-    checkInt(this, value, offset, byteLength, maxBytes, 0)
-  }
-
-  var mul = 1
-  var i = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    var maxBytes = Math.pow(2, 8 * byteLength) - 1
-    checkInt(this, value, offset, byteLength, maxBytes, 0)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  this[offset] = (value >>> 8)
-  this[offset + 1] = (value & 0xff)
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  this[offset + 3] = (value >>> 24)
-  this[offset + 2] = (value >>> 16)
-  this[offset + 1] = (value >>> 8)
-  this[offset] = (value & 0xff)
-  return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  this[offset] = (value >>> 24)
-  this[offset + 1] = (value >>> 16)
-  this[offset + 2] = (value >>> 8)
-  this[offset + 3] = (value & 0xff)
-  return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    var limit = Math.pow(2, (8 * byteLength) - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = 0
-  var mul = 1
-  var sub = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
-      sub = 1
-    }
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    var limit = Math.pow(2, (8 * byteLength) - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  var sub = 0
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
-      sub = 1
-    }
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
-  if (value < 0) value = 0xff + value + 1
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  this[offset] = (value >>> 8)
-  this[offset + 1] = (value & 0xff)
-  return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  this[offset + 2] = (value >>> 16)
-  this[offset + 3] = (value >>> 24)
-  return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (value < 0) value = 0xffffffff + value + 1
-  this[offset] = (value >>> 24)
-  this[offset + 1] = (value >>> 16)
-  this[offset + 2] = (value >>> 8)
-  this[offset + 3] = (value & 0xff)
-  return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
-  if (offset + ext > buf.length) throw new RangeError('Index out of range')
-  if (offset < 0) throw new RangeError('Index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 23, 4)
-  return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 52, 8)
-  return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
-  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
-  if (!start) start = 0
-  if (!end && end !== 0) end = this.length
-  if (targetStart >= target.length) targetStart = target.length
-  if (!targetStart) targetStart = 0
-  if (end > 0 && end < start) end = start
-
-  // Copy 0 bytes; we're done
-  if (end === start) return 0
-  if (target.length === 0 || this.length === 0) return 0
-
-  // Fatal error conditions
-  if (targetStart < 0) {
-    throw new RangeError('targetStart out of bounds')
-  }
-  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
-  if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
-  // Are we oob?
-  if (end > this.length) end = this.length
-  if (target.length - targetStart < end - start) {
-    end = target.length - targetStart + start
-  }
-
-  var len = end - start
-
-  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
-    // Use built-in when available, missing from IE11
-    this.copyWithin(targetStart, start, end)
-  } else if (this === target && start < targetStart && targetStart < end) {
-    // descending copy from end
-    for (var i = len - 1; i >= 0; --i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else {
-    Uint8Array.prototype.set.call(
-      target,
-      this.subarray(start, end),
-      targetStart
-    )
-  }
-
-  return len
-}
-
-// Usage:
-//    buffer.fill(number[, offset[, end]])
-//    buffer.fill(buffer[, offset[, end]])
-//    buffer.fill(string[, offset[, end]][, encoding])
-Buffer.prototype.fill = function fill (val, start, end, encoding) {
-  // Handle string cases:
-  if (typeof val === 'string') {
-    if (typeof start === 'string') {
-      encoding = start
-      start = 0
-      end = this.length
-    } else if (typeof end === 'string') {
-      encoding = end
-      end = this.length
-    }
-    if (encoding !== undefined && typeof encoding !== 'string') {
-      throw new TypeError('encoding must be a string')
-    }
-    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
-      throw new TypeError('Unknown encoding: ' + encoding)
-    }
-    if (val.length === 1) {
-      var code = val.charCodeAt(0)
-      if ((encoding === 'utf8' && code < 128) ||
-          encoding === 'latin1') {
-        // Fast path: If `val` fits into a single byte, use that numeric value.
-        val = code
-      }
-    }
-  } else if (typeof val === 'number') {
-    val = val & 255
-  }
-
-  // Invalid ranges are not set to a default, so can range check early.
-  if (start < 0 || this.length < start || this.length < end) {
-    throw new RangeError('Out of range index')
-  }
-
-  if (end <= start) {
-    return this
-  }
-
-  start = start >>> 0
-  end = end === undefined ? this.length : end >>> 0
-
-  if (!val) val = 0
-
-  var i
-  if (typeof val === 'number') {
-    for (i = start; i < end; ++i) {
-      this[i] = val
-    }
-  } else {
-    var bytes = Buffer.isBuffer(val)
-      ? val
-      : Buffer.from(val, encoding)
-    var len = bytes.length
-    if (len === 0) {
-      throw new TypeError('The value "' + val +
-        '" is invalid for argument "value"')
-    }
-    for (i = 0; i < end - start; ++i) {
-      this[i + start] = bytes[i % len]
-    }
-  }
-
-  return this
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
-
-function base64clean (str) {
-  // Node takes equal signs as end of the Base64 encoding
-  str = str.split('=')[0]
-  // Node strips out invalid characters like \n and \t from the string, base64-js does not
-  str = str.trim().replace(INVALID_BASE64_RE, '')
-  // Node converts strings with length < 2 to ''
-  if (str.length < 2) return ''
-  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
-  while (str.length % 4 !== 0) {
-    str = str + '='
-  }
-  return str
-}
-
-function toHex (n) {
-  if (n < 16) return '0' + n.toString(16)
-  return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
-  units = units || Infinity
-  var codePoint
-  var length = string.length
-  var leadSurrogate = null
-  var bytes = []
-
-  for (var i = 0; i < length; ++i) {
-    codePoint = string.charCodeAt(i)
-
-    // is surrogate component
-    if (codePoint > 0xD7FF && codePoint < 0xE000) {
-      // last char was a lead
-      if (!leadSurrogate) {
-        // no lead yet
-        if (codePoint > 0xDBFF) {
-          // unexpected trail
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        } else if (i + 1 === length) {
-          // unpaired lead
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        }
-
-        // valid lead
-        leadSurrogate = codePoint
-
-        continue
-      }
-
-      // 2 leads in a row
-      if (codePoint < 0xDC00) {
-        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-        leadSurrogate = codePoint
-        continue
-      }
-
-      // valid surrogate pair
-      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
-    } else if (leadSurrogate) {
-      // valid bmp char, but last char was a lead
-      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-    }
-
-    leadSurrogate = null
-
-    // encode utf8
-    if (codePoint < 0x80) {
-      if ((units -= 1) < 0) break
-      bytes.push(codePoint)
-    } else if (codePoint < 0x800) {
-      if ((units -= 2) < 0) break
-      bytes.push(
-        codePoint >> 0x6 | 0xC0,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x10000) {
-      if ((units -= 3) < 0) break
-      bytes.push(
-        codePoint >> 0xC | 0xE0,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x110000) {
-      if ((units -= 4) < 0) break
-      bytes.push(
-        codePoint >> 0x12 | 0xF0,
-        codePoint >> 0xC & 0x3F | 0x80,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else {
-      throw new Error('Invalid code point')
-    }
-  }
-
-  return bytes
-}
-
-function asciiToBytes (str) {
-  var byteArray = []
-  for (var i = 0; i < str.length; ++i) {
-    // Node's code seems to be doing this and not & 0x7F..
-    byteArray.push(str.charCodeAt(i) & 0xFF)
-  }
-  return byteArray
-}
-
-function utf16leToBytes (str, units) {
-  var c, hi, lo
-  var byteArray = []
-  for (var i = 0; i < str.length; ++i) {
-    if ((units -= 2) < 0) break
-
-    c = str.charCodeAt(i)
-    hi = c >> 8
-    lo = c % 256
-    byteArray.push(lo)
-    byteArray.push(hi)
-  }
-
-  return byteArray
-}
-
-function base64ToBytes (str) {
-  return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
-  for (var i = 0; i < length; ++i) {
-    if ((i + offset >= dst.length) || (i >= src.length)) break
-    dst[i + offset] = src[i]
-  }
-  return i
-}
-
-// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
-// the `instanceof` check but they should be treated as of that type.
-// See: https://github.com/feross/buffer/issues/166
-function isInstance (obj, type) {
-  return obj instanceof type ||
-    (obj != null && obj.constructor != null && obj.constructor.name != null &&
-      obj.constructor.name === type.name)
-}
-function numberIsNaN (obj) {
-  // For IE11 support
-  return obj !== obj // eslint-disable-line no-self-compare
-}
-
-},{"base64-js":3,"ieee754":17}],7:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
-}
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
-
-
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],8:[function(require,module,exports){
-'use strict';
-
-module.exports = earcut;
-module.exports.default = earcut;
-
-function earcut(data, holeIndices, dim) {
-
-    dim = dim || 2;
-
-    var hasHoles = holeIndices && holeIndices.length,
-        outerLen = hasHoles ? holeIndices[0] * dim : data.length,
-        outerNode = linkedList(data, 0, outerLen, dim, true),
-        triangles = [];
-
-    if (!outerNode || outerNode.next === outerNode.prev) return triangles;
-
-    var minX, minY, maxX, maxY, x, y, invSize;
-
-    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
-
-    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
-    if (data.length > 80 * dim) {
-        minX = maxX = data[0];
-        minY = maxY = data[1];
-
-        for (var i = dim; i < outerLen; i += dim) {
-            x = data[i];
-            y = data[i + 1];
-            if (x < minX) minX = x;
-            if (y < minY) minY = y;
-            if (x > maxX) maxX = x;
-            if (y > maxY) maxY = y;
-        }
-
-        // minX, minY and invSize are later used to transform coords into integers for z-order calculation
-        invSize = Math.max(maxX - minX, maxY - minY);
-        invSize = invSize !== 0 ? 1 / invSize : 0;
-    }
-
-    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
-
-    return triangles;
-}
-
-// create a circular doubly linked list from polygon points in the specified winding order
-function linkedList(data, start, end, dim, clockwise) {
-    var i, last;
-
-    if (clockwise === (signedArea(data, start, end, dim) > 0)) {
-        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
-    } else {
-        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
-    }
-
-    if (last && equals(last, last.next)) {
-        removeNode(last);
-        last = last.next;
-    }
-
-    return last;
-}
-
-// eliminate colinear or duplicate points
-function filterPoints(start, end) {
-    if (!start) return start;
-    if (!end) end = start;
-
-    var p = start,
-        again;
-    do {
-        again = false;
-
-        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
-            removeNode(p);
-            p = end = p.prev;
-            if (p === p.next) break;
-            again = true;
-
-        } else {
-            p = p.next;
-        }
-    } while (again || p !== end);
-
-    return end;
-}
-
-// main ear slicing loop which triangulates a polygon (given as a linked list)
-function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
-    if (!ear) return;
-
-    // interlink polygon nodes in z-order
-    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
-
-    var stop = ear,
-        prev, next;
-
-    // iterate through ears, slicing them one by one
-    while (ear.prev !== ear.next) {
-        prev = ear.prev;
-        next = ear.next;
-
-        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
-            // cut off the triangle
-            triangles.push(prev.i / dim);
-            triangles.push(ear.i / dim);
-            triangles.push(next.i / dim);
-
-            removeNode(ear);
-
-            // skipping the next vertex leads to less sliver triangles
-            ear = next.next;
-            stop = next.next;
-
-            continue;
-        }
-
-        ear = next;
-
-        // if we looped through the whole remaining polygon and can't find any more ears
-        if (ear === stop) {
-            // try filtering points and slicing again
-            if (!pass) {
-                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
-
-            // if this didn't work, try curing all small self-intersections locally
-            } else if (pass === 1) {
-                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
-
-            // as a last resort, try splitting the remaining polygon into two
-            } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, invSize);
-            }
-
-            break;
-        }
-    }
-}
-
-// check whether a polygon node forms a valid ear with adjacent nodes
-function isEar(ear) {
-    var a = ear.prev,
-        b = ear,
-        c = ear.next;
-
-    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-    // now make sure we don't have other points inside the potential ear
-    var p = ear.next.next;
-
-    while (p !== ear.prev) {
-        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.next;
-    }
-
-    return true;
-}
-
-function isEarHashed(ear, minX, minY, invSize) {
-    var a = ear.prev,
-        b = ear,
-        c = ear.next;
-
-    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-    // triangle bbox; min & max are calculated like this for speed
-    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
-        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
-        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
-        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
-
-    // z-order range for the current triangle bbox;
-    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
-
-    var p = ear.prevZ,
-        n = ear.nextZ;
-
-    // look for points inside the triangle in both directions
-    while (p && p.z >= minZ && n && n.z <= maxZ) {
-        if (p !== ear.prev && p !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.prevZ;
-
-        if (n !== ear.prev && n !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-            area(n.prev, n, n.next) >= 0) return false;
-        n = n.nextZ;
-    }
-
-    // look for remaining points in decreasing z-order
-    while (p && p.z >= minZ) {
-        if (p !== ear.prev && p !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.prevZ;
-    }
-
-    // look for remaining points in increasing z-order
-    while (n && n.z <= maxZ) {
-        if (n !== ear.prev && n !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-            area(n.prev, n, n.next) >= 0) return false;
-        n = n.nextZ;
-    }
-
-    return true;
-}
-
-// go through all polygon nodes and cure small local self-intersections
-function cureLocalIntersections(start, triangles, dim) {
-    var p = start;
-    do {
-        var a = p.prev,
-            b = p.next.next;
-
-        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
-
-            triangles.push(a.i / dim);
-            triangles.push(p.i / dim);
-            triangles.push(b.i / dim);
-
-            // remove two nodes involved
-            removeNode(p);
-            removeNode(p.next);
-
-            p = start = b;
-        }
-        p = p.next;
-    } while (p !== start);
-
-    return filterPoints(p);
-}
-
-// try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, invSize) {
-    // look for a valid diagonal that divides the polygon into two
-    var a = start;
-    do {
-        var b = a.next.next;
-        while (b !== a.prev) {
-            if (a.i !== b.i && isValidDiagonal(a, b)) {
-                // split the polygon in two by the diagonal
-                var c = splitPolygon(a, b);
-
-                // filter colinear points around the cuts
-                a = filterPoints(a, a.next);
-                c = filterPoints(c, c.next);
-
-                // run earcut on each half
-                earcutLinked(a, triangles, dim, minX, minY, invSize);
-                earcutLinked(c, triangles, dim, minX, minY, invSize);
-                return;
-            }
-            b = b.next;
-        }
-        a = a.next;
-    } while (a !== start);
-}
-
-// link every hole into the outer loop, producing a single-ring polygon without holes
-function eliminateHoles(data, holeIndices, outerNode, dim) {
-    var queue = [],
-        i, len, start, end, list;
-
-    for (i = 0, len = holeIndices.length; i < len; i++) {
-        start = holeIndices[i] * dim;
-        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-        list = linkedList(data, start, end, dim, false);
-        if (list === list.next) list.steiner = true;
-        queue.push(getLeftmost(list));
-    }
-
-    queue.sort(compareX);
-
-    // process holes from left to right
-    for (i = 0; i < queue.length; i++) {
-        eliminateHole(queue[i], outerNode);
-        outerNode = filterPoints(outerNode, outerNode.next);
-    }
-
-    return outerNode;
-}
-
-function compareX(a, b) {
-    return a.x - b.x;
-}
-
-// find a bridge between vertices that connects hole with an outer ring and and link it
-function eliminateHole(hole, outerNode) {
-    outerNode = findHoleBridge(hole, outerNode);
-    if (outerNode) {
-        var b = splitPolygon(outerNode, hole);
-
-        // filter collinear points around the cuts
-        filterPoints(outerNode, outerNode.next);
-        filterPoints(b, b.next);
-    }
-}
-
-// David Eberly's algorithm for finding a bridge between hole and outer polygon
-function findHoleBridge(hole, outerNode) {
-    var p = outerNode,
-        hx = hole.x,
-        hy = hole.y,
-        qx = -Infinity,
-        m;
-
-    // find a segment intersected by a ray from the hole's leftmost point to the left;
-    // segment's endpoint with lesser x will be potential connection point
-    do {
-        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
-            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
-            if (x <= hx && x > qx) {
-                qx = x;
-                if (x === hx) {
-                    if (hy === p.y) return p;
-                    if (hy === p.next.y) return p.next;
-                }
-                m = p.x < p.next.x ? p : p.next;
-            }
-        }
-        p = p.next;
-    } while (p !== outerNode);
-
-    if (!m) return null;
-
-    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
-
-    // look for points inside the triangle of hole point, segment intersection and endpoint;
-    // if there are no points found, we have a valid connection;
-    // otherwise choose the point of the minimum angle with the ray as connection point
-
-    var stop = m,
-        mx = m.x,
-        my = m.y,
-        tanMin = Infinity,
-        tan;
-
-    p = m;
-
-    do {
-        if (hx >= p.x && p.x >= mx && hx !== p.x &&
-                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
-
-            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
-
-            if (locallyInside(p, hole) &&
-                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
-                m = p;
-                tanMin = tan;
-            }
-        }
-
-        p = p.next;
-    } while (p !== stop);
-
-    return m;
-}
-
-// whether sector in vertex m contains sector in vertex p in the same coordinates
-function sectorContainsSector(m, p) {
-    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
-}
-
-// interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, invSize) {
-    var p = start;
-    do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
-        p.prevZ = p.prev;
-        p.nextZ = p.next;
-        p = p.next;
-    } while (p !== start);
-
-    p.prevZ.nextZ = null;
-    p.prevZ = null;
-
-    sortLinked(p);
-}
-
-// Simon Tatham's linked list merge sort algorithm
-// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
-function sortLinked(list) {
-    var i, p, q, e, tail, numMerges, pSize, qSize,
-        inSize = 1;
-
-    do {
-        p = list;
-        list = null;
-        tail = null;
-        numMerges = 0;
-
-        while (p) {
-            numMerges++;
-            q = p;
-            pSize = 0;
-            for (i = 0; i < inSize; i++) {
-                pSize++;
-                q = q.nextZ;
-                if (!q) break;
-            }
-            qSize = inSize;
-
-            while (pSize > 0 || (qSize > 0 && q)) {
-
-                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                }
-
-                if (tail) tail.nextZ = e;
-                else list = e;
-
-                e.prevZ = tail;
-                tail = e;
-            }
-
-            p = q;
-        }
-
-        tail.nextZ = null;
-        inSize *= 2;
-
-    } while (numMerges > 1);
-
-    return list;
-}
-
-// z-order of a point given coords and inverse of the longer side of data bbox
-function zOrder(x, y, minX, minY, invSize) {
-    // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) * invSize;
-    y = 32767 * (y - minY) * invSize;
-
-    x = (x | (x << 8)) & 0x00FF00FF;
-    x = (x | (x << 4)) & 0x0F0F0F0F;
-    x = (x | (x << 2)) & 0x33333333;
-    x = (x | (x << 1)) & 0x55555555;
-
-    y = (y | (y << 8)) & 0x00FF00FF;
-    y = (y | (y << 4)) & 0x0F0F0F0F;
-    y = (y | (y << 2)) & 0x33333333;
-    y = (y | (y << 1)) & 0x55555555;
-
-    return x | (y << 1);
-}
-
-// find the leftmost node of a polygon ring
-function getLeftmost(start) {
-    var p = start,
-        leftmost = start;
-    do {
-        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
-        p = p.next;
-    } while (p !== start);
-
-    return leftmost;
-}
-
-// check if a point lies within a convex triangle
-function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
-    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
-           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
-           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
-}
-
-// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
-function isValidDiagonal(a, b) {
-    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
-           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
-            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
-            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
-}
-
-// signed area of a triangle
-function area(p, q, r) {
-    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
-}
-
-// check if two points are equal
-function equals(p1, p2) {
-    return p1.x === p2.x && p1.y === p2.y;
-}
-
-// check if two segments intersect
-function intersects(p1, q1, p2, q2) {
-    var o1 = sign(area(p1, q1, p2));
-    var o2 = sign(area(p1, q1, q2));
-    var o3 = sign(area(p2, q2, p1));
-    var o4 = sign(area(p2, q2, q1));
-
-    if (o1 !== o2 && o3 !== o4) return true; // general case
-
-    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
-    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
-    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
-    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
-
-    return false;
-}
-
-// for collinear points p, q, r, check if point q lies on segment pr
-function onSegment(p, q, r) {
-    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
-}
-
-function sign(num) {
-    return num > 0 ? 1 : num < 0 ? -1 : 0;
-}
-
-// check if a polygon diagonal intersects any polygon segments
-function intersectsPolygon(a, b) {
-    var p = a;
-    do {
-        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
-                intersects(p, p.next, a, b)) return true;
-        p = p.next;
-    } while (p !== a);
-
-    return false;
-}
-
-// check if a polygon diagonal is locally inside the polygon
-function locallyInside(a, b) {
-    return area(a.prev, a, a.next) < 0 ?
-        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
-        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
-}
-
-// check if the middle point of a polygon diagonal is inside the polygon
-function middleInside(a, b) {
-    var p = a,
-        inside = false,
-        px = (a.x + b.x) / 2,
-        py = (a.y + b.y) / 2;
-    do {
-        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
-                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
-            inside = !inside;
-        p = p.next;
-    } while (p !== a);
-
-    return inside;
-}
-
-// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
-// if one belongs to the outer ring and another to a hole, it merges it into a single ring
-function splitPolygon(a, b) {
-    var a2 = new Node(a.i, a.x, a.y),
-        b2 = new Node(b.i, b.x, b.y),
-        an = a.next,
-        bp = b.prev;
-
-    a.next = b;
-    b.prev = a;
-
-    a2.next = an;
-    an.prev = a2;
-
-    b2.next = a2;
-    a2.prev = b2;
-
-    bp.next = b2;
-    b2.prev = bp;
-
-    return b2;
-}
-
-// create a node and optionally link it with previous one (in a circular doubly linked list)
-function insertNode(i, x, y, last) {
-    var p = new Node(i, x, y);
-
-    if (!last) {
-        p.prev = p;
-        p.next = p;
-
-    } else {
-        p.next = last.next;
-        p.prev = last;
-        last.next.prev = p;
-        last.next = p;
-    }
-    return p;
-}
-
-function removeNode(p) {
-    p.next.prev = p.prev;
-    p.prev.next = p.next;
-
-    if (p.prevZ) p.prevZ.nextZ = p.nextZ;
-    if (p.nextZ) p.nextZ.prevZ = p.prevZ;
-}
-
-function Node(i, x, y) {
-    // vertex index in coordinates array
-    this.i = i;
-
-    // vertex coordinates
-    this.x = x;
-    this.y = y;
-
-    // previous and next vertex nodes in a polygon ring
-    this.prev = null;
-    this.next = null;
-
-    // z-order curve value
-    this.z = null;
-
-    // previous and next nodes in z-order
-    this.prevZ = null;
-    this.nextZ = null;
-
-    // indicates whether this is a steiner point
-    this.steiner = false;
-}
-
-// return a percentage difference between the polygon area and its triangulation area;
-// used to verify correctness of triangulation
-earcut.deviation = function (data, holeIndices, dim, triangles) {
-    var hasHoles = holeIndices && holeIndices.length;
-    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
-
-    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
-    if (hasHoles) {
-        for (var i = 0, len = holeIndices.length; i < len; i++) {
-            var start = holeIndices[i] * dim;
-            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-            polygonArea -= Math.abs(signedArea(data, start, end, dim));
-        }
-    }
-
-    var trianglesArea = 0;
-    for (i = 0; i < triangles.length; i += 3) {
-        var a = triangles[i] * dim;
-        var b = triangles[i + 1] * dim;
-        var c = triangles[i + 2] * dim;
-        trianglesArea += Math.abs(
-            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
-            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
-    }
-
-    return polygonArea === 0 && trianglesArea === 0 ? 0 :
-        Math.abs((trianglesArea - polygonArea) / polygonArea);
-};
-
-function signedArea(data, start, end, dim) {
-    var sum = 0;
-    for (var i = start, j = end - dim; i < end; i += dim) {
-        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
-        j = i;
-    }
-    return sum;
-}
-
-// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
-earcut.flatten = function (data) {
-    var dim = data[0][0].length,
-        result = {vertices: [], holes: [], dimensions: dim},
-        holeIndex = 0;
-
-    for (var i = 0; i < data.length; i++) {
-        for (var j = 0; j < data[i].length; j++) {
-            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
-        }
-        if (i > 0) {
-            holeIndex += data[i - 1].length;
-            result.holes.push(holeIndex);
-        }
-    }
-    return result;
-};
-
-},{}],9:[function(require,module,exports){
-'use strict';
-
-var OneVersionConstraint = require('individual/one-version');
-
-var MY_VERSION = '7';
-OneVersionConstraint('ev-store', MY_VERSION);
-
-var hashKey = '__EV_STORE_KEY@' + MY_VERSION;
-
-module.exports = EvStore;
-
-function EvStore(elem) {
-    var hash = elem[hashKey];
-
-    if (!hash) {
-        hash = elem[hashKey] = {};
-    }
-
-    return hash;
-}
-
-},{"individual/one-version":19}],10:[function(require,module,exports){
-'use strict';
-var request = require('./request');
-var buildQueryObject = require('./buildQueryObject');
-var isArray = Array.isArray;
-
-function simpleExtend(obj, obj2) {
-  var prop;
-  for (prop in obj2) {
-    obj[prop] = obj2[prop];
-  }
-  return obj;
-}
-
-function XMLHttpSource(jsongUrl, config) {
-  this._jsongUrl = jsongUrl;
-  if (typeof config === 'number') {
-    var newConfig = {
-      timeout: config
-    };
-    config = newConfig;
-  }
-  this._config = simpleExtend({
-    timeout: 15000,
-    headers: {}
-  }, config || {});
-}
-
-XMLHttpSource.prototype = {
-  // because javascript
-  constructor: XMLHttpSource,
-  /**
-   * buildQueryObject helper
-   */
-  buildQueryObject: buildQueryObject,
-
-  /**
-   * @inheritDoc DataSource#get
-   */
-  get: function httpSourceGet(pathSet) {
-    var method = 'GET';
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, {
-      paths: pathSet,
-      method: 'get'
-    });
-    var config = simpleExtend(queryObject, this._config);
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-  },
-
-  /**
-   * @inheritDoc DataSource#set
-   */
-  set: function httpSourceSet(jsongEnv) {
-    var method = 'POST';
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, {
-      jsonGraph: jsongEnv,
-      method: 'set'
-    });
-    var config = simpleExtend(queryObject, this._config);
-    config.headers["Content-Type"] = "application/x-www-form-urlencoded";
-    
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-
-  },
-
-  /**
-   * @inheritDoc DataSource#call
-   */
-  call: function httpSourceCall(callPath, args, pathSuffix, paths) {
-    // arguments defaults
-    args = args || [];
-    pathSuffix = pathSuffix || [];
-    paths = paths || [];
-
-    var method = 'POST';
-    var queryData = [];
-    queryData.push('method=call');
-    queryData.push('callPath=' + encodeURIComponent(JSON.stringify(callPath)));
-    queryData.push('arguments=' + encodeURIComponent(JSON.stringify(args)));
-    queryData.push('pathSuffixes=' + encodeURIComponent(JSON.stringify(pathSuffix)));
-    queryData.push('paths=' + encodeURIComponent(JSON.stringify(paths)));
-
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, queryData.join('&'));
-    var config = simpleExtend(queryObject, this._config);
-    config.headers["Content-Type"] = "application/x-www-form-urlencoded";
-    
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-  }
-};
-// ES6 modules
-XMLHttpSource.XMLHttpSource = XMLHttpSource;
-XMLHttpSource['default'] = XMLHttpSource;
-// commonjs
-module.exports = XMLHttpSource;
-
-},{"./buildQueryObject":11,"./request":14}],11:[function(require,module,exports){
-'use strict';
-module.exports = function buildQueryObject(url, method, queryData) {
-  var qData = [];
-  var keys;
-  var data = {url: url};
-  var isQueryParamUrl = url.indexOf('?') !== -1;
-  var startUrl = (isQueryParamUrl) ? '&' : '?';
-
-  if (typeof queryData === 'string') {
-    qData.push(queryData);
-  } else {
-
-    keys = Object.keys(queryData);
-    keys.forEach(function (k) {
-      var value = (typeof queryData[k] === 'object') ? JSON.stringify(queryData[k]) : queryData[k];
-      qData.push(k + '=' + encodeURIComponent(value));
-    });
-  }
-
-  if (method === 'GET') {
-    data.url += startUrl + qData.join('&');
-  } else {
-    data.data = qData.join('&');
-  }
-
-  return data;
-};
-
-},{}],12:[function(require,module,exports){
-(function (global){
-'use strict';
-// Get CORS support even for older IE
-module.exports = function getCORSRequest() {
-    var xhr = new global.XMLHttpRequest();
-    if ('withCredentials' in xhr) {
-        return xhr;
-    } else if (!!global.XDomainRequest) {
-        return new XDomainRequest();
-    } else {
-        throw new Error('CORS is not supported by your browser');
-    }
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],13:[function(require,module,exports){
-(function (global){
-'use strict';
-module.exports = function getXMLHttpRequest() {
-  var progId,
-    progIds,
-    i;
-  if (global.XMLHttpRequest) {
-    return new global.XMLHttpRequest();
-  } else {
-    try {
-    progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-    for (i = 0; i < 3; i++) {
-      try {
-        progId = progIds[i];
-        if (new global.ActiveXObject(progId)) {
-          break;
-        }
-      } catch(e) { }
-    }
-    return new global.ActiveXObject(progId);
-    } catch (e) {
-    throw new Error('XMLHttpRequest is not supported by your browser');
-    }
-  }
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],14:[function(require,module,exports){
-'use strict';
-var getXMLHttpRequest = require('./getXMLHttpRequest');
-var getCORSRequest = require('./getCORSRequest');
-var hasOwnProp = Object.prototype.hasOwnProperty;
-
-var noop = function() {};
-
-function Observable() {}
-
-Observable.create = function(subscribe) {
-  var o = new Observable();
-
-  o.subscribe = function(onNext, onError, onCompleted) {
-
-    var observer;
-    var disposable;
-
-    if (typeof onNext === 'function') {
-        observer = {
-            onNext: onNext,
-            onError: (onError || noop),
-            onCompleted: (onCompleted || noop)
-        };
-    } else {
-        observer = onNext;
-    }
-
-    disposable = subscribe(observer);
-
-    if (typeof disposable === 'function') {
-      return {
-        dispose: disposable
-      };
-    } else {
-      return disposable;
-    }
-  };
-
-  return o;
-};
-
-function request(method, options, context) {
-  return Observable.create(function requestObserver(observer) {
-
-    var config = {
-      method: method || 'GET',
-      crossDomain: false,
-      async: true,
-      headers: {},
-      responseType: 'json'
-    };
-
-    var xhr,
-      isDone,
-      headers,
-      header,
-      prop;
-
-    for (prop in options) {
-      if (hasOwnProp.call(options, prop)) {
-        config[prop] = options[prop];
-      }
-    }
-
-    // Add request with Headers
-    if (!config.crossDomain && !config.headers['X-Requested-With']) {
-      config.headers['X-Requested-With'] = 'XMLHttpRequest';
-    }
-
-    // allow the user to mutate the config open
-    if (context.onBeforeRequest != null) {
-      context.onBeforeRequest(config);
-    }
-
-    // create xhr
-    try {
-      xhr = config.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-    } catch (err) {
-      observer.onError(err);
-    }
-    try {
-      // Takes the url and opens the connection
-      if (config.user) {
-        xhr.open(config.method, config.url, config.async, config.user, config.password);
-      } else {
-        xhr.open(config.method, config.url, config.async);
-      }
-
-      // Sets timeout information
-      xhr.timeout = config.timeout;
-
-      // Anything but explicit false results in true.
-      xhr.withCredentials = config.withCredentials !== false;
-
-      // Fills the request headers
-      headers = config.headers;
-      for (header in headers) {
-        if (hasOwnProp.call(headers, header)) {
-          xhr.setRequestHeader(header, headers[header]);
-        }
-      }
-
-      if (config.responseType) {
-        try {
-          xhr.responseType = config.responseType;
-        } catch (e) {
-          // WebKit added support for the json responseType value on 09/03/2013
-          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
-          // known to throw when setting the value "json" as the response type. Other older
-          // browsers implementing the responseType
-          //
-          // The json response type can be ignored if not supported, because JSON payloads are
-          // parsed on the client-side regardless.
-          if (config.responseType !== 'json') {
-            throw e;
-          }
-        }
-      }
-
-      xhr.onreadystatechange = function onreadystatechange(e) {
-        // Complete
-        if (xhr.readyState === 4) {
-          if (!isDone) {
-            isDone = true;
-            onXhrLoad(observer, xhr, e);
-          }
-        }
-      };
-
-      // Timeout
-      xhr.ontimeout = function ontimeout(e) {
-        if (!isDone) {
-          isDone = true;
-          onXhrError(observer, xhr, 'timeout error', e);
-        }
-      };
-
-      // Send Request
-      xhr.send(config.data);
-
-    } catch (e) {
-      observer.onError(e);
-    }
-    // Dispose
-    return function dispose() {
-      // Doesn't work in IE9
-      if (!isDone && xhr.readyState !== 4) {
-        isDone = true;
-        xhr.abort();
-      }
-    };//Dispose
-  });
-}
-
-/*
- * General handling of ultimate failure (after appropriate retries)
- */
-function _handleXhrError(observer, textStatus, errorThrown) {
-  // IE9: cross-domain request may be considered errors
-  if (!errorThrown) {
-    errorThrown = new Error(textStatus);
-  }
-
-  observer.onError(errorThrown);
-}
-
-function onXhrLoad(observer, xhr, e) {
-  var responseData,
-    responseObject,
-    responseType;
-
-  // If there's no observer, the request has been (or is being) cancelled.
-  if (xhr && observer) {
-    responseType = xhr.responseType;
-    // responseText is the old-school way of retrieving response (supported by IE8 & 9)
-    // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
-    responseData = ('response' in xhr) ? xhr.response : xhr.responseText;
-
-    // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
-    var status = (xhr.status === 1223) ? 204 : xhr.status;
-
-    if (status >= 200 && status <= 399) {
-      try {
-        if (responseType !== 'json') {
-          responseData = JSON.parse(responseData || '');
-        }
-        if (typeof responseData === 'string') {
-          responseData = JSON.parse(responseData || '');
-        }
-      } catch (e) {
-        _handleXhrError(observer, 'invalid json', e);
-      }
-      observer.onNext(responseData);
-      observer.onCompleted();
-      return;
-
-    } else if (status === 401 || status === 403 || status === 407) {
-
-      return _handleXhrError(observer, responseData);
-
-    } else if (status === 410) {
-      // TODO: Retry ?
-      return _handleXhrError(observer, responseData);
-
-    } else if (status === 408 || status === 504) {
-      // TODO: Retry ?
-      return _handleXhrError(observer, responseData);
-
-    } else {
-
-      return _handleXhrError(observer, responseData || ('Response code ' + status));
-
-    }//if
-  }//if
-}//onXhrLoad
-
-function onXhrError(observer, xhr, status, e) {
-  _handleXhrError(observer, status || xhr.statusText || 'request error', e);
-}
-
-module.exports = request;
-
-},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(require,module,exports){
-(function (global){
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.falcor=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return o(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e,n){var r=t(32),o=t(130);r.atom=o.atom,r.ref=o.ref,r.error=o.error,r.pathValue=o.pathValue,r.HttpDataSource=t(125),e.exports=r},{125:125,130:130,32:32}],2:[function(t,e,n){function r(t){var e=t||{};this._root=e._root||new o(e),this._path=e.path||e._path||[],this._scheduler=e.scheduler||e._scheduler||new l,this._source=e.source||e._source,this._request=e.request||e._request||new s(this,this._scheduler),this._ID=N++,"number"==typeof e.maxSize?this._maxSize=e.maxSize:this._maxSize=e._maxSize||r.prototype._maxSize,"number"==typeof e.collectRatio?this._collectRatio=e.collectRatio:this._collectRatio=e._collectRatio||r.prototype._collectRatio,(e.boxed||e.hasOwnProperty("_boxed"))&&(this._boxed=e.boxed||e._boxed),(e.materialized||e.hasOwnProperty("_materialized"))&&(this._materialized=e.materialized||e._materialized),"boolean"==typeof e.treatErrorsAsValues?this._treatErrorsAsValues=e.treatErrorsAsValues:e.hasOwnProperty("_treatErrorsAsValues")&&(this._treatErrorsAsValues=e._treatErrorsAsValues),e.cache&&this.setCache(e.cache)}var o=t(4),i=t(3),s=t(55),u=t(64),a=t(65),c=t(61),p=t(63),h=t(73),f=t(75),l=t(74),d=t(81),v=t(84),y=t(49),b=t(134),m=t(88),g=t(100),w=t(96),x=t(102),_=t(98),S=t(99),E=t(77),C=t(76),A=t(130),N=0,k=t(116),O=function(){},P=t(14),j=t(19),D={pathValue:!0,pathSyntax:!0,json:!0,jsonGraph:!0},q=t(72);e.exports=r,r.ref=A.ref,r.atom=A.atom,r.error=A.error,r.pathValue=A.pathValue,r.prototype.constructor=r,r.prototype._materialized=!1,r.prototype._boxed=!1,r.prototype._progressive=!1,r.prototype._treatErrorsAsValues=!1,r.prototype._maxSize=Math.pow(2,53)-1,r.prototype._collectRatio=.75,r.prototype.get=t(71),r.prototype._getWithPaths=t(70),r.prototype.set=function(){var t=k(arguments,D,"set");return t!==!0?new u(function(e){e.onError(t)}):this._set.apply(this,arguments)},r.prototype.preload=function(){var t=k(arguments,q,"preload");if(t!==!0)return new u(function(e){e.onError(t)});var e=Array.prototype.slice.call(arguments),n=this;return new u(function(t){return n.get.apply(n,e).subscribe(function(){},function(e){t.onError(e)},function(){t.onCompleted()})})},r.prototype._set=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(w(r)?n-=1:r=void 0,t=new Array(n);++e<n;)t[e]=arguments[e];return a.create(this,t,r)},r.prototype.call=function(){var t,e=-1,n=arguments.length;for(t=new Array(n);++e<n;){var r=arguments[e];t[e]=r;var o=typeof r;if(e>1&&!Array.isArray(r)||0===e&&!Array.isArray(r)&&"string"!==o||1===e&&!Array.isArray(r)&&!x(r))return new u(function(t){t.onError(new Error("Invalid argument"))})}return c.create(this,t)},r.prototype.invalidate=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(t=new Array(n);++e<n;)if(t[e]=b.fromPath(arguments[e]),"object"!=typeof t[e])throw new Error("Invalid argument");p.create(this,t,r).subscribe(O,function(t){throw t})},r.prototype.deref=t(5),r.prototype.getValue=t(16),r.prototype.setValue=t(79),r.prototype._getValueSync=t(24),r.prototype._setValueSync=t(80),r.prototype._derefSync=t(6),r.prototype.setCache=function(t){var e=this._root.cache;if(t!==e){var n=this._root,r=this._path;this._path=[],this._root.cache={},"undefined"!=typeof e&&y(n,n.expired,m(e),0),S(t)?C(this,[t]):_(t)?E(this,[t]):g(t)&&E(this,[{json:t}]),this._path=r}else"undefined"==typeof e&&(this._root.cache={});return this},r.prototype.getCache=function(){var t=v(arguments);if(0===t.length)return P(this._root.cache);var e=[{}],n=this._path;return j.getWithPathsAsJSONGraph(this,t,e),this._path=n,e[0].jsonGraph},r.prototype.getVersion=function(t){var e=t&&b.fromPath(t)||[];if(Array.isArray(e)===!1)throw new Error("Model#getVersion must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._getVersion(this,e)},r.prototype._syncCheck=function(t){if(Boolean(this._source)&&this._root.syncRefCount<=0&&this._root.unsafeMode===!1)throw new Error("Model#"+t+" may only be called within the context of a request selector.");return!0},r.prototype._clone=function(t){var e=new r(this);for(var n in t){var o=t[n];"delete"===o?delete e[n]:e[n]=o}return e.setCache=void 0,e},r.prototype.batch=function(t){var e=t;"number"==typeof e?e=new f(Math.round(Math.abs(e))):e&&e.schedule||(e=new h);var n=this._clone();return n._request=new s(n,e),n},r.prototype.unbatch=function(){var t=this._clone();return t._request=new s(t,new l),t},r.prototype.treatErrorsAsValues=function(){return this._clone({_treatErrorsAsValues:!0})},r.prototype.asDataSource=function(){return new i(this)},r.prototype._materialize=function(){return this._clone({_materialized:!0})},r.prototype._dematerialize=function(){return this._clone({_materialized:"delete"})},r.prototype.boxValues=function(){return this._clone({_boxed:!0})},r.prototype.unboxValues=function(){return this._clone({_boxed:"delete"})},r.prototype.withoutDataSource=function(){return this._clone({_source:"delete"})},r.prototype.toJSON=function(){return{$type:"ref",value:this._path}},r.prototype.getPath=function(){return d(this._path)},r.prototype._getBoundValue=t(13),r.prototype._getVersion=t(18),r.prototype._getValueSync=t(17),r.prototype._getPathValuesAsPathMap=j.getWithPathsAsPathMap,r.prototype._getPathValuesAsJSONG=j.getWithPathsAsJSONGraph,r.prototype._setPathValuesAsJSON=t(78),r.prototype._setPathValuesAsJSONG=t(78),r.prototype._setPathValuesAsPathMap=t(78),r.prototype._setPathValuesAsValues=t(78),r.prototype._setPathMapsAsJSON=t(77),r.prototype._setPathMapsAsJSONG=t(77),r.prototype._setPathMapsAsPathMap=t(77),r.prototype._setPathMapsAsValues=t(77),r.prototype._setJSONGsAsJSON=t(76),r.prototype._setJSONGsAsJSONG=t(76),r.prototype._setJSONGsAsPathMap=t(76),r.prototype._setJSONGsAsValues=t(76),r.prototype._setCache=t(77),r.prototype._invalidatePathValuesAsJSON=t(48),r.prototype._invalidatePathMapsAsJSON=t(47)},{100:100,102:102,116:116,13:13,130:130,134:134,14:14,16:16,17:17,18:18,19:19,24:24,3:3,4:4,47:47,48:48,49:49,5:5,55:55,6:6,61:61,63:63,64:64,65:65,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,84:84,88:88,96:96,98:98,99:99}],3:[function(t,e,n){function r(t){this._model=t._materialize().treatErrorsAsValues()}r.prototype.get=function(t){return this._model.get.apply(this._model,t)._toJSONG()},r.prototype.set=function(t){return this._model.set(t)._toJSONG()},r.prototype.call=function(t,e,n,r){var o=[t,e,n].concat(r);return this._model.call.apply(this._model,o)._toJSONG()},e.exports=r},{}],4:[function(t,e,n){function r(t){var e=t||{};this.syncRefCount=0,this.expired=e.expired||[],this.unsafeMode=e.unsafeMode||!1,this.collectionScheduler=e.collectionScheduler||new s,this.cache={},o(e.comparator)&&(this.comparator=e.comparator),o(e.errorSelector)&&(this.errorSelector=e.errorSelector),o(e.onChange)&&(this.onChange=e.onChange)}var o=t(96),i=t(91),s=t(74);r.prototype.errorSelector=function(t,e){return e},r.prototype.comparator=function(t,e){return i(t,"value")&&i(e,"value")?t.value===e.value&&t.$type===e.$type&&t.$expires===e.$expires:t===e},e.exports=r},{74:74,91:91,96:96}],5:[function(t,e,n){function r(t,e){var n,r=!1;try{++t._root.syncRefCount,n=t._derefSync(e)}catch(i){n=i,r=!0}finally{--t._root.syncRefCount}return r?o.Observable["throw"](n):o.Observable["return"](n)}var o=t(159),i=t(134);e.exports=function(t){for(var e=this,n=-1,s=arguments.length-1,u=new Array(s),a=i.fromPath(t);++n<s;)u[n]=i.fromPath(arguments[n+1]);if(0===s)throw new Error("Model#deref requires at least one value path.");return o.Observable.defer(function(){return r(e,a)}).flatMap(function(t){if(Boolean(t)){if(s>0){var n=o.Observable.of(t);return t.get.apply(t,u)["catch"](o.Observable.empty()).concat(n).last().flatMap(function(){return r(e,a)}).filter(function(t){return t})}return o.Observable["return"](t)}if(s>0){var i=u.map(function(t){return a.concat(t)});return e.get.apply(e,i).concat(o.Observable.defer(function(){return r(e,a)})).last().filter(function(t){return t})}return o.Observable.empty()})}},{134:134,159:159}],6:[function(t,e,n){var r=t(134),o=t(13),i=t(8),s=t(118);e.exports=function(t){var e=r.fromPath(t);if(!Array.isArray(e))throw new Error("Model#derefSync must be called with an Array path.");var n=o(this,this._path.concat(e),!1),u=n.path,a=n.value,c=n.found;if(c&&void 0!==a&&(a.$type!==s||void 0!==a.value)){if(a.$type)throw new i;return this._clone({_path:u})}}},{118:118,13:13,134:134,8:8}],7:[function(t,e,n){function r(){this.message=r.message,this.stack=(new Error).stack}r.prototype=new Error,r.prototype.name="BoundJSONGraphModelError",r.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",e.exports=r},{}],8:[function(t,e,n){function r(t,e){this.message=i,this.stack=(new Error).stack,this.boundPath=t,this.shortedPath=e}var o="InvalidModelError",i="The boundPath of the model is not valid since a value or error was found before the path end.";r.prototype=new Error,r.prototype.name=o,r.message=i,e.exports=r},{}],9:[function(t,e,n){function r(t){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=t}var o="InvalidSourceError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],10:[function(t,e,n){function r(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var o="MaxRetryExceededError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],11:[function(t,e,n){function r(t,e,n,r,o,h,f){for(var l,d,v=n,y=o,b=r,m=0;;){if(0===m&&b[c]?(m=y.length,d=b[c]):(l=y[m++],d=v[l]),d){var g=d.$type,w=g&&d.value||d;if(m<y.length){if(g){v=d;break}v=d;continue}if(v=d,g&&u(d))break;if(b[c]||i(b,d),g===a){f?s(t,d,h,null,null,null,y,y.length,f):p(t,d),m=0,y=w,b=d,v=e;continue}break}v=void 0;break}if(m<y.length&&void 0!==v){for(var x=[],_=0;m>_;_++)x[_]=y[_];y=x}return[v,y]}var o=t(26),i=o.create,s=t(22),u=t(27),a=t(120),c=t(33),p=t(29).promote;e.exports=r},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(t,e,n){var r=t(15),o=t(8),i=t(7);e.exports=function(t,e){return function(n,s,u){var a,c,p,h=u[0],f={values:u,optimizedPaths:[]},l=n._root.cache,d=n._path,v=l,y=d.length,b=[];if(y){if(e)return{criticalError:new i};if(v=r(n,d),v.$type)return{criticalError:new o(d,d)};for(a=[],c=0;y>c;++c)a[c]=d[c]}else a=[],y=0;for(c=0,p=s.length;p>c;c++)t(n,l,v,s[c],0,h,f,b,a,y,e);return f}}},{15:15,7:7,8:8}],13:[function(t,e,n){var r=t(17),o=t(8);e.exports=function(t,e,n){var i,s,u,a,c,p=e,h=e;for(i=t._boxed,n=t._materialized,s=t._treatErrorsAsValues,t._boxed=!0,t._materialized=void 0===n||n,t._treatErrorsAsValues=!0,u=r(t,p.concat(null),!0),t._boxed=i,t._materialized=n,t._treatErrorsAsValues=s,p=u.optimizedPath,a=u.shorted,c=u.found,u=u.value;p.length&&null===p[p.length-1];)p.pop();if(c&&a)throw new o(h,p);return{path:p,value:u,shorted:a,found:c}}},{17:17,8:8}],14:[function(t,e,n){function r(t){var e,n,r,o={},i=Object.keys(t);for(n=0,r=i.length;r>n;n++)e=i[n],s(e)||(o[e]=t[e]);return o}function o(t,e,n){Object.keys(t).filter(function(e){return!s(e)&&t[e]}).forEach(function(n){var s=t[n],u=e[n];if(u||(u=e[n]={}),s.$type){var a,c=s.value&&"object"==typeof s.value,p=!t[i];return a=c||p?r(s):s.value,void(e[n]=a)}o(s,u,n)})}var i=t(37),s=t(97);e.exports=function(t){var e={};return o(t,e),e}},{37:37,97:97}],15:[function(t,e,n){e.exports=function(t,e){for(var n=t._root.cache,r=-1,o=e.length;++r<o&&n&&!n.$type;)n=n[e[r]];return n}},{}],16:[function(t,e,n){var r=t(64),o=t(134);e.exports=function(t){for(var e=o.fromPath(t),n=0,i=e.length;++n<i;)if("object"==typeof e[n])return new r(function(t){t.onError(new Error("Paths must be simple paths"))});var s=this;return new r(function(t){return s.get(e).subscribe(function(n){for(var r=n.json,o=-1,i=e.length;r&&++o<i;)r=r[e[o]];t.onNext(r)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{134:134,64:64}],17:[function(t,e,n){var r=t(11),o=t(25),i=t(27),s=t(29).promote,u=t(120),a=t(118),c=t(119);e.exports=function(t,e,n){for(var p,h,f,l,d,v=t._root.cache,y=e.length,b=[],m=!1,g=!1,w=0,x=v,_=v,S=v,E=!0,C=!1;x&&y>w;){if(p=e[w++],null!==p&&(x=_[p],b[b.length]=p),!x){S=void 0,m=!0,E=!1;break}if(f=x.$type,f===a&&void 0===x.value){S=void 0,E=!1,m=y>w;break}if(y>w){if(f===u){if(i(x)){C=!0,S=void 0,E=!1;break}if(l=r(t,v,v,x,x.value),d=l[0],!d){S=void 0,x=void 0,E=!1;break}f=d.$type,x=d,b=l[1].slice(0)}if(f)break}else S=x;_=x}if(y>w&&!C){for(h=w;y>h;++h)if(null!==e[w]){g=!0;break}for(g?(m=!0,S=void 0):S=x,h=w;y>h;++h)null!==e[h]&&(b[b.length]=e[h])}if(S&&f&&(i(S)?S=void 0:s(t,S)),S&&f===c&&!t._treatErrorsAsValues)throw{path:w===y?e:e.slice(0,w),value:S.value};return S&&t._boxed?S=Boolean(f)&&!n?o(S):S:!S&&t._materialized?S={$type:a}:S&&(S=S.value),{value:S,shorted:m,optimizedPath:b,found:E}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(t,e,n){var r=t(46);e.exports=function(t,e){var n=t._getValueSync({_boxed:!0,_root:t._root,_treatErrorsAsValues:t._treatErrorsAsValues},e,!0).value,o=n&&n[r];return null==o?-1:o}},{46:46}],19:[function(t,e,n){var r=t(12),o=t(31),i=r(o,!1),s=r(o,!0);e.exports={getValueSync:t(17),getBoundValue:t(13),getWithPathsAsPathMap:i,getWithPathsAsJSONGraph:s}},{12:12,13:13,17:17,31:31}],20:[function(t,e,n){var r=t(29),o=t(25),i=r.promote;e.exports=function(t,e,n,r,s){var u=e.value;s.errors||(s.errors=[]),t._boxed&&(u=o(e)),s.errors.push({path:r.slice(0,n+1),value:u}),i(t,e)}},{25:25,29:29}],21:[function(t,e,n){function r(t,e,n,r,o,i,s){s.requestedMissingPaths.push(r.slice(0,n).concat(e)),s.optimizedMissingPaths.push(o.slice(0,i).concat(e))}var o=t(30),i=o.fastCopy;e.exports=function(t,e,n,o,s,u,a){var c;o.requestedMissingPaths||(o.requestedMissingPaths=[],o.optimizedMissingPaths=[]),c=n<e.length?i(e,n):[],r(t,c,n,s,u,a,o)}},{30:30}],22:[function(t,e,n){var r=t(29),o=t(25),i=r.promote,s=t(120),u=t(118),a=t(119),c=t(37);e.exports=function(t,e,n,r,p,h,f,l,d,v){if(n){var y,b,m,g,w,x,_,S,E=!1;if(e&&i(t,e),e&&void 0!==e.value||(E=t._materialized),E)S={$type:u};else if(t._boxed)S=o(e);else if(e.$type===s||e.$type===a)S=d?o(e):e.value;else if(d){var C=e.value&&"object"==typeof e.value,A=!e[c];S=C||A?o(e):e.value}else S=e.value;if(p&&(p.hasValue=!0),d){for(w=n.jsonGraph,w||(w=n.jsonGraph={},n.paths=[]),y=0,b=l-1;b>y;y++)g=f[y],w[g]||(w[g]={}),w=w[g];g=f[y],w[g]=E?{$type:u}:S,h&&n.paths.push(h.slice(0,r))}else if(0===r)n.json=S;else{for(w=n.json,w||(w=n.json={}),y=0;r-1>y;y++)m=h[y],w[m]||(w[m]={}),x=w,_=m,w=w[m];m=h[y],null!==m?w[m]=S:x[_]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(t,e,n){var r=t(27),o=t(26),i=t(29),s=o.remove,u=i.splice,a=t(119),c=t(20),p=t(22),h=t(21),f=t(28),l=t(35);e.exports=function(t,e,n,o,i,d,v,y,b,m,g){var w=e&&e.$type,x=e&&void 0===e.value;return e&&w?void(r(e)?(e[l]||(u(t,e),s(e)),h(t,n,o,d,v,y,b)):w===a?(g&&(v[o]=null),m||t._treatErrorsAsValues?p(t,e,i,o,d,v,y,b,m,g):c(t,e,o,v,d)):(g&&(v[o]=null),(!x||x&&t._materialized)&&p(t,e,i,o,d,v,y,b,m,g))):void(f(t)?p(t,e,i,o,d,v,y,b,m,g):h(t,n,o,d,v,y,b))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(t,e,n){var r=t(134);e.exports=function(t){var e=r.fromPath(t);if(Array.isArray(e)===!1)throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._syncCheck("getValueSync")&&this._getValueSync(this,e).value}},{134:134}],25:[function(t,e,n){var r=t(40);e.exports=function(t){var e,n,o,i=Object.keys(t);for(e={},n=0,o=i.length;o>n;n++){var s=i[n];s[0]!==r&&(e[s]=t[s])}return e}},{40:40}],26:[function(t,e,n){function r(t,e){var n=e[a]||0;e[i+n]=t,e[a]=n+1,t[u]=n,t[s]=e}function o(t){var e=t[s];if(e){for(var n=t[u],r=e[a];r>n;)e[i+n]=e[i+n+1],++n;e[a]=r-1,t[s]=void 0,t[u]=void 0}}var i=t(43),s=t(33),u=t(42),a=t(44);e.exports={create:r,remove:o}},{33:33,42:42,43:43,44:44}],27:[function(t,e,n){var r=t(106);e.exports=function(t){var e=void 0===t.$expires&&-1||t.$expires;return-1!==e&&1!==e&&(0===e||e<r())}},{106:106}],28:[function(t,e,n){e.exports=function(t){return t._materialized&&!t._source}},{}],29:[function(t,e,n){function r(t,e){var n=t._root,r=n[i];if(r!==e){var o=e[a],s=e[u];s&&(s[a]=o),o&&(o[u]=s),e[a]=void 0,n[i]=e,e[u]=r,r[a]=e}}function o(t,e){var n=t._root,r=e[a],o=e[u];o&&(o[a]=r),r&&(r[u]=o),e[a]=void 0,e===n[i]&&(n[i]=void 0),e===n[s]&&(n[s]=void 0),e[c]=!0,n.expired.push(e)}var i=t(34),s=t(45),u=t(38),a=t(41),c=t(35);e.exports={promote:r,splice:o}},{34:34,35:35,38:38,41:41,45:45}],30:[function(t,e,n){function r(t,e){var n,r,o,i=[];for(r=0,o=e||0,n=t.length;n>o;r++,o++)i[r]=t[o];return i}function o(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)null!==e[o]&&(i[n++]=e[o]);return i}function i(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)i[n++]=e[o];return i}e.exports={fastCat:i,fastCatSkipNulls:o,fastCopy:r}},{}],31:[function(t,e,n){var r=t(11),o=t(23),i=t(27),s=t(143).iterateKeySet,u=t(120),a=t(29).promote;e.exports=function c(t,e,n,p,h,f,l,d,v,y,b,m){var g=m,w=v;if(!n||n&&n.$type||h===p.length)return void o(t,n,p,h,f,l,d,w,y,b,g);var x,_;x=p[h];var S="object"==typeof x,E=h+1,C=!1,A=x;if(S&&(C={},A=s(x,C)),void 0!==A||!C.done){var N=y+1;do{g=!1;var k;null===A?k=n:(k=n[A],w[y]=A,d[h]=A);var O=w,P=N;if(k){var j=k.$type,D=j&&k.value||k;if(E<p.length&&j&&j===u&&!i(k)){b&&o(t,k,p,E,f,l,null,w,P,b,g),a(t,k);var q=r(t,e,e,k,D,f,b);g=!0,k=q[0];var R=q[1];for(O=[],P=R.length,_=0;P>_;++_)O[_]=R[_]}}c(t,e,k,p,E,f,l,d,O,P,b,g),C&&!C.done&&(A=s(x,C))}while(C&&!C.done)}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(t,e,n){"use strict";function r(t){return new r.Model(t)}"function"==typeof Promise?r.Promise=Promise:r.Promise=t(151),e.exports=r,r.Model=t(2)},{151:151,2:2}],33:[function(t,e,n){e.exports=t(40)+"context"},{40:40}],34:[function(t,e,n){e.exports=t(40)+"head"},{40:40}],35:[function(t,e,n){e.exports=t(40)+"invalidated"},{40:40}],36:[function(t,e,n){e.exports=t(40)+"key"},{40:40}],37:[function(t,e,n){e.exports="$modelCreated"},{}],38:[function(t,e,n){e.exports=t(40)+"next"},{40:40}],39:[function(t,e,n){e.exports=t(40)+"parent"},{40:40}],40:[function(t,e,n){e.exports=String.fromCharCode(30)},{}],41:[function(t,e,n){e.exports=t(40)+"prev"},{40:40}],42:[function(t,e,n){e.exports=t(40)+"ref-index"},{40:40}],43:[function(t,e,n){e.exports=t(40)+"ref"},{40:40}],44:[function(t,e,n){e.exports=t(40)+"refs-length"},{40:40}],45:[function(t,e,n){e.exports=t(40)+"tail"},{40:40}],46:[function(t,e,n){e.exports=t(40)+"version"},{40:40}],47:[function(t,e,n){function r(t,e,n,o,s,u,c,p,h,f){if(!_(t)&&!t.$type)for(var l in t)if(l[0]!==a&&"$"!==l[0]&&m(t,l)){var d=t[l],v=g(d)&&!d.$type,y=i(n,o,s,l,d,v,!1,u,c,p,h,f),w=y[0],x=y[1];w&&(v?r(d,e+1,n,x,w,u,c,p,h,f):A(w,x,l,p)&&C(x,b(w),p,u))}}function o(t,e,n,r,o,s,a,h){if(w(n))return S(n,o,s),[void 0,e];y(s,n);var d=n,v=n.value,b=e;if(n=n[p],null!=n)b=n[c]||e;else{var m=0,g=v.length-1;b=n=e;do{var x=v[m],E=g>m,C=i(e,b,n,x,t,E,!0,r,o,s,a,h);if(n=C[0],_(n))return C;b=C[1]}while(m++<g);if(d[p]!==n){var A=n[l]||0;n[l]=A+1,n[u+A]=d,d[p]=n,d[f]=A}}return[n,b]}function i(t,e,n,r,i,u,a,c,p,h,f,l){for(var v=n.$type;v===d;){var y=o(i,t,n,c,p,h,f,l);if(n=y[0],_(n))return y;e=y[1],v=n&&n.$type}if(void 0!==v)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(40),c=t(39),p=t(33),h=t(46),f=t(42),l=t(44),d=t(120),v=t(13),y=t(50),b=t(88),m=t(91),g=t(100),w=t(95),x=t(96),_=t(102),S=t(86),E=t(92),C=t(115),A=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=E(),u=n._comparator,a=n._errorSelector,p=t._path,f=n.cache,l=p.length?v(t,p).value:f,d=l[c]||f,y=f[h],b=-1,m=e.length;++b<m;){var g=e[b];r(g.json,0,f,d,l,s,i,o,u,a)}var w=f[h],_=n.onChange;x(_)&&y!==w&&_()}},{100:100,102:102,109:109,115:115,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,88:88,91:91,92:92,95:95,96:96}],48:[function(t,e,n){function r(t,e,n,o,s,u,a,c){var p={},h=e<t.length-1,f=t[e],l=x(f,p);do{var d=i(n,o,s,l,h,!1,u,a,c),v=d[0],b=d[1];v&&(h?r(t,e+1,n,b,v,u,a,c):E(v,b,l,c)&&S(b,y(v),c,u)),l=x(f,p)}while(!p.done)}function o(t,e,n,r,o){if(b(e))return w(e,r,o),[void 0,t];v(o,e);var s=e,p=e.value,l=t;if(e=e[c],null!=e)l=e[a]||t;else{var d=0,y=p.length-1;l=e=t;do{var m=p[d],x=y>d,_=i(t,l,e,m,x,!0,n,r,o);if(e=_[0],g(e))return _;l=_[1]}while(d++<y);if(s[c]!==e){var S=e[f]||0;e[f]=S+1,e[u+S]=s,s[c]=e,s[h]=S}}return[e,l]}function i(t,e,n,r,i,u,a,c,p){for(var h=n.$type;h===l;){var f=o(t,n,a,c,p);if(n=f[0],g(n))return f;e=f[1],h=n.$type}if(void 0!==h)return[n,e];if(null==r){if(i)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(88),b=t(95),m=t(96),g=t(102),w=t(86),x=t(143).iterateKeySet,_=t(92),S=t(115),E=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=_(),u=t._path,c=n.cache,h=u.length?d(t,u).value:c,f=h[a]||c,l=c[p],v=-1,y=e.length;++v<y;){var b=e[v];r(b,0,c,f,h,s,i,o)}var g=c[p],w=n.onChange;m(w)&&l!==g&&w()}},{102:102,109:109,115:115,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,88:88,92:92,95:95,96:96}],49:[function(t,e,n){var r=t(36),o=t(39),i=t(34),s=t(45),u=t(38),a=t(41),c=t(108),p=t(115);e.exports=function(t,e,n,h,f,l){var d=n,v=f;"number"!=typeof v&&(v=.75);var y,b,m,g="number"==typeof l,w=h*v;for(b=e.pop();b;)m=b.$size||0,d-=m,g===!0?p(b,m,t,l):(y=b[o])&&c(b,y,b[r],t),b=e.pop();if(d>=h){var x=t[s];for(b=x;d>=w&&b;)x=x[a],m=b.$size||0,d-=m,g===!0&&p(b,m,t,l),b=x;t[s]=t[a]=b,null==b?t[i]=t[u]=void 0:b[u]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(t,e,n){var r=t(121),o=t(34),i=t(45),s=t(38),u=t(41),a=t(100);e.exports=function(t,e){if(a(e)&&e.$expires!==r){var n=t[o],c=t[i],p=e[s],h=e[u];e!==n&&(null!=p&&"object"==typeof p&&(p[u]=h),null!=h&&"object"==typeof h&&(h[s]=p),p=n,null!=n&&"object"==typeof n&&(n[u]=e),t[o]=t[s]=n=e,n[s]=p,n[u]=void 0),null!=c&&e!==c||(t[i]=t[u]=c=h||e)}return e}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(t,e,n){var r=t(34),o=t(45),i=t(38),s=t(41);e.exports=function(t,e){var n=t[r],u=t[o],a=e[i],c=e[s];null!=a&&"object"==typeof a&&(a[s]=c),null!=c&&"object"==typeof c&&(c[i]=a),e===n&&(t[r]=t[i]=a),e===u&&(t[o]=t[s]=c),e[i]=e[s]=void 0,n=u=a=c=void 0}},{34:34,38:38,41:41,45:45}],52:[function(t,e,n){function r(t,e){var n=!1;return function(){if(!n&&!t._disposed){n=!0,t._callbacks[e]=null,t._optimizedPaths[e]=[],t._requestedPaths[e]=[];var r=--t._count;0!==r||t.sent||(t._disposable.dispose(),t.requestQueue.removeRequest(t))}}}function o(t){for(var e=[],n=-1,r=0,o=t.length;o>r;++r)for(var i=t[r],s=0,u=i.length;u>s;++s)e[++n]=i[s];return e}var i=t(59),s=t(60),u=0,a=t(57).GetRequest,c=t(76),p=t(78),h=t(119),f=[],l=function(t,e){this.sent=!1,this.scheduled=!1,this.requestQueue=e,this.id=++u,this.type=a,this._scheduler=t,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};l.prototype={batch:function(t,e,n){var o=this,i=o._optimizedPaths,u=o._requestedPaths,a=o._callbacks,c=i.length;return i[c]=e,u[c]=t,a[c]=n,++o._count,o.scheduled||(o.scheduled=!0,o._disposable=o._scheduler.schedule(function(){s(o,i,function(t,e){if(o.requestQueue.removeRequest(o),o._disposed=!0,o._count){o._merge(u,t,e);for(var n=0,r=a.length;r>n;++n){var i=a[n];i&&i(t,e)}}})})),r(o,c)},add:function(t,e,n){var o,s,u=this,a=i(t,e,u._pathMap);a?(s=a[2],o=a[1]):(s=t,o=e);var c=!1,p=!1;if(o.length<e.length){c=!0;var h=u._callbacks.length;u._callbacks[h]=n,u._requestedPaths[h]=a[0],u._optimizedPaths[h]=[],++u._count,p=r(u,h)}return[c,s,o,p]},_merge:function(t,e,n){var r=this,i=r.requestQueue.model,s=i._root,u=s.errorSelector,a=s.comparator,l=i._path;i._path=f;var d=o(t);if(e){var v=e;v instanceof Error&&(v={message:v.message}),v.$type||(v={$type:h,value:v});var y=d.map(function(t){return{path:t,value:v}});p(i,y,null,u,a)}else c(i,[{paths:d,jsonGraph:n.jsonGraph}],null,u,a);i._path=l}},e.exports=l},{119:119,57:57,59:59,60:60,76:76,78:78}],53:[function(t,e,n){function r(){this.length=0,this.pending=!1,this.pathmaps=[],s.call(this,this._subscribe)}var o=t(159),i=o.Observer,s=o.Observable,u=o.Disposable,a=o.SerialDisposable,c=o.CompositeDisposable,p=t(9),h=t(143),f=h.iterateKeySet;r.create=function(t,e,n){var r=new this;return r.queue=t,r.model=e,r.index=n,r},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.insertPath=function(t,e,n,r,o){var i=r||0,s=o||t.length-1,u=n||this.pathmaps[s+1]||(this.pathmaps[s+1]=Object.create(null));if(void 0===u||null===u)return!1;var a,c,p=t[i],h={};a=f(p,h);do{if(c=u[a],s>i){if(null==c){if(e)return!1;c=u[a]=Object.create(null)}if(this.insertPath(t,e,c,i+1,s)===!1)return!1}else u[a]=(c||0)+1,this.length+=1;h.done||(a=f(p,h))}while(!h.done);return!0},r.prototype.removePath=function(t,e,n,r){var o=n||0,i=r||t.length-1,s=e||this.pathmaps[i+1];if(void 0===s||null===s)return!0;var u,a,c=0,p=t[o],h={};u=f(p,h);do if(a=s[u],void 0!==a&&null!==a){if(i>o){c+=this.removePath(t,a,o+1,i);var l=void 0;for(l in a)break;void 0===l&&delete s[u]}else a=s[u]=(a||1)-1,0===a&&delete s[u],c+=1,this.length-=1;h.done||(u=f(p,h))}while(!h.done);return c},r.prototype.getSourceObserver=function(t){var e=this;return i.create(function(n){n.jsonGraph=n.jsonGraph||n.jsong||n.values||n.value,n.index=e.index,t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})},r.prototype._subscribe=function(t){var e=this,n=this.queue;e.pending=!0;var r=!1,o=new a,i=u.create(function(){r||(r=!0,n&&n._remove(e))}),s=new c(o,i);try{o.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(t)))}catch(h){throw new p(h)}return s},e.exports=r},{143:143,159:159,9:9}],54:[function(t,e,n){function r(t,e){this.total=0,this.model=t,this.requests=[],this.scheduler=e}var o=t(58),i=t(40),s=t(90),u=t(100),a=t(143);r.prototype.set=function(t){return t.paths=a.collapse(t.paths),o.create(this.model,t)},r.prototype._remove=function(t){var e=this.requests,n=e.indexOf(t);-1!==n&&e.splice(n,1)},r.prototype.distributePaths=function(t,e,n){var r,o,i=this.model,s=-1,u=t.length,a=-1,c=e.length,p=[];t:for(;++s<u;){var h=t[s];for(a=-1;++a<c;)if(o=e[a],o.insertPath(h,o.pending)){p[a]=o;continue t}r||(r=n.create(this,i,this.total++),e[a]=r,p[c++]=r),r.insertPath(h,!1)}var f=[],l=-1;for(a=-1;++a<c;)o=p[a],null!=o&&(f[++l]=o);return f},r.prototype.mergeJSONGraphs=function(t,e){var n=0,r=[],o=[],a=[],c=t.index,p=e.index;t.index=Math.max(c,p),r[-1]=t.jsonGraph||{},o[-1]=e.jsonGraph||{};t:for(;n>-1;){for(var h=r[n-1],f=o[n-1],l=a[n-1]||(a[n-1]=Object.keys(f));l.length>0;){var d=l.pop();if(d[0]!==i)if(h.hasOwnProperty(d)){var v=h[d],y=s(v),b=f[d],m=s(b);if(u(v)&&u(b)&&!y&&!m){r[n]=v,o[n]=b,n+=1;continue t}p>c&&(h[d]=b)}else h[d]=f[d]}n-=1}return t},e.exports=r},{100:100,143:143,40:40,58:58,90:90}],55:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(54),i=t(56);r.prototype.get=i.prototype.get,r.prototype.removeRequest=i.prototype.removeRequest,r.prototype.set=o.prototype.set,r.prototype.call=o.prototype.call,e.exports=r},{54:54,56:56}],56:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(57),i=t(52);r.prototype={setScheduler:function(t){this.scheduler=t},get:function(t,e,n){function r(){v||(--h,0===h&&n())}var s,u,a,c=this,p=[],h=0,f=c._requests,l=e,d=t,v=!1;for(s=0,u=f.length;u>s;++s)if(a=f[s],a.type===o.GetRequest){if(a.sent){var y=a.add(d,l,r);y[0]&&(d=y[1],l=y[2],p[p.length]=y[3],++h)}else a.batch(d,l,r),l=[],d=[],++h;if(!l.length)break}if(l.length){a=new i(c.scheduler,c),f[f.length]=a,++h;var b=a.batch(d,l,r);p[p.length]=b}return function(){if(!v&&0!==h){v=!0;for(var t=p.length,e=0;t>e;++e)p[e]()}}},removeRequest:function(t){for(var e=this._requests,n=e.length;--n>=0;)if(e[n].id===t.id){e.splice(n,1);break}}},e.exports=r},{52:52,57:57}],57:[function(t,e,n){e.exports={GetRequest:"GET"}},{}],58:[function(t,e,n){function r(){s.call(this)}var o=t(159),i=o.Observer,s=t(53),u=t(83),a=t(76),c=t(78),p=new Array(0);r.create=function(t,e){var n=new r;return n.model=t,n.jsonGraphEnvelope=e,n},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.method="set",r.prototype.insertPath=function(){return!1},r.prototype.removePath=function(){return 0},r.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},r.prototype.getSourceObserver=function(t){var e=this.model,n=e._path,r=this.jsonGraphEnvelope.paths,o=e._root,h=o.errorSelector,f=o.comparator;return s.prototype.getSourceObserver.call(this,i.create(function(o){e._path=p;var i=a(e,[{paths:r,jsonGraph:o.jsonGraph}],null,h,f);o.paths=i[1],e._path=n,t.onNext(o)},function(o){e._path=p,c(e,u(r,function(t){return{path:t,value:o}}),null,h,f),e._path=n,t.onError(o)},function(){t.onCompleted()}))},e.exports=r},{159:159,53:53,76:76,78:78,83:83}],59:[function(t,e,n){var r=t(143).hasIntersection,o=t(84);e.exports=function(t,e,n){for(var i=[],s=[],u=[],a=-1,c=-1,p=!1,h=0,f=e.length;f>h;++h){var l=e[h],d=n[l.length];d&&r(d,l,0)?(!p&&h>0&&(s=o(t,0,h),i=o(e,0,h)),u[++a]=t[h],p=!0):p&&(i[++c]=l,s[c]=t[h])}return p?[u,i,s]:null}},{143:143,84:84}],60:[function(t,e,n){var r=t(143),o=r.toTree,i=r.toPaths;e.exports=function(t,e,n){if(0===t._count)return void t.requestQueue.removeRequest(t);t.sent=!0,t.scheduled=!1;for(var r=t._pathMap,s=Object.keys(e),u=0,a=s.length;a>u;++u)for(var c=e[u],p=0,h=c.length;h>p;++p){var f=c[p],l=f.length;if(r[l]){var d=r[l];d[d.length]=f}else r[l]=[f]}for(var v=Object.keys(r),y=0,b=v.length;b>y;++y){var m=v[y];r[m]=o(r[m])}var g,w=t._collasped=i(r);t.requestQueue.model._source.get(w).subscribe(function(t){g=t},function(t){n(t,g)},function(){n(null,g)})}},{143:143}],61:[function(t,e,n){function r(t){u.call(this,t||i)}function o(t){return s.Observable.defer(function(){return t})}function i(t){function e(t){function e(t,e){if(Boolean(e.invalidated))t.invalidations.push(t.localThisPath.concat(e.path));else{var n=e.path,r=e.value;Boolean(r)&&"object"==typeof r&&r.$type===f?t.references.push({path:i(n),value:e.value}):t.values.push({path:i(n),value:e.value})}return t}function n(t){var e=t.values.concat(t.references);return e.length>0?o(g.set.apply(g,e)._toJSONG()).map(function(e){return{results:t,envelope:e}}):u["return"]({results:t,envelope:{jsonGraph:{},paths:[]}})}function r(t){var e,n=t.envelope,r=t.results,c=r.values,p=r.references,h=r.invalidations,f=c.map(a).map(i),l=p.reduce(s,[]),d=b.map(i),v=l.concat(d);return e=v.length>0?o(m.get.apply(m,f.concat(v))._toJSONG()):u["return"](n),e.doAction(function(t){t.invalidated=h})}function s(t,e){var n=e.path;return t.push.apply(t,y.map(function(t){return n.concat(t)})),t}function a(t){return t.path}var c=t&&t.localFn;if("function"==typeof c){var p=t.model,h=p._path,l=c.apply(p,v).reduce(e,{values:[],references:[],invalidations:[],localThisPath:h}).flatMap(n).flatMap(r);return u["return"](l)}return u.empty()}function n(t){function e(t){var e=t.invalidated;return e&&e.length&&m.invalidate.apply(m,e),t}return t&&"object"==typeof t?s.Observable.defer(function(){
-var e;try{e=t.call(x,v,y,b)}catch(n){e=u["throw"](new p(n))}return e}).map(e):u.empty()}function r(t){return o(g.set(t)).reduce(function(t){return t},null).map(function(){return{invalidated:t.invalidated,paths:t.paths.map(function(t){return t.slice(w.length)})}})}function i(t){return _.concat(t)}var c=this.args,l=this.model,d=h.fromPath(c[0]),v=c[1]||[],y=(c[2]||[]).map(h.fromPath),b=(c[3]||[]).map(h.fromPath),m=l._clone({_path:[]}),g=m.withoutDataSource(),w=l._path,x=w.concat(d),_=x.slice(0,-1),S=o(l.withoutDataSource().get(d)).map(function(t){for(var e=t.json,n=-1,r=d.length;e&&++n<r;)e=e[d[n]];var o=m._derefSync(_).boxValues();return{model:o,localFn:e}}).flatMap(e).defaultIfEmpty(n(l._source)).mergeAll().flatMap(r),E=new a;return E.add(S.subscribe(function(e){var n=e.paths,r=e.invalidated,i=l.get.apply(l,n);"AsJSONG"===t.outputFormat&&(i=o(i._toJSONG()).doAction(function(t){t.invalidated=r})),E.add(i.subscribe(t))},function(e){t.onError(e)})),E}var s=t(159)&&t(158),u=s.Observable,a=s.CompositeDisposable,c=t(64),p=t(9),h=t(134),f=t(120);r.create=c.create,r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){return this},r.prototype.initialize=function(){return this},e.exports=r},{120:120,134:134,158:158,159:159,64:64,9:9}],62:[function(t,e,n){function r(t){i.call(this,t)}var o=t(159),i=o.Observable,s=t(64),u=t(134),a=t(88),c=t(49),p=t(81),h=t(46),f=Array.isArray,l=t(101),d=t(98),v=t(99);r.create=s.create,r.prototype=Object.create(i.prototype),r.prototype.constructor=r,r.prototype.subscribeCount=0,r.prototype.subscribeLimit=10,r.prototype.initialize=function(){for(var t,e,n=this.model,r=this.outputFormat||"AsPathMap",o=this.isProgressive,i=[{}],s=[],a=this.args,c=-1,h=a.length;++c<h;){var y,b=a[c];f(b)||"string"==typeof b?(b=u.fromPath(b),y="PathValues"):l(b)?(b.path=u.fromPath(b.path),y="PathValues"):v(b)?y="JSONGs":d(b)&&(y="PathMaps"),e!==y&&(e=y,t={inputType:y,arguments:[]},s.push(t),t.values=i),t.arguments.push(b)}return this.boundPath=p(n._path),this.groups=s,this.outputFormat=r,this.isProgressive=o,this.isCompleted=!1,this.isMaster=null==n._source,this.values=i,this},r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){var e=this["finally"](function(){var e=t._root,n=e.cache;e.collectionScheduler.schedule(function(){c(e,e.expired,a(n),t._maxSize,t._collectRatio,n[h])})});return new this.constructor(function(t){return e.subscribe(t)})},e.exports=r},{101:101,134:134,159:159,46:46,49:49,64:64,81:81,88:88,98:98,99:99}],63:[function(t,e,n){function r(t){u.call(this,t||o)}function o(t){for(var e=this.model,n=this.method,r=this.groups,o=-1,i=r.length;++o<i;){var u=r[o],a=u.inputType,c=u.arguments;if(c.length>0){var p="_"+n+a+"AsJSON",h=e[p];h(e,c)}}return t.onCompleted(),s.empty}var i=t(159),s=i.Disposable,u=t(62);r.create=u.create,r.prototype=Object.create(u.prototype),r.prototype.method="invalidate",r.prototype.constructor=r,e.exports=r},{159:159,62:62}],64:[function(t,e,n){function r(t){this._subscribe=t}function o(t){var e=this.model,n=new this.type;return n.model=e,n.args=this.args,n.outputFormat=t.outputFormat||"AsPathMap",n.isProgressive=t.isProgressive||!1,n.subscribeCount=0,n.subscribeLimit=t.retryLimit||10,n.initialize().invokeSourceRequest(e).ensureCollect(e).subscribe(t)}var i=t(32),s=t(159)&&t(158),u=s.Observable,a=t(84),c=t(105),p={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};r.create=function(t,e){var n=new r(o);return n.args=e,n.type=this,n.model=t,n},r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype._mixin=function(){var t=this,e=a(arguments);return new t.constructor(function(n){return t.subscribe(e.reduce(function(t,e){return Object.create(t,e)},n))})},r.prototype._toJSONG=function(){return this._mixin(p)},r.prototype.progressively=function(){return this._mixin(h)},r.prototype.subscribe=function(t,e,n){var r=t;r&&"object"==typeof r||(r={onNext:t||c,onError:e||c,onCompleted:n||c});var o=this._subscribe(r);switch(typeof o){case"function":return{dispose:o};case"object":return o||{dispose:c};default:return{dispose:c}}},r.prototype.then=function(t,e){var n=this;return new i.Promise(function(t,e){var r,o=!1;n.toArray().subscribe(function(t){r=t.length<=1?t[0]:t},function(t){o=!0,e(t)},function(){o===!1&&t(r)})}).then(t,e)},e.exports=r},{105:105,158:158,159:159,32:32,84:84}],65:[function(t,e,n){function r(t){l.call(this,t||o)}function o(t){return this.isCompleted?s.call(this,t):i.call(this,t)}function i(t){if(this.subscribeCount++>this.subscribeLimit)return t.onError("Loop kill switch thrown."),h.empty;for(var e=[],n=[],r=this.model,o=this.isMaster,i=r._root,c=this.outputFormat,p=i.errorSelector,f=this.method,l=this.groups,d=-1,y=l.length;++d<y;){var b=l[d],m=b.inputType,g=b.arguments;if(g.length>0){var w="_"+f+m+c,x=r[w],_=x(r,g,null,p);n.push.apply(n,_[1]),"PathValues"===m?e.push.apply(e,g.map(u)):"JSONGs"===m?e.push.apply(e,v(g,a)):e.push.apply(e,_[0])}}return this.requestedPaths=e,o?(this.isCompleted=!0,s.call(this,t)):void t.onError({method:f,optimizedPaths:n,invokeSourceRequest:!0})}function s(t){var e=new f(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(e=e._toJSONG()),this.isProgressive&&(e=e.progressively()),e.subscribe(t)}function u(t){return t.path}function a(t){return t.paths}var c=t(159),p=c.Observable,h=c.Disposable,f=t(67),l=t(62),d=t(9),v=t(82),y=new Array(0);r.create=l.create,r.prototype=Object.create(l.prototype),r.prototype.method="set",r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){var e=this,n=this["catch"](function(r){var o;if(r&&r.invokeSourceRequest===!0){var i={},s=t._path,u=r.optimizedPaths;t._path=y,t._getPathValuesAsJSONG(t._materialize().withoutDataSource(),u,[i]),t._path=s,o=t._request.set(i)["do"](function(t){e.isCompleted=u.length===t.paths.length},function(){e.isCompleted=!0}).materialize().flatMap(function(t){if("C"===t.kind)return p.empty();if("E"===t.kind){var e=t.exception;if(d.is(e))return p["throw"](t.exception)}return n})}else o=p["throw"](r);return o});return new this.constructor(function(t){return n.subscribe(t)})},e.exports=r},{159:159,62:62,67:67,82:82,9:9}],66:[function(t,e,n){var r=function(t){this.disposed=!1,this.currentDisposable=t};r.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var t=this.currentDisposable;t.dispose?t.dispose():t()}}},e.exports=r},{}],67:[function(t,e,n){var r=t(64),o=t(68),i=t(69),s={dispose:function(){}},u=t(159).Observable,a=e.exports=function(t,e,n,r){this.model=t,this.currentRemainingPaths=e,this.isJSONGraph=n||!1,this.isProgressive=r||!1};a.prototype=Object.create(u.prototype),a.prototype.subscribe=r.prototype.subscribe,a.prototype.then=r.prototype.then,a.prototype._toJSONG=function(){return new a(this.model,this.currentRemainingPaths,!0,this.isProgressive)},a.prototype.progressively=function(){return new a(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},a.prototype._subscribe=function(t){var e=[{}],n=[],r=t.isJSONG=this.isJSONGraph,u=this.isProgressive,a=o(this.model,this.currentRemainingPaths,t,u,r,e,n);return a?i(this,this.model,a,t,e,n,1):s}},{159:159,64:64,68:68,69:69}],68:[function(t,e,n){var r=t(19),o=r.getWithPathsAsJSONGraph,i=r.getWithPathsAsPathMap;e.exports=function(t,e,n,r,s,u,a){var c;if(c=s?o(t,e,u):i(t,e,u),c.criticalError)return n.onError(c.criticalError),null;var p=c.hasValue,h=!c.requestedMissingPaths||!t._source,f=u[0].json||u[0].jsonGraph;if(c.errors)for(var l=c.errors,d=a.length,v=0,y=l.length;y>v;++v,++d)a[d]=l[v];if(p&&r||f&&h)try{++t._root.syncRefCount,n.onNext(u[0])}catch(b){throw b}finally{--t._root.syncRefCount}return h?(a.length?n.onError(a):n.onCompleted(),null):c}},{19:19}],69:[function(t,e,n){var r=t(68),o=t(10),i=t(30).fastCat,s=t(49),u=t(88),a=t(66),c=t(46);e.exports=function p(t,e,n,h,f,l,d){if(10===d)throw new o;var v=e._request,y=n.requestedMissingPaths,b=n.optimizedMissingPaths,m=new a,g=[],w=e._path;if(w.length)for(var x=0,_=y.length;_>x;++x)g[x]=i(w,y[x]);else g=y;var S=v.get(g,b,function(){var n=r(e,y,h,t.isProgressive,t.isJSONGraph,f,l);if(n)m.currentDisposable=p(t,e,n,h,f,l,d+1);else{var o=e._root,i=o.cache,a=i[c];s(o,o.expired,u(i),e._maxSize,e._collectRatio,a)}});return m.currentDisposable=S,m}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(t,e,n){var r=t(67);e.exports=function(t){return new r(this,t)}},{67:67}],71:[function(t,e,n){var r=t(134),o=t(64),i=t(72),s=t(116),u=t(67);e.exports=function(){var t=s(arguments,i,"get");if(t!==!0)return new o(function(e){e.onError(t)});var e=r.fromPathsOrPathValues(arguments);return new u(this,e)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(t,e,n){e.exports={path:!0,pathSyntax:!0}},{}],73:[function(t,e,n){function r(){}var o=t(123),i=t(159),s=i.Disposable;r.prototype.schedule=function(t){return o(t),s.empty},r.prototype.scheduleWithState=function(t,e){var n=this;return o(function(){e(n,t)}),s.empty},e.exports=r},{123:123,159:159}],74:[function(t,e,n){function r(){}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){return t(),i.empty},r.prototype.scheduleWithState=function(t,e){return e(this,t),i.empty},e.exports=r},{159:159}],75:[function(t,e,n){function r(t){this.delay=t}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){var e=setTimeout(t,this.delay);return i.create(function(){void 0!==e&&(clearTimeout(e),e=void 0)})},r.prototype.scheduleWithState=function(t,e){var n=this,r=setTimeout(function(){e(n,t)},this.delay);return i.create(function(){void 0!==r&&(clearTimeout(r),r=void 0)})},e.exports=r},{159:159}],76:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,d,v,y,b,g,w){for(var x={},_=e<t.length-1,S=t[e],E=m(S,x),C=d.index;;){f.depth=e;var A=i(n,o,s,u,a,c,E,_,!1,f,d,v,y,b,g,w);f[e]=E,f.index=e,d[d.index++]=E;var N=A[0],k=A[1];if(N&&(_?r(t,e+1,n,k,N,u,A[3],A[2],p,h,f,d,v,y,b,g,w):(l(b,N),p.push(f.slice(0,f.index+1)),h.push(d.slice(0,d.index)))),E=m(S,x),x.done)break;d.index=C}}function o(t,e,n,r,o,s,c,f,v,m,g){var w=e.value;if(s.splice(0,s.length),s.push.apply(s,w),d(e))return s.index=w.length,b(e,f,v),[void 0,t,r,n];l(v,e);var x=0,_=e,S=w.length-1,E=e=t,C=r=n;do{var A=w[x],N=S>x,k=i(t,E,e,n,C,r,A,N,!0,o,s,c,f,v,m,g);if(e=k[0],y(e))return s.index=x,k;E=k[1],r=k[2],C=k[3]}while(x++<S);if(s.index=x,_[a]!==e){var O=e[h]||0;e[h]=O+1,e[u+O]=_,_[a]=e,_[p]=O}return[e,E,r,C]}function i(t,e,n,r,i,u,a,c,p,h,l,d,v,b,m,g){for(var x=n.$type;x===f;){var _=o(t,n,r,u,h,l,d,v,b,m,g);if(n=_[0],y(n))return _;e=_[1],u=_[2],i=_[3],x=n.$type}if(void 0!==x)return[n,e,u,i];if(null==a){if(c)throw new Error("`null` is not allowed in branch key positions.");n&&(a=n[s])}else e=n,i=u,n=e[a],u=i&&i[a];return n=w(e,n,u,a,h,l,d,v,b,m,g),[n,e,u,i]}var s=t(36),u=t(43),a=t(33),c=t(46),p=t(42),h=t(44),f=t(120),l=t(50),d=t(94),v=t(96),y=t(102),b=t(86),m=t(143).iterateKeySet,g=t(92),w=t(103);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,p=g(),h=s.cache,f=h[c],l=[],d=[],y=[],b=[],m=-1,w=e.length;++m<w;)for(var x=e[m],_=x.paths,S=x.jsonGraph,E=-1,C=_.length;++E<C;){var A=_[E];d.index=0,r(A,0,h,h,h,S,S,S,y,b,l,d,p,a,u,i,o)}var N=h[c],k=s.onChange;return v(k)&&f!==N&&k(),[y,b]}},{102:102,103:103,120:120,143:143,33:33,36:36,42:42,43:43,44:44,46:46,50:50,86:86,92:92,94:94,96:96}],77:[function(t,e,n){function r(t,e,n,o,u,a,c,p,h,f,l,d,v,y){var b=s(t);if(b&&b.length)for(var g=0,x=b.length,_=h.index;;){var S=b[g],E=t[S],C=w(E)&&!E.$type;p.depth=e;var A=i(n,o,u,S,E,C,!1,p,h,f,l,d,v,y);p[e]=S,p.index=e,h[h.index++]=S;var N=A[0],k=A[1];if(N&&(C?r(E,e+1,n,k,N,a,c,p,h,f,l,d,v,y):(m(d,N),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),++g>=x)break;h.index=_}}function o(t,e,n,r,o,s,u,c,f,v){var y=n.value;if(o.splice(0,o.length),o.push.apply(o,y),x(n))return o.index=y.length,E(n,u,c),[void 0,e];m(c,n);var b=n,g=e;if(n=n[h],null!=n)g=n[p]||e,o.index=y.length;else{var w=0,_=y.length-1;g=n=e;do{var C=y[w],A=_>w,N=i(e,g,n,C,t,A,!0,r,o,s,u,c,f,v);if(n=N[0],S(n))return o.index=w,N;g=N[1]}while(w++<_);if(o.index=w,b[h]!==n){var k=n[d]||0;n[d]=k+1,n[a+k]=b,b[h]=n,b[l]=k}}return[n,g]}function i(t,e,n,r,i,s,a,c,p,h,f,l,d,y){for(var b=n.$type;b===v;){var m=o(i,t,n,c,p,h,f,l,d,y);if(n=m[0],S(n))return m;e=m[1],b=n&&n.$type}if(void 0!==b)return[n,e];if(null==r){if(s)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[u])}else e=n,n=e[r];return n=A(e,n,r,i,s,a,c,p,h,f,l,d,y),[n,e]}function s(t){if(w(t)&&!t.$type){var e=[],n=0;b(t)&&(e[n++]="length");for(var r in t)r[0]!==c&&"$"!==r[0]&&g(t,r)&&(e[n++]=r);return e}}var u=t(36),a=t(43),c=t(40),p=t(39),h=t(33),f=t(46),l=t(42),d=t(44),v=t(120),y=t(13),b=Array.isArray,m=t(50),g=t(91),w=t(100),x=t(95),_=t(96),S=t(102),E=t(86),C=t(92),A=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,c=C(),h=t._path,l=s.cache,d=h.length?y(t,h).value:l,v=d[p]||l,b=l[f],m=[],g=[],w=[],x=h.length,S=-1,E=e.length;++S<E;){var A=e[S],N=h.slice(0);N.index=x,r(A.json,0,l,v,d,g,w,m,N,c,a,u,i,o)}var k=l[f],O=s.onChange;return _(O)&&b!==k&&O(),[g,w]}},{100:100,102:102,104:104,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,91:91,92:92,95:95,96:96}],78:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,l,d,y,b){for(var m={},g=n<e.length-1,x=e[n],_=w(x,m),S=h.index;;){p.depth=n;var E=i(o,s,u,_,t,g,!1,p,h,f,l,d,y,b);p[n]=_,p.index=n,h[h.index++]=_;var C=E[0],A=E[1];if(C&&(g?r(t,e,n+1,o,A,C,a,c,p,h,f,l,d,y,b):(v(d,C),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),_=w(x,m),m.done)break;h.index=S}}function o(t,e,n,r,o,s,p,l,d,b){var w=n.value;if(o.splice(0,o.length),o.push.apply(o,w),y(n))return o.index=w.length,g(n,p,l),[void 0,e];v(l,n);var x=n,_=e;if(n=n[c],null!=n)_=n[a]||e,o.index=w.length;else{var S=0,E=w.length-1;_=n=e;do{var C=w[S],A=E>S,N=i(e,_,n,C,t,A,!0,r,o,s,p,l,d,b);if(n=N[0],m(n))return o.index=S,N;_=N[1]}while(S++<E);if(o.index=S,x[c]!==n){var k=n[f]||0;n[f]=k+1,n[u+k]=x,x[c]=n,x[h]=k}}return[n,_]}function i(t,e,n,r,i,u,a,c,p,h,f,d,v,y){for(var b=n.$type;b===l;){var g=o(i,t,n,c,p,h,f,d,v,y);if(n=g[0],m(n))return g;e=g[1],b=n.$type}if(void 0!==b)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return n=_(e,n,r,i,u,a,c,p,h,f,d,v,y),[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(95),b=t(96),m=t(102),g=t(86),w=t(143).iterateKeySet,x=t(92),_=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,c=s.expired,h=x(),f=t._path,l=s.cache,v=f.length?d(t,f).value:l,y=v[a]||l,m=l[p],g=[],w=[],_=[],S=f.length,E=-1,C=e.length;++E<C;){var A=e[E],N=A.path,k=A.value,O=f.slice(0);O.index=S,r(k,N,0,l,y,v,w,_,g,O,h,c,u,i,o)}var P=l[p],j=s.onChange;return b(j)&&m!==P&&j(),[w,_]}},{102:102,104:104,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,92:92,95:95,96:96}],79:[function(t,e,n){var r=t(130),o=t(64),i=t(101);e.exports=function(t,e){for(var n=i(t)?t:r.pathValue(t,e),s=0,u=n.path,a=u.length;++s<a;)if("object"==typeof u[s])return new o(function(t){t.onError(new Error("Paths must be simple paths"))});var c=this;return new o(function(t){return c._set(n).subscribe(function(e){for(var n=e.json,r=-1,o=u.length;n&&++r<o;)n=n[u[r]];t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{101:101,130:130,64:64}],80:[function(t,e,n){var r=t(134),o=t(101),i=t(78);e.exports=function(t,e,n,s){var u=r.fromPath(t),a=e,c=n,p=s;if(o(u)?(p=c,c=a,a=u):a={path:u,value:a},o(a)===!1)throw new Error("Model#setValueSync must be called with an Array path.");return"function"!=typeof c&&(c=this._root._errorSelector),"function"!=typeof p&&(p=this._root._comparator),this._syncCheck("setValueSync")?(i(this,[a]),this._getValueSync(this,a.path).value):void 0}},{101:101,134:134,78:78}],81:[function(t,e,n){e.exports=function(t){if(!t)return t;for(var e=-1,n=t.length,r=[];++e<n;)r[e]=t[e];return r}},{}],82:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=-1,o=t.length,i=[];++r<o;)for(var s=e(t[r],r,t),u=-1,a=s.length;++u<a;)i[++n]=s[u];return i}},{}],83:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=t.length,o=new Array(r);++n<r;)o[n]=e(t[n],n,t);return o}},{}],84:[function(t,e,n){e.exports=function(t,e,n){var r=e||0,o=-1,i=t.length-r;0>i&&(i=0),n>0&&i>n&&(i=n);for(var s=new Array(i);++o<i;)s[o]=t[o+r];return s}},{}],85:[function(t,e,n){var r=t(40),o=t(91),i=Array.isArray,s=t(100);e.exports=function(t){var e=t;if(s(e)){e=i(t)?[]:{};var n=t;for(var u in n)u[0]!==r&&o(n,u)&&(e[u]=n[u])}return e}},{100:100,40:40,91:91}],86:[function(t,e,n){var r=t(51),o=t(35);e.exports=function(t,e,n){return t[o]||(t[o]=!0,e.push(t),r(n,t)),t}},{35:35,51:51}],87:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$expires||void 0}},{100:100}],88:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$size||0}},{100:100}],89:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$timestamp||void 0}},{100:100}],90:[function(t,e,n){var r=t(100);e.exports=function(t,e){var n=r(t)&&t.$type||void 0;return e&&n?"branch":n}},{100:100}],91:[function(t,e,n){var r=t(100),o=Object.prototype.hasOwnProperty;e.exports=function(t,e){return r(t)&&o.call(t,e)}},{100:100}],92:[function(t,e,n){var r=1;e.exports=function(){return r++}},{}],93:[function(t,e,n){var r=t(36),o=t(39),i=t(46);e.exports=function(t,e,n,s){return t[r]=n,t[o]=e,t[i]=s,e[n]=t,t}},{36:36,39:39,46:46}],94:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&e!==o&&e<r()}},{106:106,121:121,122:122}],95:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&(e===o||e<r())}},{106:106,121:121,122:122}],96:[function(t,e,n){var r="function";e.exports=function(t){return Boolean(t)&&typeof t===r}},{}],97:[function(t,e,n){var r=t(40);e.exports=function(t){return"$size"===t||t&&t.charAt(0)===r}},{40:40}],98:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&"json"in t}},{100:100}],99:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&r(t.paths)&&(o(t.jsonGraph)||o(t.jsong)||o(t.json)||o(t.values)||o(t.value))}},{100:100}],100:[function(t,e,n){var r="object";e.exports=function(t){return null!==t&&typeof t===r}},{}],101:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&(r(t.path)||"string"==typeof t.path)}},{100:100}],102:[function(t,e,n){var r="object";e.exports=function(t){return null==t||typeof t!==r}},{}],103:[function(t,e,n){var r=t(36),o=t(39),i=t(120),s=t(119),u=t(88),a=t(89),c=t(100),p=t(95),h=t(96),f=t(50),l=t(117),d=t(93),v=t(86),y=t(110),b=t(115),m=t(107);e.exports=function(t,e,n,g,w,x,_,S,E,C,A){var N,k,O,P,j,D,q;if(e===n){if(null===n)return e=l(n,void 0,n),t=b(t,-e.$size,E,_),e=d(e,t,g),f(E,e),e;if(void 0===n)return n;if(P=c(e),P&&(k=e.$type,null==k))return null==e[o]&&(e[r]=g,e[o]=t),e}else P=c(e),P&&(k=e.$type);if(k!==i){if(j=c(n),j&&(O=n.$type),P&&!k&&(null==n||j&&!O))return e}else{if(null==n)return p(e)?void v(e,S,E):e;if(j=c(n),j&&(O=n.$type,O===i))if(e===n){if(null!=e[o])return e}else if(D=e.$timestamp,q=n.$timestamp,!p(e)&&!p(n)&&D>q)return}if(k&&j&&!O)return d(y(e,n,t,g,E),t,g);if(O||!j){if(O===s&&h(A)&&(n=A(m(w,g),n)),O&&e===n)null==e[o]&&(e=l(e,k,e.value),t=b(t,-e.$size,E,_),e=d(e,t,g,_));else{var R=!0;!k&&P||(R=a(n)<a(e)==!1,(k||O)&&h(C)&&(R=!C(e,n,x.slice(0,x.index)))),R&&(n=l(n,O,O?n.value:n),N=u(e)-u(n),e=y(e,n,t,g,E),t=b(t,N,E,_),e=d(e,t,g,_))}p(e)?v(e,S,E):f(E,e)}else null==e&&(e=d(n,t,g));return e}},{100:100,107:107,110:110,115:115,117:117,119:119,120:120,36:36,39:39,50:50,86:86,88:88,89:89,93:93,95:95,96:96}],104:[function(t,e,n){var r=t(120),o=t(119),i=t(90),s=t(88),u=t(89),a=t(95),c=t(102),p=t(96),h=t(117),f=t(86),l=t(93),d=t(110),v=t(115),y=t(114),b=t(107);e.exports=function(t,e,n,m,g,w,x,_,S,E,C,A,N){var k=i(e,w);if(g||w)k&&a(e)&&(k="expired",f(e,E,C)),(k&&k!==r||c(e))&&(e=d(e,{},t,n,C),e=l(e,t,n,S),e=y(e,S));else{var O=m,P=i(O),j=u(O)<u(e)==!1;if((k||P)&&p(A)&&(j=!A(e,O,_.slice(0,_.index))),j){P===o&&p(N)&&(O=N(b(x,n),O)),O=h(O,P,P?O.value:O);var D=s(e)-s(O);e=d(e,O,t,n,C),t=v(t,D,C,S),e=l(e,t,n,S)}}return e}},{102:102,107:107,110:110,114:114,115:115,117:117,119:119,120:120,86:86,88:88,89:89,90:90,93:93,95:95,96:96}],105:[function(t,e,n){e.exports=function(){}},{}],106:[function(t,e,n){e.exports=Date.now},{}],107:[function(t,e,n){e.exports=function(t,e){var n=t.slice(0,t.depth);return n[n.length]=e,n}},{}],108:[function(t,e,n){var r=t(120),o=t(39),i=t(51),s=t(100),u=t(112),a=t(113);e.exports=function(t,e,n,c){if(s(t)){var p=t.$type;return Boolean(p)&&(p===r&&a(t),i(c,t)),u(t),e[n]=t[o]=void 0,!0}return!1}},{100:100,112:112,113:113,120:120,39:39,51:51}],109:[function(t,e,n){var r=t(91),o=t(40),i=t(108);e.exports=function s(t,e,n,u){if(i(t,e,n,u)){if(null==t.$type)for(var a in t)a[0]!==o&&"$"!==a[0]&&r(t,a)&&s(t[a],t,a,u);return!0}return!1}},{108:108,40:40,91:91}],110:[function(t,e,n){var r=t(100),o=t(111),i=t(109);e.exports=function(t,e,n,s,u){return t===e?t:(r(t)&&(o(t,e),i(t,n,s,u)),n[s]=e,e)}},{100:100,109:109,111:111}],111:[function(t,e,n){var r=t(43),o=t(33),i=t(44);e.exports=function(t,e){for(var n=t[i]||0,s=e[i]||0,u=-1;++u<n;){var a=t[r+u];void 0!==a&&(a[o]=e,e[r+(s+u)]=a,t[r+u]=void 0)}return e[i]=n+s,t[i]=void 0,e}},{33:33,43:43,44:44}],112:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){for(var e=-1,n=t[s]||0;++e<n;){var u=t[r+e];null!=u&&(u[o]=u[i]=t[r+e]=void 0)}return t[s]=void 0,t}},{33:33,42:42,43:43,44:44}],113:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){var e=t[o];if(e){for(var n=(t[i]||0)-1,u=(e[s]||0)-1;++n<=u;)e[r+n]=e[r+(n+1)];e[s]=u,t[i]=t[o]=e=void 0}return t}},{33:33,42:42,43:43,44:44}],114:[function(t,e,n){var r=t(43),o=t(39),i=t(46),s=t(44);e.exports=function(t,e){var n=[t],u=0;do{var a=n[u--];if(a&&a[i]!==e){a[i]=e,n[u++]=a[o];for(var c=-1,p=a[s]||0;++c<p;)n[u++]=a[r+c]}}while(u>-1);return t}},{39:39,43:43,44:44,46:46}],115:[function(t,e,n){var r=t(36),o=t(46),i=t(39),s=t(108),u=t(114);e.exports=function(t,e,n,a){var c=t;do{var p=c[i],h=c.$size=(c.$size||0)-e;0>=h&&null!=p?s(c,p,c[r],n):c[o]!==a&&u(c,a),c=p}while(c);return t}},{108:108,114:114,36:36,39:39,46:46}],116:[function(t,e,n){var r=Array.isArray,o=t(101),i=t(99),s=t(98),u=t(134);e.exports=function(t,e,n){for(var a=0,c=t.length;c>a;++a){var p=t[a],h=!1;if(r(p)&&e.path?h=!0:"string"==typeof p&&e.pathSyntax?h=!0:o(p)&&e.pathValue?(p.path=u.fromPath(p.path),h=!0):i(p)&&e.jsonGraph?h=!0:s(p)&&e.json?h=!0:"function"==typeof p&&a+1===c&&e.selector&&(h=!0),!h)return new Error("Unrecognized argument "+typeof p+" ["+String(p)+"] to Model#"+n)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(t,e,n){var r=t(130),o=r.atom,i=t(106),s=t(122),u=t(37),a=50,c=t(85),p=Array.isArray,h=t(88),f=t(87);e.exports=function(t,e,n){var r=0,l=t,d=e;if(d?(l=c(l),r=h(l),l.$type=d):(l=o(n),d=l.$type,l[u]=!0),null==n)r=a+1;else if(null==r||0>=r)switch(typeof n){case"object":r=p(n)?a+n.length:a+1;break;case"string":r=a+n.length;break;default:r=a+1}var v=f(l);return"number"==typeof v&&s>v&&(l.$expires=i()+-1*v),l.$size=r,l}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(t,e,n){e.exports="atom"},{}],119:[function(t,e,n){e.exports="error"},{}],120:[function(t,e,n){e.exports="ref"},{}],121:[function(t,e,n){e.exports=1},{}],122:[function(t,e,n){e.exports=0},{}],123:[function(t,e,n){"use strict";function r(){if(a.length)throw a.shift()}function o(t){var e;e=u.length?u.pop():new i,e.task=t,s(e)}function i(){this.task=null}var s=t(124),u=[],a=[],c=s.makeRequestCallFromTimer(r);e.exports=o,i.prototype.call=function(){try{this.task.call()}catch(t){o.onerror?o.onerror(t):(a.push(t),c())}finally{this.task=null,u[u.length]=this}}},{124:124}],124:[function(t,e,n){(function(t){"use strict";function n(t){u.length||(s(),a=!0),u[u.length]=t}function r(){for(;c<u.length;){var t=c;if(c+=1,u[t].call(),c>p){for(var e=0,n=u.length-c;n>e;e++)u[e]=u[e+c];u.length-=c,c=0}}u.length=0,c=0,a=!1}function o(t){var e=1,n=new h(t),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){e=-e,r.data=e}}function i(t){return function(){function e(){clearTimeout(n),clearInterval(r),t()}var n=setTimeout(e,0),r=setInterval(e,50)}}e.exports=n;var s,u=[],a=!1,c=0,p=1024,h=t.MutationObserver||t.WebKitMutationObserver;s="function"==typeof h?o(r):i(r),n.requestFlush=s,n.makeRequestCallFromTimer=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(t,e,n){"use strict";function r(t,e){var n;for(n in e)t[n]=e[n];return t}function o(t,e){if(this._jsongUrl=t,"number"==typeof e){var n={timeout:e};e=n}this._config=r({timeout:15e3,headers:{}},e||{})}var i=t(129),s=t(126);Array.isArray;o.prototype={constructor:o,buildQueryObject:s,get:function(t){var e="GET",n=this.buildQueryObject(this._jsongUrl,e,{paths:t,method:"get"}),o=r(n,this._config),s=this;return i(e,o,s)},set:function(t){var e="POST",n=this.buildQueryObject(this._jsongUrl,e,{jsonGraph:t,method:"set"}),o=r(n,this._config);o.headers["Content-Type"]="application/x-www-form-urlencoded";var s=this;return i(e,o,s)},call:function(t,e,n,o){e=e||[],n=n||[],o=o||[];var s="POST",u=[];u.push("method=call"),u.push("callPath="+encodeURIComponent(JSON.stringify(t))),u.push("arguments="+encodeURIComponent(JSON.stringify(e))),u.push("pathSuffixes="+encodeURIComponent(JSON.stringify(n))),u.push("paths="+encodeURIComponent(JSON.stringify(o)));var a=this.buildQueryObject(this._jsongUrl,s,u.join("&")),c=r(a,this._config);c.headers["Content-Type"]="application/x-www-form-urlencoded";var p=this;return i(s,c,p)}},o.XMLHttpSource=o,o["default"]=o,e.exports=o},{126:126,129:129}],126:[function(t,e,n){"use strict";e.exports=function(t,e,n){var r,o=[],i={url:t},s=-1!==t.indexOf("?"),u=s?"&":"?";return"string"==typeof n?o.push(n):(r=Object.keys(n),r.forEach(function(t){var e="object"==typeof n[t]?JSON.stringify(n[t]):n[t];o.push(t+"="+encodeURIComponent(e))})),"GET"===e?i.url+=u+o.join("&"):i.data=o.join("&"),i}},{}],127:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e=new t.XMLHttpRequest;if("withCredentials"in e)return e;if(t.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e,n,r;if(t.XMLHttpRequest)return new t.XMLHttpRequest;try{for(n=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],r=0;3>r;r++)try{if(e=n[r],new t.ActiveXObject(e))break}catch(o){}return new t.ActiveXObject(e)}catch(o){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(t,e,n){"use strict";function r(){}function o(t,e,n){return r.create(function(r){var o,i,h,f,l,d={method:t||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(l in e)p.call(e,l)&&(d[l]=e[l]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=n.onBeforeRequest&&n.onBeforeRequest(d);try{o=d.crossDomain?c():a()}catch(v){r.onError(v)}try{d.user?o.open(d.method,d.url,d.async,d.user,d.password):o.open(d.method,d.url,d.async),o.timeout=d.timeout,o.withCredentials=d.withCredentials!==!1,h=d.headers;for(f in h)p.call(h,f)&&o.setRequestHeader(f,h[f]);if(d.responseType)try{o.responseType=d.responseType}catch(y){if("json"!==d.responseType)throw y}o.onreadystatechange=function(t){4===o.readyState&&(i||(i=!0,s(r,o,t)))},o.ontimeout=function(t){i||(i=!0,u(r,o,"timeout error",t))},o.send(d.data)}catch(y){r.onError(y)}return function(){i||4===o.readyState||(i=!0,o.abort())}})}function i(t,e,n){n||(n=new Error(e)),t.onError(n)}function s(t,e,n){var r,o;if(e&&t){o=e.responseType,r="response"in e?e.response:e.responseText;var s=1223===e.status?204:e.status;if(s>=200&&399>=s){try{"json"!==o&&(r=JSON.parse(r||"")),"string"==typeof r&&(r=JSON.parse(r||""))}catch(n){i(t,"invalid json",n)}return t.onNext(r),void t.onCompleted()}return 401===s||403===s||407===s?i(t,r):410===s?i(t,r):408===s||504===s?i(t,r):i(t,r||"Response code "+s)}}function u(t,e,n,r){i(t,n||e.statusText||"request error",r)}var a=t(128),c=t(127),p=Object.prototype.hasOwnProperty,h=function(){};r.create=function(t){var e=new r;return e.subscribe=function(e,n,r){var o,i;return o="function"==typeof e?{onNext:e,onError:n||h,onCompleted:r||h}:e,i=t(o),"function"==typeof i?{dispose:i}:i},e},e.exports=o},{127:127,128:128}],130:[function(t,e,n){function r(t,e,n){var r=Object.create(null);if(null!=n){for(var o in n)r[o]=n[o];return r.$type=t,r.value=e,r}return{$type:t,value:e}}var o=t(134);e.exports={ref:function(t,e){return r("ref",o.fromPath(t),e)},atom:function(t,e){return r("atom",t,e)},undefined:function(){return r("atom")},error:function(t,e){return r("error",t,e)},pathValue:function(t,e){return{path:o.fromPath(t),value:e}},pathInvalidation:function(t){return{path:o.fromPath(t),invalidated:!0}}}},{134:134}],131:[function(t,e,n){e.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(t,e,n){var r={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"};e.exports=r},{}],133:[function(t,e,n){e.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token.  only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character.  Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(t,e,n){if(n)throw t+" -- "+e.parseString+" with next token: "+n;throw t+" -- "+e.parseString}}},{}],134:[function(t,e,n){var r=t(140),o=t(135),i=t(131),s=function(t,e){return o(new r(t,e))};e.exports=s,s.fromPathsOrPathValues=function(t,e){if(!t)return[];for(var n=[],r=0,o=t.length;o>r;r++)"string"==typeof t[r]?n[r]=s(t[r],e):"string"==typeof t[r].path?n[r]={path:s(t[r].path,e),value:t[r].value}:n[r]=t[r];return n},s.fromPath=function(t,e){return t?"string"==typeof t?s(t,e):t:[]},s.RoutedTokens=i},{131:131,135:135,140:140}],135:[function(t,e,n){var r=t(132),o=t(133),i=t(136);e.exports=function(t){for(var e=t.next(),n={},s=[];!e.done;){switch(e.type){case r.token:var u=+e.token[0];isNaN(u)||o.throwError(o.invalidIdentifier,t),s[s.length]=e.token;break;case r.dotSeparator:0===s.length&&o.throwError(o.unexpectedToken,t);break;case r.space:break;case r.openingBracket:i(t,e,n,s);break;default:o.throwError(o.unexpectedToken,t)}e=t.next()}return 0===s.length&&o.throwError(o.invalidPath,t),s}},{132:132,133:133,136:136}],136:[function(t,e,n){var r=t(132),o=t(133),i=o.indexer,s=t(138),u=t(137),a=t(139);e.exports=function(t,e,n,c){var p=t.next(),h=!1,f=1,l=!1;for(n.indexer=[];!p.done;){switch(p.type){case r.token:case r.quote:n.indexer.length===f&&o.throwError(i.requiresComma,t)}switch(p.type){case r.openingBrace:l=!0,a(t,p,n,c);break;case r.token:var d=+p.token;isNaN(d)&&o.throwError(i.needQuotes,t),n.indexer[n.indexer.length]=d;break;case r.dotSeparator:n.indexer.length||o.throwError(i.leadingDot,t),s(t,p,n,c);
-break;case r.space:break;case r.closingBracket:h=!0;break;case r.quote:u(t,p,n,c);break;case r.openingBracket:o.throwError(i.nested,t);break;case r.commaSeparator:++f;break;default:o.throwError(o.unexpectedToken,t)}if(h)break;p=t.next()}0===n.indexer.length&&o.throwError(i.empty,t),n.indexer.length>1&&l&&o.throwError(i.routedTokens,t),1===n.indexer.length&&(n.indexer=n.indexer[0]),c[c.length]=n.indexer,n.indexer=void 0}},{132:132,133:133,137:137,138:138,139:139}],137:[function(t,e,n){var r=t(132),o=t(133),i=o.quote;e.exports=function(t,e,n,s){for(var u=t.next(),a="",c=e.token,p=!1,h=!1;!u.done;){switch(u.type){case r.token:case r.space:case r.dotSeparator:case r.commaSeparator:case r.openingBracket:case r.closingBracket:case r.openingBrace:case r.closingBrace:p&&o.throwError(i.illegalEscape,t),a+=u.token;break;case r.quote:p?(a+=u.token,p=!1):u.token!==c?a+=u.token:h=!0;break;case r.escape:p=!0;break;default:o.throwError(o.unexpectedToken,t)}if(h)break;u=t.next()}0===a.length&&o.throwError(i.empty,t),n.indexer[n.indexer.length]=a}},{132:132,133:133}],138:[function(t,e,n){var r=t(140),o=t(132),i=t(133);e.exports=function(t,e,n,s){var u,a=t.peek(),c=1,p=!1,h=!0,f=n.indexer.length-1,l=r.toNumber(n.indexer[f]);for(isNaN(l)&&i.throwError(i.range.precedingNaN,t);!p&&!a.done;){switch(a.type){case o.dotSeparator:3===c&&i.throwError(i.unexpectedToken,t),++c,3===c&&(h=!1);break;case o.token:u=r.toNumber(t.next().token),isNaN(u)&&i.throwError(i.range.suceedingNaN,t),p=!0;break;default:p=!0}if(p)break;t.next(),a=t.peek()}n.indexer[f]={from:l,to:h?u:u-1}}},{132:132,133:133,140:140}],139:[function(t,e,n){var r=t(132),o=t(131),i=t(133),s=i.routed;e.exports=function(t,e,n,u){var a=t.next(),c=!1,p="";switch(a.token){case o.integers:case o.ranges:case o.keys:break;default:i.throwError(s.invalid,t)}var h=t.next();if(h.type===r.colon&&(c=!0,h=t.next(),h.type!==r.token&&i.throwError(s.invalid,t),p=h.token,h=t.next()),h.type===r.closingBrace){var f={type:a.token,named:c,name:p};n.indexer[n.indexer.length]=f}else i.throwError(s.invalid,t)}},{131:131,132:132,133:133}],140:[function(t,e,n){function r(t,e,n){return{token:t,done:n,type:e}}function o(t,e,n){var o,g=!1,w="",x=n?m:b;do{if(o=e+1>=t.length)break;var _=t[e+1];if(void 0===_||-1!==x.indexOf(_)){if(w.length)break;++e;var S;switch(_){case s:S=i.dotSeparator;break;case u:S=i.commaSeparator;break;case a:S=i.openingBracket;break;case c:S=i.closingBracket;break;case p:S=i.openingBrace;break;case h:S=i.closingBrace;break;case y:S=i.space;break;case d:case v:S=i.quote;break;case l:S=i.escape;break;case f:S=i.colon;break;default:S=i.unknown}g=r(_,S,!1);break}w+=_,++e}while(!o);return!g&&w.length&&(g=r(w,i.token,!1)),g||(g={done:!0}),{token:g,idx:e}}var i=t(132),s=".",u=",",a="[",c="]",p="{",h="}",f=":",l="\\",d='"',v="'",y=" ",b="\\'\"[]., ",m="\\{}'\"[]., :",g=e.exports=function(t,e){this._string=t,this._idx=-1,this._extended=e,this.parseString=""};g.prototype={next:function(){var t=this._nextToken?this._nextToken:o(this._string,this._idx,this._extended);return this._idx=t.idx,this._nextToken=!1,this.parseString+=t.token.token,t.token},peek:function(){var t=this._nextToken?this._nextToken:o(this._string,this._idx,this._extended);return this._nextToken=t,t.token}},g.toNumber=function(t){return isNaN(+t)?NaN:+t}},{132:132}],141:[function(t,e,n){var r=t(147),o=t(148);e.exports=function(t){var e=t.reduce(function(t,e){var n=e.length;return t[n]||(t[n]=[]),t[n].push(e),t},{});return Object.keys(e).forEach(function(t){e[t]=o(e[t])}),r(e)}},{147:147,148:148}],142:[function(t,e,n){var r=t(144);e.exports=function o(t,e,n){for(var i=t,s=!0;s&&n<e.length;++n){var u=e[n],a=typeof u;if(u&&"object"===a){var c={},p=r(u,c),h=n+1;do{var f=i[p];s=void 0!==f,s&&(s=o(f,e,h)),p=r(u,c)}while(s&&!c.done);break}i=i[u],s=void 0!==i}return s}},{144:144}],143:[function(t,e,n){e.exports={iterateKeySet:t(144),toTree:t(148),toTreeWithUnion:t(149),pathsComplementFromTree:t(146),pathsComplementFromLengthTree:t(145),hasIntersection:t(142),toPaths:t(147),collapse:t(141)}},{141:141,142:142,144:144,145:145,146:146,147:147,148:148,149:149}],144:[function(t,e,n){function r(t,e){var n=e.from=t.from||0,r=e.to=t.to||"number"==typeof t.length&&e.from+t.length-1||0;e.rangeOffset=e.from,e.loaded=!0,n>r&&(e.empty=!0)}function o(t,e){e.done=!1;var n=e.isObject=!(!t||"object"!=typeof t);e.isArray=n&&i(t),e.arrayOffset=0}var i=Array.isArray;e.exports=function(t,e){if(void 0===e.isArray&&o(t,e),e.isArray){var n;do{e.loaded&&e.rangeOffset>e.to&&(++e.arrayOffset,e.loaded=!1);var i=e.arrayOffset,s=t.length;if(i>=s){e.done=!0;break}var u=t[e.arrayOffset],a=typeof u;if("object"===a){if(e.loaded||r(u,e),e.empty)continue;n=e.rangeOffset++}else++e.arrayOffset,n=u}while(void 0===n);return n}return e.isObject?(e.loaded||r(t,e),e.rangeOffset>e.to?void(e.done=!0):e.rangeOffset++):(e.done=!0,t)}},{}],145:[function(t,e,n){var r=t(142);e.exports=function(t,e){for(var n=[],o=-1,i=0,s=t.length;s>i;++i){var u=t[i];r(e[u.length],u,0)||(n[++o]=u)}return n}},{142:142}],146:[function(t,e,n){var r=t(142);e.exports=function(t,e){for(var n=[],o=-1,i=0,s=t.length;s>i;++i)r(e,t[i],0)||(n[++o]=t[i]);return n}},{142:142}],147:[function(t,e,n){function r(t){return null!==t&&typeof t===f}function o(t,e,n){var r,i,s,u,h,f,l,d,v,y,b,m,g,w,x=c(String(e)),_=Object.create(null),S=[],E=-1,C=0,A=[],N=0;if(u=[],h=-1,n-1>e){for(f=a(t,u);++h<f;)r=u[h],i=o(t[r],e+1,n),s=i.code,_[s]?i=_[s]:(S[C++]=s,i=_[s]={keys:[],sets:i.sets}),x=c(x+r+s),p(r)&&i.keys.push(parseInt(r,10))||i.keys.push(r);for(;++E<C;)if(r=S[E],i=_[r],u=i.keys,f=u.length,f>0)for(l=i.sets,d=-1,v=l.length,g=u[0];++d<v;){for(y=l[d],b=-1,m=y.length,w=new Array(m+1),w[0]=f>1&&u||g;++b<m;)w[b+1]=y[b];A[N++]=w}}else for(f=a(t,u),f>1?A[N++]=[u]:A[N++]=u;++h<f;)x=c(x+u[h]);return{code:x,sets:A}}function i(t){for(var e=-1,n=t.length;++e<n;){var r=t[e];h(r)&&(t[e]=s(r))}return t}function s(t){for(var e=-1,n=t.length-1,r=n>0;++e<=n;){var o=t[e];if(!p(o)){r=!1;break}t[e]=parseInt(o,10)}if(r===!0){t.sort(u);var i=t[0],s=t[n];if(n>=s-i)return{from:i,to:s}}return t}function u(t,e){return t-e}function a(t,e,n){var r=0;for(var o in t)e[r++]=o;return r>1&&e.sort(n),r}function c(t){for(var e=5381,n=-1,r=t.length;++n<r;)e=(e<<5)+e+t.charCodeAt(n);return String(e)}function p(t){return!h(t)&&t-parseFloat(t)+1>=0}var h=Array.isArray,f="object";e.exports=function(t){var e,n=[],s=0;for(var u in t)if(p(u)&&r(e=t[u]))for(var a=o(e,0,parseInt(u,10)).sets,c=-1,h=a.length;++c<h;)n[s++]=i(a[c]);return n}},{}],148:[function(t,e,n){function r(t,e,n){var i,s=e[n],u={},a=n+1;i=o(s,u);do{var c=t[i];c||(a===e.length?t[i]=null:c=t[i]={}),a<e.length&&r(c,e,a),u.done||(i=o(s,u))}while(!u.done)}var o=t(144);Array.isArray;e.exports=function(t){return t.reduce(function(t,e){return r(t,e,0),t},{})}},{144:144}],149:[function(t,e,n){},{}],150:[function(t,e,n){function r(){p=!1,u.length?c=u.concat(c):h=-1,c.length&&o()}function o(){if(!p){var t=setTimeout(r);p=!0;for(var e=c.length;e;){for(u=c,c=[];++h<e;)u&&u[h].run();h=-1,e=c.length}u=null,p=!1,clearTimeout(t)}}function i(t,e){this.fun=t,this.array=e}function s(){}var u,a=e.exports={},c=[],p=!1,h=-1;a.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];c.push(new i(t,e)),1!==c.length||p||setTimeout(o,0)},i.prototype.run=function(){this.fun.apply(null,this.array)},a.title="browser",a.browser=!0,a.env={},a.argv=[],a.version="",a.versions={},a.on=s,a.addListener=s,a.once=s,a.off=s,a.removeListener=s,a.removeAllListeners=s,a.emit=s,a.binding=function(t){throw new Error("process.binding is not supported")},a.cwd=function(){return"/"},a.chdir=function(t){throw new Error("process.chdir is not supported")},a.umask=function(){return 0}},{}],151:[function(t,e,n){"use strict";e.exports=t(156)},{156:156}],152:[function(t,e,n){"use strict";function r(){}function o(t){try{return t.then}catch(e){return y=e,b}}function i(t,e){try{return t(e)}catch(n){return y=n,b}}function s(t,e,n){try{t(e,n)}catch(r){return y=r,b}}function u(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._37=0,this._12=null,this._59=[],t!==r&&d(t,this)}function a(t,e,n){return new t.constructor(function(o,i){var s=new u(r);s.then(o,i),c(t,new l(e,n,s))})}function c(t,e){for(;3===t._37;)t=t._12;return 0===t._37?void t._59.push(e):void v(function(){var n=1===t._37?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._37?p(e.promise,t._12):h(e.promise,t._12));var r=i(n,t._12);r===b?h(e.promise,y):p(e.promise,r)})}function p(t,e){if(e===t)return h(t,new TypeError("A promise cannot be resolved with itself."));if(e&&("object"==typeof e||"function"==typeof e)){var n=o(e);if(n===b)return h(t,y);if(n===t.then&&e instanceof u)return t._37=3,t._12=e,void f(t);if("function"==typeof n)return void d(n.bind(e),t)}t._37=1,t._12=e,f(t)}function h(t,e){t._37=2,t._12=e,f(t)}function f(t){for(var e=0;e<t._59.length;e++)c(t,t._59[e]);t._59=null}function l(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=n}function d(t,e){var n=!1,r=s(t,function(t){n||(n=!0,p(e,t))},function(t){n||(n=!0,h(e,t))});n||r!==b||(n=!0,h(e,y))}var v=t(124),y=null,b={};e.exports=u,u._99=r,u.prototype.then=function(t,e){if(this.constructor!==u)return a(this,t,e);var n=new u(r);return c(this,new l(t,e,n)),n}},{124:124}],153:[function(t,e,n){"use strict";var r=t(152);e.exports=r,r.prototype.done=function(t,e){var n=arguments.length?this.then.apply(this,arguments):this;n.then(null,function(t){setTimeout(function(){throw t},0)})}},{152:152}],154:[function(t,e,n){"use strict";function r(t){var e=new o(o._99);return e._37=1,e._12=t,e}var o=t(152);e.exports=o;var i=r(!0),s=r(!1),u=r(null),a=r(void 0),c=r(0),p=r("");o.resolve=function(t){if(t instanceof o)return t;if(null===t)return u;if(void 0===t)return a;if(t===!0)return i;if(t===!1)return s;if(0===t)return c;if(""===t)return p;if("object"==typeof t||"function"==typeof t)try{var e=t.then;if("function"==typeof e)return new o(e.bind(t))}catch(n){return new o(function(t,e){e(n)})}return r(t)},o.all=function(t){var e=Array.prototype.slice.call(t);return new o(function(t,n){function r(s,u){if(u&&("object"==typeof u||"function"==typeof u)){if(u instanceof o&&u.then===o.prototype.then){for(;3===u._37;)u=u._12;return 1===u._37?r(s,u._12):(2===u._37&&n(u._12),void u.then(function(t){r(s,t)},n))}var a=u.then;if("function"==typeof a){var c=new o(a.bind(u));return void c.then(function(t){r(s,t)},n)}}e[s]=u,0===--i&&t(e)}if(0===e.length)return t([]);for(var i=e.length,s=0;s<e.length;s++)r(s,e[s])})},o.reject=function(t){return new o(function(e,n){n(t)})},o.race=function(t){return new o(function(e,n){t.forEach(function(t){o.resolve(t).then(e,n)})})},o.prototype["catch"]=function(t){return this.then(null,t)}},{152:152}],155:[function(t,e,n){"use strict";var r=t(152);e.exports=r,r.prototype["finally"]=function(t){return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})}},{152:152}],156:[function(t,e,n){"use strict";e.exports=t(152),t(153),t(155),t(154),t(157)},{152:152,153:153,154:154,155:155,157:157}],157:[function(t,e,n){"use strict";var r=t(152),o=t(123);e.exports=r,r.denodeify=function(t,e){return e=e||1/0,function(){var n=this,o=Array.prototype.slice.call(arguments,0,e>0?e:0);return new r(function(e,r){o.push(function(t,n){t?r(t):e(n)});var i=t.apply(n,o);!i||"object"!=typeof i&&"function"!=typeof i||"function"!=typeof i.then||e(i)})}},r.nodeify=function(t){return function(){var e=Array.prototype.slice.call(arguments),n="function"==typeof e[e.length-1]?e.pop():null,i=this;try{return t.apply(this,arguments).nodeify(n,i)}catch(s){if(null===n||"undefined"==typeof n)return new r(function(t,e){e(s)});o(function(){n.call(i,s)})}}},r.prototype.nodeify=function(t,e){return"function"!=typeof t?this:void this.then(function(n){o(function(){t.call(e,null,n)})},function(n){o(function(){t.call(e,n)})})}},{123:123,152:152}],158:[function(e,n,r){(function(o){(function(i){var s={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},u=s[typeof window]&&window||this,a=s[typeof r]&&r&&!r.nodeType&&r,c=s[typeof n]&&n&&!n.nodeType&&n,p=(c&&c.exports===a&&a,s[typeof o]&&o);!p||p.global!==p&&p.window!==p||(u=p),"function"==typeof t&&t.amd?t(["rx"],function(t,e){return i(u,e,t)}):"object"==typeof n&&n&&n.exports===a?n.exports=i(u,n.exports,e(159)):u.Rx=i(u,{},u.Rx)}).call(this,function(t,e,n,r){function o(){try{return l.apply(this,arguments)}catch(t){return M.e=t,M}}function i(t){if(!E(t))throw new TypeError("fn must be a function");return l=t,o}function s(t,e,n){return new b(function(r){var o=!1,i=null,s=[];return t.subscribe(function(t){var u,a;try{a=e(t)}catch(c){return void r.onError(c)}if(u=0,o)try{u=n(a,i)}catch(p){return void r.onError(p)}else o=!0,i=a;u>0&&(i=a,s=[]),u>=0&&s.push(t)},function(t){r.onError(t)},function(){r.onNext(s),r.onCompleted()})},t)}function u(t){if(0===t.length)throw new D;return t[0]}function a(t,e,n,r){if(0>e)throw new R;return new b(function(o){var i=e;return t.subscribe(function(t){0===i--&&(o.onNext(t),o.onCompleted())},function(t){o.onError(t)},function(){n?(o.onNext(r),o.onCompleted()):o.onError(new R)})},t)}function c(t,e,n){return new b(function(r){var o=n,i=!1;return t.subscribe(function(t){i?r.onError(new Error("Sequence contains more than one element")):(o=t,i=!0)},function(t){r.onError(t)},function(){i||e?(r.onNext(o),r.onCompleted()):r.onError(new D)})},t)}function p(t,e,n){return new b(function(r){return t.subscribe(function(t){r.onNext(t),r.onCompleted()},function(t){r.onError(t)},function(){e?(r.onNext(n),r.onCompleted()):r.onError(new D)})},t)}function h(t,e,n){return new b(function(r){var o=n,i=!1;return t.subscribe(function(t){o=t,i=!0},function(t){r.onError(t)},function(){i||e?(r.onNext(o),r.onCompleted()):r.onError(new D)})},t)}function f(t,e,n,o){var i=j(e,n,3);return new b(function(e){var n=0;return t.subscribe(function(r){var s;try{s=i(r,n,t)}catch(u){return void e.onError(u)}s?(e.onNext(o?n:r),e.onCompleted()):n++},function(t){e.onError(t)},function(){e.onNext(o?-1:r),e.onCompleted()})},t)}var l,d=n.Observable,v=d.prototype,y=n.CompositeDisposable,b=n.AnonymousObservable,m=n.Disposable.empty,g=(n.internals.isEqual,n.helpers),w=g.not,x=g.defaultComparer,_=g.identity,S=g.defaultSubComparer,E=g.isFunction,C=g.isPromise,A=g.isArrayLike,N=g.isIterable,k=n.internals.inherits,O=d.fromPromise,P=d.from,j=n.internals.bindCallback,D=n.EmptyError,q=n.ObservableBase,R=n.ArgumentOutOfRangeError,M={e:{}};v.aggregate=function(){var t,e,n=!1,r=this;return 2===arguments.length?(n=!0,e=arguments[0],t=arguments[1]):t=arguments[0],new b(function(o){var i,s,u;return r.subscribe(function(r){!u&&(u=!0);try{i?s=t(s,r):(s=n?t(e,r):r,i=!0)}catch(a){return o.onError(a)}},function(t){o.onError(t)},function(){u&&o.onNext(s),!u&&n&&o.onNext(e),!u&&!n&&o.onError(new D),o.onCompleted()})},r)};var T=function(t){function e(e,n,r,o){this.source=e,this.acc=n,this.hasSeed=r,this.seed=o,t.call(this)}function n(t,e){this.o=t,this.acc=e.acc,this.hasSeed=e.hasSeed,this.seed=e.seed,this.hasAccumulation=!1,this.result=null,this.hasValue=!1,this.isStopped=!1}return k(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this))},n.prototype.onNext=function(t){this.isStopped||(!this.hasValue&&(this.hasValue=!0),this.hasAccumulation?this.result=i(this.acc)(this.result,t):(this.result=this.hasSeed?i(this.acc)(this.seed,t):t,this.hasAccumulation=!0),this.result===M&&this.o.onError(this.result.e))},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.hasValue&&this.o.onNext(this.result),!this.hasValue&&this.hasSeed&&this.o.onNext(this.seed),!this.hasValue&&!this.hasSeed&&this.o.onError(new D),this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(q);return v.reduce=function(t){var e=!1;if(2===arguments.length){e=!0;var n=arguments[1]}return new T(this,t,e,n)},v.some=function(t,e){var n=this;return t?n.filter(t,e).some():new b(function(t){return n.subscribe(function(){t.onNext(!0),t.onCompleted()},function(e){t.onError(e)},function(){t.onNext(!1),t.onCompleted()})},n)},v.any=function(){return this.some.apply(this,arguments)},v.isEmpty=function(){return this.any().map(w)},v.every=function(t,e){return this.filter(function(e){return!t(e)},e).some().map(w)},v.all=function(){return this.every.apply(this,arguments)},v.includes=function(t,e){function n(t,e){return 0===t&&0===e||t===e||isNaN(t)&&isNaN(e)}var r=this;return new b(function(o){var i=0,s=+e||0;return Math.abs(s)===1/0&&(s=0),0>s?(o.onNext(!1),o.onCompleted(),m):r.subscribe(function(e){i++>=s&&n(e,t)&&(o.onNext(!0),o.onCompleted())},function(t){o.onError(t)},function(){o.onNext(!1),o.onCompleted()})},this)},v.contains=function(t,e){v.includes(t,e)},v.count=function(t,e){return t?this.filter(t,e).count():this.reduce(function(t){return t+1},0)},v.indexOf=function(t,e){var n=this;return new b(function(r){var o=0,i=+e||0;return Math.abs(i)===1/0&&(i=0),0>i?(r.onNext(-1),r.onCompleted(),m):n.subscribe(function(e){o>=i&&e===t&&(r.onNext(o),r.onCompleted()),o++},function(t){r.onError(t)},function(){r.onNext(-1),r.onCompleted()})},n)},v.sum=function(t,e){return t&&E(t)?this.map(t,e).sum():this.reduce(function(t,e){return t+e},0)},v.minBy=function(t,e){return e||(e=S),s(this,t,function(t,n){return-1*e(t,n)})},v.min=function(t){return this.minBy(_,t).map(function(t){return u(t)})},v.maxBy=function(t,e){return e||(e=S),s(this,t,e)},v.max=function(t){return this.maxBy(_,t).map(function(t){return u(t)})},v.average=function(t,e){return t&&E(t)?this.map(t,e).average():this.reduce(function(t,e){return{sum:t.sum+e,count:t.count+1}},{sum:0,count:0}).map(function(t){if(0===t.count)throw new D;return t.sum/t.count})},v.sequenceEqual=function(t,e){var n=this;return e||(e=x),new b(function(r){var o=!1,i=!1,s=[],u=[],a=n.subscribe(function(t){var n,o;if(u.length>0){o=u.shift();try{n=e(o,t)}catch(a){return void r.onError(a)}n||(r.onNext(!1),r.onCompleted())}else i?(r.onNext(!1),r.onCompleted()):s.push(t)},function(t){r.onError(t)},function(){o=!0,0===s.length&&(u.length>0?(r.onNext(!1),r.onCompleted()):i&&(r.onNext(!0),r.onCompleted()))});(A(t)||N(t))&&(t=P(t)),C(t)&&(t=O(t));var c=t.subscribe(function(t){var n;if(s.length>0){var i=s.shift();try{n=e(i,t)}catch(a){return void r.onError(a)}n||(r.onNext(!1),r.onCompleted())}else o?(r.onNext(!1),r.onCompleted()):u.push(t)},function(t){r.onError(t)},function(){i=!0,0===u.length&&(s.length>0?(r.onNext(!1),r.onCompleted()):o&&(r.onNext(!0),r.onCompleted()))});return new y(a,c)},n)},v.elementAt=function(t){return a(this,t,!1)},v.elementAtOrDefault=function(t,e){return a(this,t,!0,e)},v.single=function(t,e){return t&&E(t)?this.where(t,e).single():c(this,!1)},v.singleOrDefault=function(t,e,n){return t&&E(t)?this.filter(t,n).singleOrDefault(null,e):c(this,!0,e)},v.first=function(t,e){return t?this.where(t,e).first():p(this,!1)},v.firstOrDefault=function(t,e,n){return t?this.where(t).firstOrDefault(null,e):p(this,!0,e)},v.last=function(t,e){return t?this.where(t,e).last():h(this,!1)},v.lastOrDefault=function(t,e,n){return t?this.where(t,n).lastOrDefault(null,e):h(this,!0,e)},v.find=function(t,e){return f(this,t,e,!1)},v.findIndex=function(t,e){return f(this,t,e,!0)},v.toSet=function(){if("undefined"==typeof t.Set)throw new TypeError;var e=this;return new b(function(n){var r=new t.Set;return e.subscribe(function(t){r.add(t)},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},v.toMap=function(e,n){if("undefined"==typeof t.Map)throw new TypeError;var r=this;return new b(function(o){var i=new t.Map;return r.subscribe(function(t){var r;try{r=e(t)}catch(s){return void o.onError(s)}var u=t;if(n)try{u=n(t)}catch(s){return void o.onError(s)}i.set(r,u)},function(t){o.onError(t)},function(){o.onNext(i),o.onCompleted()})},r)},n})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{159:159}],159:[function(e,n,r){(function(e,o){(function(i){function u(t){for(var e=[],n=0,r=t.length;r>n;n++)e.push(t[n]);return e}function a(t,e){if(ct&&e.stack&&"object"==typeof t&&null!==t&&t.stack&&-1===t.stack.indexOf(lt)){for(var n=[],r=e;r;r=r.source)r.stack&&n.unshift(r.stack);n.unshift(t.stack);var o=n.join("\n"+lt+"\n");t.stack=c(o)}}function c(t){for(var e=t.split("\n"),n=[],r=0,o=e.length;o>r;r++){var i=e[r];p(i)||h(i)||!i||n.push(i)}return n.join("\n")}function p(t){var e=l(t);if(!e)return!1;var n=e[0],r=e[1];return n===ht&&r>=ft&&$n>=r}function h(t){return-1!==t.indexOf("(module.js:")||-1!==t.indexOf("(node.js:")}function f(){if(ct)try{throw new Error}catch(t){var e=t.stack.split("\n"),n=e[0].indexOf("@")>0?e[1]:e[2],r=l(n);if(!r)return;return ht=r[0],r[1]}}function l(t){var e=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(t);if(e)return[e[1],Number(e[2])];var n=/at ([^ ]+):(\d+):(?:\d+)$/.exec(t);if(n)return[n[1],Number(n[2])];var r=/.*@(.+):(\d+)$/.exec(t);return r?[r[1],Number(r[2])]:void 0}function d(t){var e=[];if(!Ht(t))return e;Ut.nonEnumArgs&&t.length&&Xt(t)&&(t=Yt.call(t));var n=Ut.enumPrototypes&&"function"==typeof t,r=Ut.enumErrorProps&&(t===Jt||t instanceof Error);for(var o in t)n&&"prototype"==o||r&&("message"==o||"name"==o)||e.push(o);if(Ut.nonEnumShadows&&t!==It){var i=t.constructor,s=-1,u=kt;if(t===(i&&i.prototype))var a=t===Lt?$t:t===Jt?qt:Wt.call(t),c=Ft[a];for(;++s<u;)o=Nt[s],c&&c[o]||!zt.call(t,o)||e.push(o)}return e}function v(t,e,n){for(var r=-1,o=n(t),i=o.length;++r<i;){var s=o[r];if(e(t[s],s,t)===!1)break}return t}function y(t,e){return v(t,e,d)}function b(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function m(t,e,n,r){if(t===e)return 0!==t||1/t==1/e;var o=typeof t,i=typeof e;if(t===t&&(null==t||null==e||"function"!=o&&"object"!=o&&"function"!=i&&"object"!=i))return!1;var s=Wt.call(t),u=Wt.call(e);if(s==Ot&&(s=Tt),u==Ot&&(u=Tt),s!=u)return!1;switch(s){case jt:case Dt:return+t==+e;case Mt:return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case Vt:case $t:return t==String(e)}var a=s==Pt;if(!a){if(s!=Tt||!Ut.nodeClass&&(b(t)||b(e)))return!1;var c=!Ut.argsObject&&Xt(t)?Object:t.constructor,p=!Ut.argsObject&&Xt(e)?Object:e.constructor;if(!(c==p||zt.call(t,"constructor")&&zt.call(e,"constructor")||at(c)&&c instanceof c&&at(p)&&p instanceof p||!("constructor"in t&&"constructor"in e)))return!1}n||(n=[]),r||(r=[]);for(var h=n.length;h--;)if(n[h]==t)return r[h]==e;var f=0,l=!0;if(n.push(t),r.push(e),a){if(h=t.length,f=e.length,l=f==h)for(;f--;){var d=e[f];if(!(l=m(t[f],d,n,r)))break}}else y(e,function(e,o,i){return zt.call(i,o)?(f++,l=zt.call(t,o)&&m(t[o],e,n,r)):void 0}),l&&y(t,function(t,e,n){return zt.call(n,e)?l=--f>-1:void 0});return n.pop(),r.pop(),l}function g(t,e){for(var n=new Array(t),r=0;t>r;r++)n[r]=e();return n}function w(){try{return Qt.apply(this,arguments)}catch(t){return ne.e=t,ne}}function x(t){if(!at(t))throw new TypeError("fn must be a function");return Qt=t,w}function _(t){throw t}function S(t,e){this.id=t,this.value=e}function E(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function C(t,e){e.isDisposed||(e.isDisposed=!0,e.disposable.dispose())}function A(t){this._s=s}function N(t){this._s=s,this._l=s.length,this._i=0}function k(t){this._a=t}function O(t){this._a=t,this._l=q(t),this._i=0}function P(t){return"number"==typeof t&&X.isFinite(t)}function j(t){var e,n=t[xt];if(!n&&"string"==typeof t)return e=new A(t),e[xt]();if(!n&&t.length!==i)return e=new k(t),e[xt]();if(!n)throw new TypeError("Object is not iterable");return t[xt]()}function D(t){var e=+t;return 0===e?e:isNaN(e)?e:0>e?-1:1}function q(t){var e=+t.length;return isNaN(e)?0:0!==e&&P(e)?(e=D(e)*Math.floor(Math.abs(e)),0>=e?0:e>en?en:e):e}function R(t,e){this.observer=t,this.parent=e}function M(t,e){return me(t)||(t=_e),new rn(e,t)}function T(t,e){this.observer=t,this.parent=e}function V(t,e){this.observer=t,this.parent=e}function $(t,e){return new qn(function(n){var r=new fe,o=new le;return o.setDisposable(r),r.setDisposable(t.subscribe(function(t){n.onNext(t)},function(t){try{var r=e(t)}catch(i){return n.onError(i)}ut(r)&&(r=Xe(r));var s=new fe;o.setDisposable(s),s.setDisposable(r.subscribe(n))},function(t){n.onCompleted(t)})),o},t)}function W(){return!1}function z(t,e){var n=this;return new qn(function(r){var o=0,i=t.length;return n.subscribe(function(n){if(i>o){var s=t[o++],u=x(e)(n,s);if(u===ne)return r.onError(u.e);r.onNext(u)}else r.onCompleted()},function(t){r.onError(t)},function(){r.onCompleted()})},n)}function W(){return!1}function G(){return[]}function W(){return!1}function J(){return[]}function I(t,e){this.observer=t,this.accumulator=e.accumulator,this.hasSeed=e.hasSeed,this.seed=e.seed,this.hasAccumulation=!1,this.accumulation=null,this.hasValue=!1,this.isStopped=!1}function L(t,e,n){var r=At(e,n,3);return t.map(function(e,n){var o=r(e,n,t);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o}).concatAll()}function B(t,e,n){for(var r=0,o=t.length;o>r;r++)if(n(t[r],e))return r;return-1}function F(t){this.comparer=t,this.set=[]}function U(t,e,n){var r=At(e,n,3);return t.map(function(e,n){var o=r(e,n,t);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o}).mergeAll()}var H={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},X=H[typeof window]&&window||this,Q=H[typeof r]&&r&&!r.nodeType&&r,K=H[typeof n]&&n&&!n.nodeType&&n,Y=K&&K.exports===Q&&Q,Z=H[typeof o]&&o;!Z||Z.global!==Z&&Z.window!==Z||(X=Z);var tt={internals:{},config:{Promise:X.Promise},helpers:{}},et=tt.helpers.noop=function(){},nt=(tt.helpers.notDefined=function(t){return"undefined"==typeof t},tt.helpers.identity=function(t){return t}),rt=(tt.helpers.pluck=function(t){return function(e){return e[t]}},tt.helpers.just=function(t){return function(){return t}},tt.helpers.defaultNow=Date.now),ot=tt.helpers.defaultComparer=function(t,e){return Kt(t,e)},it=tt.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},st=(tt.helpers.defaultKeySerializer=function(t){return t.toString()},tt.helpers.defaultError=function(t){throw t}),ut=tt.helpers.isPromise=function(t){return!!t&&"function"!=typeof t.subscribe&&"function"==typeof t.then},at=(tt.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},tt.helpers.not=function(t){return!t},tt.helpers.isFunction=function(){var t=function(t){return"function"==typeof t||!1};return t(/x/)&&(t=function(t){return"function"==typeof t&&"[object Function]"==Wt.call(t)}),t}());tt.config.longStackSupport=!1;var ct=!1;try{throw new Error}catch(pt){ct=!!pt.stack}var ht,ft=f(),lt="From previous event:",dt=tt.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)};dt.prototype=Error.prototype;var vt=tt.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};vt.prototype=Error.prototype;var yt=tt.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};yt.prototype=Error.prototype;var bt=tt.NotSupportedError=function(t){this.message=t||"This operation is not supported",Error.call(this)};bt.prototype=Error.prototype;var mt=tt.NotImplementedError=function(t){this.message=t||"This operation is not implemented",Error.call(this)};mt.prototype=Error.prototype;var gt=tt.helpers.notImplemented=function(){throw new mt},wt=tt.helpers.notSupported=function(){throw new bt},xt="function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";X.Set&&"function"==typeof(new X.Set)["@@iterator"]&&(xt="@@iterator");var _t=tt.doneEnumerator={done:!0,value:i},St=tt.helpers.isIterable=function(t){return t[xt]!==i},Et=tt.helpers.isArrayLike=function(t){return t&&t.length!==i};tt.helpers.iterator=xt;var Ct,At=tt.internals.bindCallback=function(t,e,n){if("undefined"==typeof e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}},Nt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],kt=Nt.length,Ot="[object Arguments]",Pt="[object Array]",jt="[object Boolean]",Dt="[object Date]",qt="[object Error]",Rt="[object Function]",Mt="[object Number]",Tt="[object Object]",Vt="[object RegExp]",$t="[object String]",Wt=Object.prototype.toString,zt=Object.prototype.hasOwnProperty,Gt=Wt.call(arguments)==Ot,Jt=Error.prototype,It=Object.prototype,Lt=String.prototype,Bt=It.propertyIsEnumerable;try{Ct=!(Wt.call(document)==Tt&&!({toString:0}+""))}catch(pt){Ct=!0}var Ft={};Ft[Pt]=Ft[Dt]=Ft[Mt]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},Ft[jt]=Ft[$t]={constructor:!0,toString:!0,valueOf:!0},Ft[qt]=Ft[Rt]=Ft[Vt]={constructor:!0,toString:!0},Ft[Tt]={constructor:!0};var Ut={};!function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);Ut.enumErrorProps=Bt.call(Jt,"message")||Bt.call(Jt,"name"),Ut.enumPrototypes=Bt.call(t,"prototype"),Ut.nonEnumArgs=0!=n,Ut.nonEnumShadows=!/valueOf/.test(e)}(1);var Ht=tt.internals.isObject=function(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1},Xt=function(t){return t&&"object"==typeof t?Wt.call(t)==Ot:!1};Gt||(Xt=function(t){return t&&"object"==typeof t?zt.call(t,"callee"):!1});var Qt,Kt=tt.internals.isEqual=function(t,e){return m(t,e,[],[])},Yt=({}.hasOwnProperty,Array.prototype.slice),Zt=this.inherits=tt.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},te=tt.internals.addProperties=function(t){for(var e=[],n=1,r=arguments.length;r>n;n++)e.push(arguments[n]);for(var o=0,i=e.length;i>o;o++){var s=e[o];for(var u in s)t[u]=s[u]}},ee=tt.internals.addRef=function(t,e){return new qn(function(n){return new ie(e.getDisposable(),t.subscribe(n))})},ne={e:{}};S.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var re=tt.internals.PriorityQueue=function(t){this.items=new Array(t),this.length=0},oe=re.prototype;oe.isHigherPriority=function(t,e){return this.items[t].compareTo(this.items[e])<0},oe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},oe.heapify=function(t){if(+t||(t=0),!(t>=this.length||0>t)){var e=2*t+1,n=2*t+2,r=t;if(e<this.length&&this.isHigherPriority(e,r)&&(r=e),n<this.length&&this.isHigherPriority(n,r)&&(r=n),r!==t){var o=this.items[t];this.items[t]=this.items[r],this.items[r]=o,this.heapify(r)}}},oe.peek=function(){return this.items[0].value},oe.removeAt=function(t){this.items[t]=this.items[--this.length],this.items[this.length]=i,this.heapify()},oe.dequeue=function(){var t=this.peek();return this.removeAt(0),t},oe.enqueue=function(t){var e=this.length++;this.items[e]=new S(re.count++,t),this.percolate(e)},oe.remove=function(t){for(var e=0;e<this.length;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},re.count=0;var ie=tt.CompositeDisposable=function(){var t,e,n=[];if(Array.isArray(arguments[0]))n=arguments[0],e=n.length;else for(e=arguments.length,n=new Array(e),t=0;e>t;t++)n[t]=arguments[t];for(t=0;e>t;t++)if(!pe(n[t]))throw new TypeError("Not a disposable");this.disposables=n,this.isDisposed=!1,this.length=n.length},se=ie.prototype;se.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},se.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},se.dispose=function(){
-if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new Array(t),n=0;t>n;n++)e[n]=this.disposables[n];for(this.disposables=[],this.length=0,n=0;t>n;n++)e[n].dispose()}};var ue=tt.Disposable=function(t){this.isDisposed=!1,this.action=t||et};ue.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var ae=ue.create=function(t){return new ue(t)},ce=ue.empty={dispose:et},pe=ue.isDisposable=function(t){return t&&at(t.dispose)},he=ue.checkDisposed=function(t){if(t.isDisposed)throw new vt},fe=tt.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};fe.prototype.getDisposable=function(){return this.current},fe.prototype.setDisposable=function(t){if(this.current)throw new Error("Disposable has already been assigned");var e=this.isDisposed;!e&&(this.current=t),e&&t&&t.dispose()},fe.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var le=tt.SerialDisposable=function(){this.isDisposed=!1,this.current=null};le.prototype.getDisposable=function(){return this.current},le.prototype.setDisposable=function(t){var e=this.isDisposed;if(!e){var n=this.current;this.current=t}n&&n.dispose(),e&&t&&t.dispose()},le.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var de=tt.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?ce:new t(this)},e}();E.prototype.dispose=function(){this.scheduler.scheduleWithState(this,C)};var ve=tt.internals.ScheduledItem=function(t,e,n,r,o){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=o||it,this.disposable=new fe};ve.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},ve.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},ve.prototype.isCancelled=function(){return this.disposable.isDisposed},ve.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var ye=tt.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){return e(),ce}t.isScheduler=function(e){return e instanceof t};var n=t.prototype;return n.schedule=function(t){return this._schedule(t,e)},n.scheduleWithState=function(t,e){return this._schedule(t,e)},n.scheduleWithRelative=function(t,n){return this._scheduleRelative(n,t,e)},n.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},n.scheduleWithAbsolute=function(t,n){return this._scheduleAbsolute(n,t,e)},n.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},t.now=rt,t.normalize=function(t){return 0>t&&(t=0),t},t}(),be=ye.normalize,me=ye.isScheduler;!function(t){function e(t,e){function n(e){o(e,function(e){var r=!1,o=!1,s=t.scheduleWithState(e,function(t,e){return r?i.remove(s):o=!0,n(e),ce});o||(i.add(s),r=!0)})}var r=e[0],o=e[1],i=new ie;return n(r),i}function n(t,e,n){function r(e){i(e,function(e,o){var i=!1,u=!1,a=t[n](e,o,function(t,e){return i?s.remove(a):u=!0,r(e),ce});u||(s.add(a),i=!0)})}var o=e[0],i=e[1],s=new ie;return r(o),s}function r(t,e){t(function(n){e(t,n)})}t.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,r)},t.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState([t,n],e)},t.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,r)},t.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative([t,r],e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},t.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,r)},t.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute([t,r],e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})}}(ye.prototype),function(t){ye.prototype.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,e)},ye.prototype.schedulePeriodicWithState=function(t,e,n){if("undefined"==typeof X.setInterval)throw new bt;e=be(e);var r=t,o=X.setInterval(function(){r=n(r)},e);return ae(function(){X.clearInterval(o)})}}(ye.prototype),function(t){t.catchError=t["catch"]=function(t){return new Ae(this,t)}}(ye.prototype);var ge,we,xe=(tt.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new fe;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}(),ye.immediate=function(){function t(t,e){return e(this,t)}return new ye(rt,t,wt,wt)}()),_e=ye.currentThread=function(){function t(){for(;n.length>0;){var t=n.dequeue();!t.isCancelled()&&t.invoke()}}function e(e,r){var o=new ve(this,e,r,this.now());if(n)n.enqueue(o);else{n=new re(4),n.enqueue(o);var i=x(t)();if(n=null,i===ne)return _(i.e)}return o.disposable}var n,r=new ye(rt,e,wt,wt);return r.scheduleRequired=function(){return!n},r}(),Se=function(){var t,e=et;if(X.setTimeout)t=X.setTimeout,e=X.clearTimeout;else{if(!X.WScript)throw new bt;t=function(t,e){X.WScript.Sleep(e),t()}}return{setTimeout:t,clearTimeout:e}}(),Ee=Se.setTimeout,Ce=Se.clearTimeout;!function(){function t(e){if(s)Ee(function(){t(e)},0);else{var n=i[e];if(n){s=!0;var r=x(n)();if(we(e),s=!1,r===ne)return _(r.e)}}}function n(){if(!X.postMessage||X.importScripts)return!1;var t=!1,e=X.onmessage;return X.onmessage=function(){t=!0},X.postMessage("","*"),X.onmessage=e,t}function r(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))}var o=1,i={},s=!1;we=function(t){delete i[t]};var u=RegExp("^"+String(Wt).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),a="function"==typeof(a=Z&&Y&&Z.setImmediate)&&!u.test(a)&&a;if(at(a))ge=function(e){var n=o++;return i[n]=e,a(function(){t(n)}),n};else if("undefined"!=typeof e&&"[object process]"==={}.toString.call(e))ge=function(n){var r=o++;return i[r]=n,e.nextTick(function(){t(r)}),r};else if(n()){var c="ms.rx.schedule"+Math.random();X.addEventListener?X.addEventListener("message",r,!1):X.attachEvent?X.attachEvent("onmessage",r):X.onmessage=r,ge=function(t){var e=o++;return i[e]=t,X.postMessage(c+currentId,"*"),e}}else if(X.MessageChannel){var p=new X.MessageChannel;p.port1.onmessage=function(e){t(e.data)},ge=function(t){var e=o++;return i[e]=t,p.port2.postMessage(e),e}}else ge="document"in X&&"onreadystatechange"in X.document.createElement("script")?function(e){var n=X.document.createElement("script"),r=o++;return i[r]=e,n.onreadystatechange=function(){t(r),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},X.document.documentElement.appendChild(n),r}:function(e){var n=o++;return i[n]=e,Ee(function(){t(n)},0),n}}();var Ae=(ye.timeout=ye["default"]=function(){function t(t,e){var n=this,r=new fe,o=ge(function(){!r.isDisposed&&r.setDisposable(e(n,t))});return new ie(r,ae(function(){we(o)}))}function e(t,e,n){var r=this,o=ye.normalize(e),i=new fe;if(0===o)return r.scheduleWithState(t,n);var s=Ee(function(){!i.isDisposed&&i.setDisposable(n(r,t))},o);return new ie(i,ae(function(){Ce(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new ye(rt,t,e,n)}(),function(t){function e(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function n(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function r(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,i){this._scheduler=o,this._handler=i,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,this._scheduler.now.bind(this._scheduler),e,n,r)}return Zt(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(o){if(!e._handler(o))throw o;return ce}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,o=!1,i=new fe;return i.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(o)return null;try{return n(t)}catch(e){if(o=!0,!r._handler(e))throw e;return i.dispose(),null}})),i},o}(ye)),Ne=tt.Notification=function(){function t(t,e,n,r,o,i){this.kind=t,this.value=e,this.exception=n,this._accept=r,this._acceptObservable=o,this.toString=i}return t.prototype.accept=function(t,e,n){return t&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},t.prototype.toObservable=function(t){var e=this;return me(t)||(t=xe),new qn(function(n){return t.scheduleWithState(e,function(t,e){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),ke=Ne.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){return new Ne("N",r,null,t,e,n)}}(),Oe=Ne.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){return new Ne("E",null,r,t,e,n)}}(),Pe=Ne.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){return new Ne("C",null,null,t,e,n)}}(),je=tt.Observer=function(){};je.prototype.toNotifier=function(){var t=this;return function(e){return e.accept(t)}},je.prototype.asObserver=function(){return new Me(this.onNext.bind(this),this.onError.bind(this),this.onCompleted.bind(this))},je.prototype.checked=function(){return new Te(this)};var De=je.create=function(t,e,n){return t||(t=et),e||(e=st),n||(n=et),new Me(t,e,n)};je.fromNotifier=function(t,e){return new Me(function(n){return t.call(e,ke(n))},function(n){return t.call(e,Oe(n))},function(){return t.call(e,Pe())})},je.prototype.notifyOn=function(t){return new $e(t,this)},je.prototype.makeSafe=function(t){return new AnonymousSafeObserver(this._onNext,this._onError,this._onCompleted,t)};var qe,Re=tt.internals.AbstractObserver=function(t){function e(){this.isStopped=!1,t.call(this)}return Zt(e,t),e.prototype.next=gt,e.prototype.error=gt,e.prototype.completed=gt,e.prototype.onNext=function(t){this.isStopped||this.next(t)},e.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.error(t))},e.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.completed())},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.error(t),!0)},e}(je),Me=tt.AnonymousObserver=function(t){function e(e,n,r){t.call(this),this._onNext=e,this._onError=n,this._onCompleted=r}return Zt(e,t),e.prototype.next=function(t){this._onNext(t)},e.prototype.error=function(t){this._onError(t)},e.prototype.completed=function(){this._onCompleted()},e}(Re),Te=function(t){function e(e){t.call(this),this._observer=e,this._state=0}Zt(e,t);var n=e.prototype;return n.onNext=function(t){this.checkAccess();var e=x(this._observer.onNext).call(this._observer,t);this._state=0,e===ne&&_(e.e)},n.onError=function(t){this.checkAccess();var e=x(this._observer.onError).call(this._observer,t);this._state=2,e===ne&&_(e.e)},n.onCompleted=function(){this.checkAccess();var t=x(this._observer.onCompleted).call(this._observer);this._state=2,t===ne&&_(t.e)},n.checkAccess=function(){if(1===this._state)throw new Error("Re-entrancy detected");if(2===this._state)throw new Error("Observer completed");0===this._state&&(this._state=1)},e}(je),Ve=tt.internals.ScheduledObserver=function(t){function e(e,n){t.call(this),this.scheduler=e,this.observer=n,this.isAcquired=!1,this.hasFaulted=!1,this.queue=[],this.disposable=new le}return Zt(e,t),e.prototype.next=function(t){var e=this;this.queue.push(function(){e.observer.onNext(t)})},e.prototype.error=function(t){var e=this;this.queue.push(function(){e.observer.onError(t)})},e.prototype.completed=function(){var t=this;this.queue.push(function(){t.observer.onCompleted()})},e.prototype.ensureActive=function(){var t=!1,e=this;!this.hasFaulted&&this.queue.length>0&&(t=!this.isAcquired,this.isAcquired=!0),t&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(t){var n;if(!(e.queue.length>0))return void(e.isAcquired=!1);n=e.queue.shift();try{n()}catch(r){throw e.queue=[],e.hasFaulted=!0,r}t()}))},e.prototype.dispose=function(){t.prototype.dispose.call(this),this.disposable.dispose()},e}(Re),$e=function(t){function e(e,n,r){t.call(this,e,n),this._cancel=r}return Zt(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e.prototype.dispose=function(){t.prototype.dispose.call(this),this._cancel&&this._cancel.dispose(),this._cancel=null},e}(Ve),We=tt.Observable=function(){function t(t){if(tt.config.longStackSupport&&ct){try{throw new Error}catch(e){this.stack=e.stack.substring(e.stack.indexOf("\n")+1)}var n=this;this._subscribe=function(e){var r=e.onError.bind(e);return e.onError=function(t){a(t,n),r(t)},t.call(n,e)}}else this._subscribe=t}return qe=t.prototype,qe.subscribe=qe.forEach=function(t,e,n){return this._subscribe("object"==typeof t?t:De(t,e,n))},qe.subscribeOnNext=function(t,e){return this._subscribe(De("undefined"!=typeof e?function(n){t.call(e,n)}:t))},qe.subscribeOnError=function(t,e){return this._subscribe(De(null,"undefined"!=typeof e?function(n){t.call(e,n)}:t))},qe.subscribeOnCompleted=function(t,e){return this._subscribe(De(null,null,"undefined"!=typeof e?function(){t.call(e)}:t))},t}(),ze=tt.ObservableBase=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o.subscribeCore).call(o,r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(t){var e=new Rn(t),r=[e,this];return _e.scheduleRequired()?_e.scheduleWithState(r,n):n(null,r),e}function o(){t.call(this,r)}return Zt(o,t),o.prototype.subscribeCore=gt,o}(We),Ge=tt.internals.Enumerable=function(){},Je=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e,n){this.o=t,this.s=e,this.e=n,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e,r=new le,o=xe.scheduleRecursiveWithState(this.sources[xt](),function(o,i){if(!e){var s=x(o.next).call(o);if(s===ne)return t.onError(s.e);if(s.done)return t.onCompleted();var u=s.value;ut(u)&&(u=Xe(u));var a=new fe;r.setDisposable(a),a.setDisposable(u.subscribe(new n(t,i,o)))}});return new ie(r,o,ae(function(){e=!0}))},n.prototype.onNext=function(t){this.isStopped||this.o.onNext(t)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.s(this.e))},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);Ge.prototype.concat=function(){return new Je(this)};var Ie=function(t){function e(e){this.sources=e,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e,n=this.sources[xt](),r=new le,o=xe.scheduleRecursiveWithState(null,function(o,i){if(!e){var s=x(n.next).call(n);if(s===ne)return t.onError(s.e);if(s.done)return null!==o?t.onError(o):t.onCompleted();var u=s.value;ut(u)&&(u=Xe(u));var a=new fe;r.setDisposable(a),a.setDisposable(u.subscribe(function(e){t.onNext(e)},i,function(){t.onCompleted()}))}});return new ie(r,o,ae(function(){e=!0}))},e}(ze);Ge.prototype.catchError=function(){return new Ie(this)},Ge.prototype.catchErrorWhen=function(t){var e=this;return new qn(function(n){var r,o,i=new Tn,s=new Tn,u=t(i),a=u.subscribe(s),c=e[xt](),p=new le,h=xe.scheduleRecursive(function(t){if(!r){var e=x(c.next).call(c);if(e===ne)return n.onError(e.e);if(e.done)return void(o?n.onError(o):n.onCompleted());var u=e.value;ut(u)&&(u=Xe(u));var a=new fe,h=new fe;p.setDisposable(new ie(h,a)),a.setDisposable(u.subscribe(function(t){n.onNext(t)},function(e){h.setDisposable(s.subscribe(t,function(t){n.onError(t)},function(){n.onCompleted()})),i.onNext(e)},function(){n.onCompleted()}))}});return new ie(a,p,h,ae(function(){r=!0}))})};var Le=function(t){function e(t,e){this.v=t,this.c=null==e?-1:e}function n(t){this.v=t.v,this.l=t.c}return Zt(e,t),e.prototype[xt]=function(){return new n(this)},n.prototype.next=function(){return 0===this.l?_t:(this.l>0&&this.l--,{done:!1,value:this.v})},e}(Ge),Be=Ge.repeat=function(t,e){return new Le(t,e)},Fe=function(t){function e(t,e,n){this.s=t,this.fn=e?At(e,n,3):null}function n(t){this.i=-1,this.s=t.s,this.l=this.s.length,this.fn=t.fn}return Zt(e,t),e.prototype[xt]=function(){return new n(this)},n.prototype.next=function(){return++this.i<this.l?{done:!1,value:this.fn?this.fn(this.s[this.i],this.i,this.s):this.s[this.i]}:_t},e}(Ge),Ue=Ge.of=function(t,e,n){return new Fe(t,e,n)};qe.observeOn=function(t){var e=this;return new qn(function(n){return e.subscribe(new $e(t,n))},e)},qe.subscribeOn=function(t){var e=this;return new qn(function(n){var r=new fe,o=new le;return o.setDisposable(r),r.setDisposable(t.schedule(function(){o.setDisposable(new E(t,e.subscribe(n)))})),o},e)};var He=function(t){function e(e){this.p=e,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.p.then(function(e){t.onNext(e),t.onCompleted()},function(e){t.onError(e)}),ce},e}(ze),Xe=We.fromPromise=function(t){return new He(t)};qe.toPromise=function(t){if(t||(t=tt.config.Promise),!t)throw new bt("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,o=!1;e.subscribe(function(t){r=t,o=!0},n,function(){o&&t(r)})})};var Qe=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.a=[],this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=function(t){this.isStopped||this.a.push(t)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onNext(this.a),this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.toArray=function(){return new Qe(this)},We.create=We.createWithDisposable=function(t,e){return new qn(t,e)};var Ke=(We.defer=function(t){return new qn(function(e){var n;try{n=t()}catch(r){return dn(r).subscribe(e)}return ut(n)&&(n=Xe(n)),n.subscribe(e)})},function(t){function e(e){this.scheduler=e,t.call(this)}function n(t,e){this.observer=t,this.parent=e}function r(t,e){e.onCompleted()}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.parent.scheduler.scheduleWithState(this.observer,r)},e}(ze)),Ye=We.empty=function(t){return me(t)||(t=xe),new Ke(t)},Ze=function(t){function e(e,n,r){this.iterable=e,this.mapper=n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new tn(t,this);return e.run()},e}(ze),tn=function(){function t(t,e){this.observer=t,this.parent=e}return t.prototype.run=function(){function t(t,e){try{var i=n.next()}catch(s){return r.onError(s)}if(i.done)return r.onCompleted();var u=i.value;if(o)try{u=o(u,t)}catch(s){return r.onError(s)}r.onNext(u),e(t+1)}var e=Object(this.parent.iterable),n=j(e),r=this.observer,o=this.parent.mapper;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},t}(),en=Math.pow(2,53)-1;A.prototype[xt]=function(){return new N(this._s)},N.prototype[xt]=function(){return this},N.prototype.next=function(){return this._i<this._l?{done:!1,value:this._s.charAt(this._i++)}:_t},k.prototype[xt]=function(){return new O(this._a)},O.prototype[xt]=function(){return this},O.prototype.next=function(){return this._i<this._l?{done:!1,value:this._a[this._i++]}:_t};var nn=We.from=function(t,e,n,r){if(null==t)throw new Error("iterable cannot be null.");if(e&&!at(e))throw new Error("mapFn when provided must be a function");if(e)var o=At(e,n,2);return me(r)||(r=_e),new Ze(t,o,r)},rn=function(t){function e(e,n){this.args=e,this.scheduler=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new R(t,this);return e.run()},e}(ze);R.prototype.run=function(){function t(t,o){r>t?(e.onNext(n[t]),o(t+1)):e.onCompleted()}var e=this.observer,n=this.parent.args,r=n.length;return this.parent.scheduler.scheduleRecursiveWithState(0,t)};var on=We.fromArray=function(t,e){return me(e)||(e=_e),new rn(t,e)};We.generate=function(t,e,n,r,o){return me(o)||(o=_e),new qn(function(i){var s=!0;return o.scheduleRecursiveWithState(t,function(t,o){var u,a;try{s?s=!1:t=n(t),u=e(t),u&&(a=r(t))}catch(c){return i.onError(c)}u?(i.onNext(a),o(t)):i.onCompleted()})})};var sn=function(t){function e(){t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return ce},e}(ze),un=We.never=function(){return new sn};We.of=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return new rn(e,_e)},We.ofWithScheduler=function(t){for(var e=arguments.length,n=new Array(e-1),r=1;e>r;r++)n[r-1]=arguments[r];return new rn(n,t)};var an=function(t){function e(e,n){this.obj=e,this.keys=Object.keys(e),this.scheduler=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new T(t,this);return e.run()},e}(ze);T.prototype.run=function(){function t(t,i){if(o>t){var s=r[t];e.onNext([s,n[s]]),i(t+1)}else e.onCompleted()}var e=this.observer,n=this.parent.obj,r=this.parent.keys,o=r.length;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},We.pairs=function(t,e){return e||(e=_e),new an(t,e)};var cn=function(t){function e(e,n,r){this.start=e,this.rangeCount=n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new pn(t,this);return e.run()},e}(ze),pn=function(){function t(t,e){this.observer=t,this.parent=e}return t.prototype.run=function(){function t(t,o){n>t?(r.onNext(e+t),o(t+1)):r.onCompleted()}var e=this.parent.start,n=this.parent.rangeCount,r=this.observer;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},t}();We.range=function(t,e,n){return me(n)||(n=_e),new cn(t,e,n)};var hn=function(t){function e(e,n,r){this.value=e,this.repeatCount=null==n?-1:n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new V(t,this);return e.run()},e}(ze);V.prototype.run=function(){function t(t,r){return(-1===t||t>0)&&(e.onNext(n),t>0&&t--),0===t?e.onCompleted():void r(t)}var e=this.observer,n=this.parent.value;return this.parent.scheduler.scheduleRecursiveWithState(this.parent.repeatCount,t)},We.repeat=function(t,e,n){return me(n)||(n=_e),new hn(t,e,n)};var fn=function(t){function e(e,n){this.value=e,this.scheduler=n,t.call(this)}function n(t,e){this.observer=t,this.parent=e}function r(t,e){var n=e[0],r=e[1];r.onNext(n),r.onCompleted()}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.parent.scheduler.scheduleWithState([this.parent.value,this.observer],r)},e}(ze),ln=(We["return"]=We.just=We.returnValue=function(t,e){return me(e)||(e=xe),new fn(t,e)},function(t){function e(e,n){this.error=e,this.scheduler=n,t.call(this)}function n(t,e){this.o=t,this.p=e}function r(t,e){var n=e[0],r=e[1];r.onError(n)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.p.scheduler.scheduleWithState([this.p.error,this.o],r)},e}(ze)),dn=We["throw"]=We.throwError=We.throwException=function(t,e){return me(e)||(e=xe),new ln(t,e)};We.using=function(t,e){return new qn(function(n){var r,o,i=ce;try{r=t(),r&&(i=r),o=e(r)}catch(s){return new ie(dn(s).subscribe(n),i)}return new ie(o.subscribe(n),i)})},qe.amb=function(t){var e=this;return new qn(function(n){function r(){i||(i=s,c.dispose())}function o(){i||(i=u,a.dispose())}var i,s="L",u="R",a=new fe,c=new fe;return ut(t)&&(t=Xe(t)),a.setDisposable(e.subscribe(function(t){r(),i===s&&n.onNext(t)},function(t){r(),i===s&&n.onError(t)},function(){r(),i===s&&n.onCompleted()})),c.setDisposable(t.subscribe(function(t){o(),i===u&&n.onNext(t)},function(t){o(),i===u&&n.onError(t)},function(){o(),i===u&&n.onCompleted()})),new ie(a,c)})},We.amb=function(){function t(t,e){return t.amb(e)}var e=un(),n=[];if(Array.isArray(arguments[0]))n=arguments[0];else for(var r=0,o=arguments.length;o>r;r++)n.push(arguments[r]);for(var r=0,o=n.length;o>r;r++)e=t(e,n[r]);return e},qe["catch"]=qe.catchError=qe.catchException=function(t){return"function"==typeof t?$(this,t):vn([this,t])};var vn=We.catchError=We["catch"]=We.catchException=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return Ue(t).catchError()};qe.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return Array.isArray(e[0])?e[0].unshift(this):e.unshift(this),yn.apply(this,e)};var yn=We.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.pop();return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){function n(e){if(u[e]=!0,a||(a=u.every(nt))){try{var n=r.apply(null,p)}catch(o){return t.onError(o)}t.onNext(n)}else c.filter(function(t,n){return n!==e}).every(nt)&&t.onCompleted()}function o(e){c[e]=!0,c.every(nt)&&t.onCompleted()}for(var i=e.length,s=function(){return!1},u=g(i,s),a=!1,c=g(i,s),p=new Array(i),h=new Array(i),f=0;i>f;f++)!function(r){var i=e[r],s=new fe;ut(i)&&(i=Xe(i)),s.setDisposable(i.subscribe(function(t){p[r]=t,n(r)},function(e){t.onError(e)},function(){o(r)})),h[r]=s}(f);return new ie(h)},this)};qe.concat=function(){for(var t=[],e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return t.unshift(this),mn.apply(null,t)};var bn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this.sources=t,this.o=e}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(this.sources,t);return e.run()},n.prototype.run=function(){var t,e=new le,n=this.sources,r=n.length,o=this.o,i=xe.scheduleRecursiveWithState(0,function(i,s){if(!t){if(i===r)return o.onCompleted();var u=n[i];ut(u)&&(u=Xe(u));var a=new fe;e.setDisposable(a),a.setDisposable(u.subscribe(function(t){o.onNext(t)},function(t){o.onError(t)},function(){s(i+1)}))}});return new ie(e,i,ae(function(){t=!0}))},e}(ze),mn=We.concat=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{t=new Array(arguments.length);for(var e=0,n=arguments.length;n>e;e++)t[e]=arguments[e]}return new bn(t)};qe.concatAll=qe.concatObservable=function(){return this.merge(1)};var gn=function(t){function e(e,n){this.source=e,this.maxConcurrent=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new ie;return e.add(this.source.subscribe(new wn(t,this.maxConcurrent,e))),e},e}(ze),wn=function(){function t(t,e,n){this.o=t,this.max=e,this.g=n,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function e(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return t.prototype.handleSubscribe=function(t){var n=new fe;this.g.add(n),ut(t)&&(t=Xe(t)),n.setDisposable(t.subscribe(new e(this,n)))},t.prototype.onNext=function(t){this.isStopped||(this.activeCount<this.max?(this.activeCount++,this.handleSubscribe(t)):this.q.push(t))},t.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},t.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,0===this.activeCount&&this.o.onCompleted())},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},e.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},e.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=this.parent;t.g.remove(this.sad),t.q.length>0?t.handleSubscribe(t.q.shift()):(t.activeCount--,t.done&&0===t.activeCount&&t.o.onCompleted())}},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},t}();qe.merge=function(t){return"number"!=typeof t?xn(this,t):new gn(this,t)};var xn=We.merge=function(){var t,e,n=[],r=arguments.length;if(arguments[0])if(me(arguments[0]))for(t=arguments[0],e=1;r>e;e++)n.push(arguments[e]);else for(t=xe,e=0;r>e;e++)n.push(arguments[e]);else for(t=xe,e=1;r>e;e++)n.push(arguments[e]);return Array.isArray(n[0])&&(n=n[0]),M(t,n).mergeAll()},_n=tt.CompositeError=function(t){this.name="NotImplementedError",this.innerErrors=t,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};_n.prototype=Error.prototype,We.mergeDelayError=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}var r=M(null,t);return new qn(function(t){function e(){0===s.length?t.onCompleted():1===s.length?t.onError(s[0]):t.onError(new _n(s))}var n=new ie,o=new fe,i=!1,s=[];return n.add(o),o.setDisposable(r.subscribe(function(r){var o=new fe;n.add(o),ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(e){t.onNext(e)},function(t){s.push(t),n.remove(o),i&&1===n.length&&e()},function(){n.remove(o),i&&1===n.length&&e()}))},function(t){s.push(t),i=!0,1===n.length&&e()},function(){i=!0,1===n.length&&e()})),n})};var Sn=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.g=e,this.isStopped=!1,this.done=!1}function r(t,e,n){this.parent=t,this.g=e,this.sad=n,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new ie,r=new fe;return e.add(r),r.setDisposable(this.source.subscribe(new n(t,e))),e},n.prototype.onNext=function(t){if(!this.isStopped){var e=new fe;this.g.add(e),ut(t)&&(t=Xe(t)),e.setDisposable(t.subscribe(new r(this,this.g,e)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},r.prototype.onCompleted=function(){if(!this.isStopped){var t=this.parent;this.isStopped=!0,t.g.remove(this.sad),t.done&&1===t.g.length&&t.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ze);qe.mergeAll=qe.mergeObservable=function(){
-return new Sn(this)},qe.onErrorResumeNext=function(t){if(!t)throw new Error("Second observable is required");return En([this,t])};var En=We.onErrorResumeNext=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return new qn(function(e){var n=0,r=new le,o=xe.scheduleRecursive(function(o){var i,s;n<t.length?(i=t[n++],ut(i)&&(i=Xe(i)),s=new fe,r.setDisposable(s),s.setDisposable(i.subscribe(e.onNext.bind(e),o,o))):e.onCompleted()});return new ie(r,o)})};qe.skipUntil=function(t){var e=this;return new qn(function(n){var r=!1,o=new ie(e.subscribe(function(t){r&&n.onNext(t)},function(t){n.onError(t)},function(){r&&n.onCompleted()}));ut(t)&&(t=Xe(t));var i=new fe;return o.add(i),i.setDisposable(t.subscribe(function(){r=!0,i.dispose()},function(t){n.onError(t)},function(){i.dispose()})),o},e)};var Cn=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.inner=e,this.stopped=!1,this.latest=0,this.hasLatest=!1,this.isStopped=!1}function r(t,e){this.parent=t,this.id=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new le,r=this.source.subscribe(new n(t,e));return new ie(r,e)},n.prototype.onNext=function(t){if(!this.isStopped){var e=new fe,n=++this.latest;this.hasLatest=!0,this.inner.setDisposable(e),ut(t)&&(t=Xe(t)),e.setDisposable(t.subscribe(new r(this,n)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.stopped=!0,!this.hasLatest&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.latest===this.id&&this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&this.parent.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted()))},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ze);qe["switch"]=qe.switchLatest=function(){return new Cn(this)};var An=function(t){function e(e,n){this.source=e,this.other=ut(n)?Xe(n):n,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return new ie(this.source.subscribe(t),this.other.subscribe(new n(t)))},n.prototype.onNext=function(t){this.isStopped||this.o.onCompleted()},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){!this.isStopped&&(this.isStopped=!0)},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.takeUntil=function(t){return new An(this,t)},qe.withLatestFrom=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.pop(),o=this;return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){for(var n=e.length,i=g(n,W),s=!1,u=new Array(n),a=new Array(n+1),c=0;n>c;c++)!function(n){var r=e[n],o=new fe;ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(t){u[n]=t,i[n]=!0,s=i.every(nt)},function(e){t.onError(e)},et)),a[n]=o}(c);var p=new fe;return p.setDisposable(o.subscribe(function(e){var n=[e].concat(u);if(s){var o=x(r).apply(null,n);return o===ne?t.onError(o.e):void t.onNext(o)}},function(e){t.onError(e)},function(){t.onCompleted()})),a[n]=p,new ie(a)},this)},qe.zip=function(){if(Array.isArray(arguments[0]))return z.apply(this,arguments);for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=this,o=e.pop();return e.unshift(r),new qn(function(t){for(var n=e.length,i=g(n,G),s=g(n,W),u=new Array(n),a=0;n>a;a++)!function(n){var a=e[n],c=new fe;ut(a)&&(a=Xe(a)),c.setDisposable(a.subscribe(function(e){if(i[n].push(e),i.every(function(t){return t.length>0})){var u=i.map(function(t){return t.shift()}),a=x(o).apply(r,u);if(a===ne)return t.onError(a.e);t.onNext(a)}else s.filter(function(t,e){return e!==n}).every(nt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(nt)&&t.onCompleted()})),u[n]=c}(a);return new ie(u)},r)},We.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.shift();return r.zip.apply(r,e)},We.zipArray=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return new qn(function(e){for(var n=t.length,r=g(n,J),o=g(n,W),i=new Array(n),s=0;n>s;s++)!function(n){i[n]=new fe,i[n].setDisposable(t[n].subscribe(function(t){if(r[n].push(t),r.every(function(t){return t.length>0})){var i=r.map(function(t){return t.shift()});e.onNext(i)}else if(o.filter(function(t,e){return e!==n}).every(nt))return e.onCompleted()},function(t){e.onError(t)},function(){o[n]=!0,o.every(nt)&&e.onCompleted()}))}(s);return new ie(i)})},qe.asObservable=function(){var t=this;return new qn(function(e){return t.subscribe(e)},t)},qe.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},qe.dematerialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){return t.accept(e)},function(t){e.onError(t)},function(){e.onCompleted()})},this)},qe.distinctUntilChanged=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o,i=!1;return n.subscribe(function(n){var s=n;if(t&&(s=x(t)(n),s===ne))return r.onError(s.e);if(i){var u=x(e)(o,s);if(u===ne)return r.onError(u.e)}i&&u||(i=!0,o=s,r.onNext(n))},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Nn=function(t){function e(e,n,r,o){this.source=e,this.t=!n||at(n)?De(n||et,r||et,o||et):n,t.call(this)}function n(t,e){this.o=t,this.t=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.t))},n.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.t.onNext).call(this.t,t);e===ne&&this.o.onError(e.e),this.o.onNext(t)}},n.prototype.onError=function(t){if(!this.isStopped){this.isStopped=!0;var e=x(this.t.onError).call(this.t,t);if(e===ne)return this.o.onError(e.e);this.o.onError(t)}},n.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=x(this.t.onCompleted).call(this.t);if(t===ne)return this.o.onError(t.e);this.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe["do"]=qe.tap=qe.doAction=function(t,e,n){return new Nn(this,t,e,n)},qe.doOnNext=qe.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnError=qe.tapOnError=function(t,e){return this.tap(et,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnCompleted=qe.tapOnCompleted=function(t,e){return this.tap(et,null,"undefined"!=typeof e?function(){t.call(e)}:t)},qe["finally"]=qe.ensure=function(t){var e=this;return new qn(function(n){var r;try{r=e.subscribe(n)}catch(o){throw t(),o}return ae(function(){try{r.dispose()}catch(e){throw e}finally{t()}})},this)},qe.finallyAction=function(t){return this.ensure(t)};var kn=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=et,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ze);qe.ignoreElements=function(){return new kn(this)},qe.materialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){e.onNext(ke(t))},function(t){e.onNext(Oe(t)),e.onCompleted()},function(){e.onNext(Pe()),e.onCompleted()})},t)},qe.repeat=function(t){return Be(this,t).concat()},qe.retry=function(t){return Be(this,t).catchError()},qe.retryWhen=function(t){return Be(this).catchErrorWhen(t)};var On=function(t){function e(e,n,r,o){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=o,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new I(t,this))},e}(ze);I.prototype.onNext=function(t){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,t):(this.accumulation=this.hasSeed?this.accumulator(this.seed,t):t,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},I.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.observer.onError(t))},I.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},I.prototype.dispose=function(){this.isStopped=!0},I.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},qe.scan=function(){var t,e,n=!1;return 2===arguments.length?(n=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new On(this,e,n,t)},qe.skipLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},function(t){n.onError(t)},function(){n.onCompleted()})},e)},qe.startWith=function(){var t,e=0;arguments.length&&me(arguments[0])?(t=arguments[0],e=1):t=xe;for(var n=[],r=e,o=arguments.length;o>r;r++)n.push(arguments[r]);return Ue([on(n,t),this]).concat()},qe.takeLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){for(;r.length>0;)n.onNext(r.shift());n.onCompleted()})},e)},qe.takeLastBuffer=function(t){var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},qe.windowWithCount=function(t,e){var n=this;if(+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new yt;if(null==e&&(e=t),+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new yt;return new qn(function(r){function o(){var t=new Tn;a.push(t),r.onNext(ee(t,s))}var i=new fe,s=new de(i),u=0,a=[];return o(),i.setDisposable(n.subscribe(function(n){for(var r=0,i=a.length;i>r;r++)a[r].onNext(n);var s=u-t+1;s>=0&&s%e===0&&a.shift().onCompleted(),++u%e===0&&o()},function(t){for(;a.length>0;)a.shift().onError(t);r.onError(t)},function(){for(;a.length>0;)a.shift().onCompleted();r.onCompleted()})),s},n)},qe.selectConcat=qe.concatMap=function(t,e,n){return at(t)&&at(e)?this.concatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})}):at(t)?L(this,t,n):L(this,function(){return t})},qe.concatMapObserver=qe.selectConcatObserver=function(t,e,n,r){var o=this,i=At(t,r,2),s=At(e,r,1),u=At(n,r,0);return new qn(function(t){var e=0;return o.subscribe(function(n){var r;try{r=i(n,e++)}catch(o){return void t.onError(o)}ut(r)&&(r=Xe(r)),t.onNext(r)},function(e){var n;try{n=s(e)}catch(r){return void t.onError(r)}ut(n)&&(n=Xe(n)),t.onNext(n),t.onCompleted()},function(){var e;try{e=u()}catch(n){return void t.onError(n)}ut(e)&&(e=Xe(e)),t.onNext(e),t.onCompleted()})},this).concatAll()},qe.defaultIfEmpty=function(t){var e=this;return t===i&&(t=null),new qn(function(n){var r=!1;return e.subscribe(function(t){r=!0,n.onNext(t)},function(t){n.onError(t)},function(){!r&&n.onNext(t),n.onCompleted()})},e)},F.prototype.push=function(t){var e=-1===B(this.set,t,this.comparer);return e&&this.set.push(t),e},qe.distinct=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o=new F(e);return n.subscribe(function(e){var n=e;if(t)try{n=t(e)}catch(i){return void r.onError(i)}o.push(n)&&r.onNext(e)},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Pn=function(t){function e(e,n,r){this.source=e,this.selector=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return t.call(this,e.selector(n,r,o),r,o)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.selector)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void this.o.onNext(e)}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.map=qe.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Pn?this.internalMap(n,e):new Pn(this,n,e)},qe.pluck=function(){var t=arguments,e=arguments.length;if(0===e)throw new Error("List of properties cannot be empty.");return this.map(function(n){for(var r=n,o=0;e>o;o++){var s=r[t[o]];if("undefined"==typeof s)return i;r=s}return r})},qe.flatMapObserver=qe.selectManyObserver=function(t,e,n,r){var o=this;return new qn(function(i){var s=0;return o.subscribe(function(e){var n;try{n=t.call(r,e,s++)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n)},function(t){var n;try{n=e.call(r,t)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n),i.onCompleted()},function(){var t;try{t=n.call(r)}catch(e){return void i.onError(e)}ut(t)&&(t=Xe(t)),i.onNext(t),i.onCompleted()})},o).mergeAll()},qe.selectMany=qe.flatMap=function(t,e,n){return at(t)&&at(e)?this.flatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})},n):at(t)?U(this,t,n):U(this,function(){return t})},qe.selectSwitch=qe.flatMapLatest=qe.switchMap=function(t,e){return this.select(t,e).switchLatest()};var jn=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.skip=function(t){if(0>t)throw new yt;return new jn(this,t)},qe.skipWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!1;return n.subscribe(function(i){if(!o)try{o=!r(i,e++,n)}catch(s){return void t.onError(s)}o&&t.onNext(i)},function(e){t.onError(e)},function(){t.onCompleted()})},n)},qe.take=function(t,e){if(0>t)throw new yt;if(0===t)return Ye(e);var n=this;return new qn(function(e){var r=t;return n.subscribe(function(t){r-- >0&&(e.onNext(t),0>=r&&e.onCompleted())},function(t){e.onError(t)},function(){e.onCompleted()})},n)},qe.takeWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!0;return n.subscribe(function(i){if(o){try{o=r(i,e++,n)}catch(s){return void t.onError(s)}o?t.onNext(i):t.onCompleted()}},function(e){t.onError(e)},function(){t.onCompleted()})},n)};var Dn=function(t){function e(e,n,r){this.source=e,this.predicate=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return e.predicate(n,r,o)&&t.call(this,n,r,o)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.predicate)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void(e&&this.o.onNext(t))}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.filter=qe.where=function(t,e){return this instanceof Dn?this.internalFilter(t,e):new Dn(this,t,e)},qe.transduce=function(t){function e(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var n=this;return new qn(function(r){var o=t(e(r));return n.subscribe(function(t){try{o["@@transducer/step"](r,t)}catch(e){r.onError(e)}},function(t){r.onError(t)},function(){o["@@transducer/result"](r)})},n)};var qn=tt.AnonymousObservable=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o)(r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(e,r){function o(t){var r=new Rn(t),o=[r,e];return _e.scheduleRequired()?_e.scheduleWithState(o,n):n(null,o),r}this.source=r,t.call(this,o)}return Zt(r,t),r}(We),Rn=function(t){function e(e){t.call(this),this.observer=e,this.m=new fe}Zt(e,t);var n=e.prototype;return n.next=function(t){var e=x(this.observer.onNext).call(this.observer,t);e===ne&&(this.dispose(),_(e.e))},n.error=function(t){var e=x(this.observer.onError).call(this.observer,t);this.dispose(),e===ne&&_(e.e)},n.completed=function(){var t=x(this.observer.onCompleted).call(this.observer);this.dispose(),t===ne&&_(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Re),Mn=function(t,e){this.subject=t,this.observer=e};Mn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var Tn=tt.Subject=function(t){function e(t){return he(this),this.isStopped?this.hasError?(t.onError(this.error),ce):(t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(he(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=u(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(he(this),!this.isStopped)for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),n.create=function(t,e){return new Vn(t,e)},n}(We),Vn=(tt.AsyncSubject=function(t){function e(t){return he(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je,{hasObservers:function(){return he(this),this.observers.length>0},onCompleted:function(){var t,e;if(he(this),!this.isStopped){this.isStopped=!0;var n=u(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){he(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),n}(We),tt.AnonymousSubject=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){this.observer=n,this.observable=r,t.call(this,e)}return Zt(n,t),te(n.prototype,je.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(We));"function"==typeof t&&"object"==typeof t.amd&&t.amd?(X.Rx=tt,t(function(){return tt})):Q&&K?Y?(K.exports=tt).Rx=tt:Q.Rx=tt:X.Rx=tt;var $n=f()}).call(this)}).call(this,e(150),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)});
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],16:[function(require,module,exports){
-(function (global){
-var topLevel = typeof global !== 'undefined' ? global :
-    typeof window !== 'undefined' ? window : {}
-var minDoc = require('min-document');
-
-var doccy;
-
-if (typeof document !== 'undefined') {
-    doccy = document;
-} else {
-    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
-
-    if (!doccy) {
-        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
-    }
-}
-
-module.exports = doccy;
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"min-document":4}],17:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
-  var e, m
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var nBits = -7
-  var i = isLE ? (nBytes - 1) : 0
-  var d = isLE ? -1 : 1
-  var s = buffer[offset + i]
-
-  i += d
-
-  e = s & ((1 << (-nBits)) - 1)
-  s >>= (-nBits)
-  nBits += eLen
-  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  m = e & ((1 << (-nBits)) - 1)
-  e >>= (-nBits)
-  nBits += mLen
-  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  if (e === 0) {
-    e = 1 - eBias
-  } else if (e === eMax) {
-    return m ? NaN : ((s ? -1 : 1) * Infinity)
-  } else {
-    m = m + Math.pow(2, mLen)
-    e = e - eBias
-  }
-  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
-  var e, m, c
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
-  var i = isLE ? 0 : (nBytes - 1)
-  var d = isLE ? 1 : -1
-  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
-  value = Math.abs(value)
-
-  if (isNaN(value) || value === Infinity) {
-    m = isNaN(value) ? 1 : 0
-    e = eMax
-  } else {
-    e = Math.floor(Math.log(value) / Math.LN2)
-    if (value * (c = Math.pow(2, -e)) < 1) {
-      e--
-      c *= 2
-    }
-    if (e + eBias >= 1) {
-      value += rt / c
-    } else {
-      value += rt * Math.pow(2, 1 - eBias)
-    }
-    if (value * c >= 2) {
-      e++
-      c /= 2
-    }
-
-    if (e + eBias >= eMax) {
-      m = 0
-      e = eMax
-    } else if (e + eBias >= 1) {
-      m = (value * c - 1) * Math.pow(2, mLen)
-      e = e + eBias
-    } else {
-      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
-      e = 0
-    }
-  }
-
-  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-  e = (e << mLen) | m
-  eLen += mLen
-  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-  buffer[offset + i - d] |= s * 128
-}
-
-},{}],18:[function(require,module,exports){
-(function (global){
-'use strict';
-
-/*global window, global*/
-
-var root = typeof window !== 'undefined' ?
-    window : typeof global !== 'undefined' ?
-    global : {};
-
-module.exports = Individual;
-
-function Individual(key, value) {
-    if (key in root) {
-        return root[key];
-    }
-
-    root[key] = value;
-
-    return value;
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],19:[function(require,module,exports){
-'use strict';
-
-var Individual = require('./index.js');
-
-module.exports = OneVersion;
-
-function OneVersion(moduleName, version, defaultValue) {
-    var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName;
-    var enforceKey = key + '_ENFORCE_SINGLETON';
-
-    var versionValue = Individual(enforceKey, version);
-
-    if (versionValue !== version) {
-        throw new Error('Can only have one copy of ' +
-            moduleName + '.\n' +
-            'You already have version ' + versionValue +
-            ' installed.\n' +
-            'This means you cannot install version ' + version);
-    }
-
-    return Individual(key, defaultValue);
-}
-
-},{"./index.js":18}],20:[function(require,module,exports){
-"use strict";
-
-module.exports = function isObject(x) {
-       return typeof x === "object" && x !== null;
-};
-
-},{}],21:[function(require,module,exports){
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-/* Geohash encoding/decoding and associated functions   (c) Chris Veness 2014-2016 / MIT Licence  */
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-
-'use strict';
-
-
-/**
- * Geohash encode, decode, bounds, neighbours.
- *
- * @namespace
- */
-var Geohash = {};
-
-/* (Geohash-specific) Base32 map */
-Geohash.base32 = '0123456789bcdefghjkmnpqrstuvwxyz';
-
-/**
- * Encodes latitude/longitude to geohash, either to specified precision or to automatically
- * evaluated precision.
- *
- * @param   {number} lat - Latitude in degrees.
- * @param   {number} lon - Longitude in degrees.
- * @param   {number} [precision] - Number of characters in resulting geohash.
- * @returns {string} Geohash of supplied latitude/longitude.
- * @throws  Invalid geohash.
- *
- * @example
- *     var geohash = Geohash.encode(52.205, 0.119, 7); // geohash: 'u120fxw'
- */
-Geohash.encode = function(lat, lon, precision) {
-    // infer precision?
-    if (typeof precision == 'undefined') {
-        // refine geohash until it matches precision of supplied lat/lon
-        for (var p=1; p<=12; p++) {
-            var hash = Geohash.encode(lat, lon, p);
-            var posn = Geohash.decode(hash);
-            if (posn.lat==lat && posn.lon==lon) return hash;
-        }
-        precision = 12; // set to maximum
-    }
-
-    lat = Number(lat);
-    lon = Number(lon);
-    precision = Number(precision);
-
-    if (isNaN(lat) || isNaN(lon) || isNaN(precision)) throw new Error('Invalid geohash');
-
-    var idx = 0; // index into base32 map
-    var bit = 0; // each char holds 5 bits
-    var evenBit = true;
-    var geohash = '';
-
-    var latMin =  -90, latMax =  90;
-    var lonMin = -180, lonMax = 180;
-
-    while (geohash.length < precision) {
-        if (evenBit) {
-            // bisect E-W longitude
-            var lonMid = (lonMin + lonMax) / 2;
-            if (lon >= lonMid) {
-                idx = idx*2 + 1;
-                lonMin = lonMid;
-            } else {
-                idx = idx*2;
-                lonMax = lonMid;
-            }
-        } else {
-            // bisect N-S latitude
-            var latMid = (latMin + latMax) / 2;
-            if (lat >= latMid) {
-                idx = idx*2 + 1;
-                latMin = latMid;
-            } else {
-                idx = idx*2;
-                latMax = latMid;
-            }
-        }
-        evenBit = !evenBit;
-
-        if (++bit == 5) {
-            // 5 bits gives us a character: append it and start over
-            geohash += Geohash.base32.charAt(idx);
-            bit = 0;
-            idx = 0;
-        }
-    }
-
-    return geohash;
-};
-
-
-/**
- * Decode geohash to latitude/longitude (location is approximate centre of geohash cell,
- *     to reasonable precision).
- *
- * @param   {string} geohash - Geohash string to be converted to latitude/longitude.
- * @returns {{lat:number, lon:number}} (Center of) geohashed location.
- * @throws  Invalid geohash.
- *
- * @example
- *     var latlon = Geohash.decode('u120fxw'); // latlon: { lat: 52.205, lon: 0.1188 }
- */
-Geohash.decode = function(geohash) {
-
-    var bounds = Geohash.bounds(geohash); // <-- the hard work
-    // now just determine the centre of the cell...
-
-    var latMin = bounds.sw.lat, lonMin = bounds.sw.lon;
-    var latMax = bounds.ne.lat, lonMax = bounds.ne.lon;
-
-    // cell centre
-    var lat = (latMin + latMax)/2;
-    var lon = (lonMin + lonMax)/2;
-
-    // round to close to centre without excessive precision: âŒŠ2-log10(Δ°)⌋ decimal places
-    lat = lat.toFixed(Math.floor(2-Math.log(latMax-latMin)/Math.LN10));
-    lon = lon.toFixed(Math.floor(2-Math.log(lonMax-lonMin)/Math.LN10));
-
-    return { lat: Number(lat), lon: Number(lon) };
-};
-
-
-/**
- * Returns SW/NE latitude/longitude bounds of specified geohash.
- *
- * @param   {string} geohash - Cell that bounds are required of.
- * @returns {{sw: {lat: number, lon: number}, ne: {lat: number, lon: number}}}
- * @throws  Invalid geohash.
- */
-Geohash.bounds = function(geohash) {
-    if (geohash.length === 0) throw new Error('Invalid geohash');
-
-    geohash = geohash.toLowerCase();
-
-    var evenBit = true;
-    var latMin =  -90, latMax =  90;
-    var lonMin = -180, lonMax = 180;
-
-    for (var i=0; i<geohash.length; i++) {
-        var chr = geohash.charAt(i);
-        var idx = Geohash.base32.indexOf(chr);
-        if (idx == -1) throw new Error('Invalid geohash');
-
-        for (var n=4; n>=0; n--) {
-            var bitN = idx >> n & 1;
-            if (evenBit) {
-                // longitude
-                var lonMid = (lonMin+lonMax) / 2;
-                if (bitN == 1) {
-                    lonMin = lonMid;
-                } else {
-                    lonMax = lonMid;
-                }
-            } else {
-                // latitude
-                var latMid = (latMin+latMax) / 2;
-                if (bitN == 1) {
-                    latMin = latMid;
-                } else {
-                    latMax = latMid;
-                }
-            }
-            evenBit = !evenBit;
-        }
-    }
-
-    var bounds = {
-        sw: { lat: latMin, lon: lonMin },
-        ne: { lat: latMax, lon: lonMax },
-    };
-
-    return bounds;
-};
-
-
-/**
- * Determines adjacent cell in given direction.
- *
- * @param   geohash - Cell to which adjacent cell is required.
- * @param   direction - Direction from geohash (N/S/E/W).
- * @returns {string} Geocode of adjacent cell.
- * @throws  Invalid geohash.
- */
-Geohash.adjacent = function(geohash, direction) {
-    // based on github.com/davetroy/geohash-js
-
-    geohash = geohash.toLowerCase();
-    direction = direction.toLowerCase();
-
-    if (geohash.length === 0) throw new Error('Invalid geohash');
-    if ('nsew'.indexOf(direction) == -1) throw new Error('Invalid direction');
-
-    var neighbour = {
-        n: [ 'p0r21436x8zb9dcf5h7kjnmqesgutwvy', 'bc01fg45238967deuvhjyznpkmstqrwx' ],
-        s: [ '14365h7k9dcfesgujnmqp0r2twvyx8zb', '238967debc01fg45kmstqrwxuvhjyznp' ],
-        e: [ 'bc01fg45238967deuvhjyznpkmstqrwx', 'p0r21436x8zb9dcf5h7kjnmqesgutwvy' ],
-        w: [ '238967debc01fg45kmstqrwxuvhjyznp', '14365h7k9dcfesgujnmqp0r2twvyx8zb' ],
-    };
-    var border = {
-        n: [ 'prxz',     'bcfguvyz' ],
-        s: [ '028b',     '0145hjnp' ],
-        e: [ 'bcfguvyz', 'prxz'     ],
-        w: [ '0145hjnp', '028b'     ],
-    };
-
-    var lastCh = geohash.slice(-1);    // last character of hash
-    var parent = geohash.slice(0, -1); // hash without last character
-
-    var type = geohash.length % 2;
-
-    // check for edge-cases which don't share common prefix
-    if (border[direction][type].indexOf(lastCh) != -1 && parent !== '') {
-        parent = Geohash.adjacent(parent, direction);
-    }
-
-    // append letter for direction to parent
-    return parent + Geohash.base32.charAt(neighbour[direction][type].indexOf(lastCh));
-};
-
-
-/**
- * Returns all 8 adjacent cells to specified geohash.
- *
- * @param   {string} geohash - Geohash neighbours are required of.
- * @returns {{n,ne,e,se,s,sw,w,nw: string}}
- * @throws  Invalid geohash.
- */
-Geohash.neighbours = function(geohash) {
-    return {
-        'n':  Geohash.adjacent(geohash, 'n'),
-        'ne': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'e'),
-        'e':  Geohash.adjacent(geohash, 'e'),
-        'se': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'e'),
-        's':  Geohash.adjacent(geohash, 's'),
-        'sw': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'w'),
-        'w':  Geohash.adjacent(geohash, 'w'),
-        'nw': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'w'),
-    };
-};
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-if (typeof module != 'undefined' && module.exports) module.exports = Geohash; // CommonJS, node.js
-
-},{}],22:[function(require,module,exports){
-/**
- * martinez v0.7.0
- * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
- *
- * @author Alex Milevski <info@w8r.name>
- * @license MIT
- * @preserve
- */
-
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (global = global || self, factory(global.martinez = {}));
-}(this, (function (exports) { 'use strict';
-
-  function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
-
-  var SplayTree = function SplayTree(compare, noDuplicates) {
-    if ( compare === void 0 ) compare = DEFAULT_COMPARE;
-    if ( noDuplicates === void 0 ) noDuplicates = false;
-
-    this._compare = compare;
-    this._root = null;
-    this._size = 0;
-    this._noDuplicates = !!noDuplicates;
-  };
-
-  var prototypeAccessors = { size: { configurable: true } };
-
-
-  SplayTree.prototype.rotateLeft = function rotateLeft (x) {
-    var y = x.right;
-    if (y) {
-      x.right = y.left;
-      if (y.left) { y.left.parent = x; }
-      y.parent = x.parent;
-    }
-
-    if (!x.parent)              { this._root = y; }
-    else if (x === x.parent.left) { x.parent.left = y; }
-    else                        { x.parent.right = y; }
-    if (y) { y.left = x; }
-    x.parent = y;
-  };
-
-
-  SplayTree.prototype.rotateRight = function rotateRight (x) {
-    var y = x.left;
-    if (y) {
-      x.left = y.right;
-      if (y.right) { y.right.parent = x; }
-      y.parent = x.parent;
-    }
-
-    if (!x.parent)             { this._root = y; }
-    else if(x === x.parent.left) { x.parent.left = y; }
-    else                       { x.parent.right = y; }
-    if (y) { y.right = x; }
-    x.parent = y;
-  };
-
-
-  SplayTree.prototype._splay = function _splay (x) {
-    while (x.parent) {
-      var p = x.parent;
-      if (!p.parent) {
-        if (p.left === x) { this.rotateRight(p); }
-        else            { this.rotateLeft(p); }
-      } else if (p.left === x && p.parent.left === p) {
-        this.rotateRight(p.parent);
-        this.rotateRight(p);
-      } else if (p.right === x && p.parent.right === p) {
-        this.rotateLeft(p.parent);
-        this.rotateLeft(p);
-      } else if (p.left === x && p.parent.right === p) {
-        this.rotateRight(p);
-        this.rotateLeft(p);
-      } else {
-        this.rotateLeft(p);
-        this.rotateRight(p);
-      }
-    }
-  };
-
-
-  SplayTree.prototype.splay = function splay (x) {
-    var p, gp, ggp, l, r;
-
-    while (x.parent) {
-      p = x.parent;
-      gp = p.parent;
-
-      if (gp && gp.parent) {
-        ggp = gp.parent;
-        if (ggp.left === gp) { ggp.left= x; }
-        else               { ggp.right = x; }
-        x.parent = ggp;
-      } else {
-        x.parent = null;
-        this._root = x;
-      }
-
-      l = x.left; r = x.right;
-
-      if (x === p.left) { // left
-        if (gp) {
-          if (gp.left === p) {
-            /* zig-zig */
-            if (p.right) {
-              gp.left = p.right;
-              gp.left.parent = gp;
-            } else { gp.left = null; }
-
-            p.right = gp;
-            gp.parent = p;
-          } else {
-            /* zig-zag */
-            if (l) {
-              gp.right = l;
-              l.parent = gp;
-            } else { gp.right = null; }
-
-            x.left  = gp;
-            gp.parent = x;
-          }
-        }
-        if (r) {
-          p.left = r;
-          r.parent = p;
-        } else { p.left = null; }
-
-        x.right= p;
-        p.parent = x;
-      } else { // right
-        if (gp) {
-          if (gp.right === p) {
-            /* zig-zig */
-            if (p.left) {
-              gp.right = p.left;
-              gp.right.parent = gp;
-            } else { gp.right = null; }
-
-            p.left = gp;
-            gp.parent = p;
-          } else {
-            /* zig-zag */
-            if (r) {
-              gp.left = r;
-              r.parent = gp;
-            } else { gp.left = null; }
-
-            x.right = gp;
-            gp.parent = x;
-          }
-        }
-        if (l) {
-          p.right = l;
-          l.parent = p;
-        } else { p.right = null; }
-
-        x.left = p;
-        p.parent = x;
-      }
-    }
-  };
-
-
-  SplayTree.prototype.replace = function replace (u, v) {
-    if (!u.parent) { this._root = v; }
-    else if (u === u.parent.left) { u.parent.left = v; }
-    else { u.parent.right = v; }
-    if (v) { v.parent = u.parent; }
-  };
-
-
-  SplayTree.prototype.minNode = function minNode (u) {
-      if ( u === void 0 ) u = this._root;
-
-    if (u) { while (u.left) { u = u.left; } }
-    return u;
-  };
-
-
-  SplayTree.prototype.maxNode = function maxNode (u) {
-      if ( u === void 0 ) u = this._root;
-
-    if (u) { while (u.right) { u = u.right; } }
-    return u;
-  };
-
-
-  SplayTree.prototype.insert = function insert (key, data) {
-    var z = this._root;
-    var p = null;
-    var comp = this._compare;
-    var cmp;
-
-    if (this._noDuplicates) {
-      while (z) {
-        p = z;
-        cmp = comp(z.key, key);
-        if (cmp === 0) { return; }
-        else if (comp(z.key, key) < 0) { z = z.right; }
-        else { z = z.left; }
-      }
-    } else {
-      while (z) {
-        p = z;
-        if (comp(z.key, key) < 0) { z = z.right; }
-        else { z = z.left; }
-      }
-    }
-
-    z = { key: key, data: data, left: null, right: null, parent: p };
-
-    if (!p)                        { this._root = z; }
-    else if (comp(p.key, z.key) < 0) { p.right = z; }
-    else                           { p.left= z; }
-
-    this.splay(z);
-    this._size++;
-    return z;
-  };
-
-
-  SplayTree.prototype.find = function find (key) {
-    var z  = this._root;
-    var comp = this._compare;
-    while (z) {
-      var cmp = comp(z.key, key);
-      if    (cmp < 0) { z = z.right; }
-      else if (cmp > 0) { z = z.left; }
-      else            { return z; }
-    }
-    return null;
-  };
-
-  /**
-   * Whether the tree contains a node with the given key
-   * @param{Key} key
-   * @return {boolean} true/false
-   */
-  SplayTree.prototype.contains = function contains (key) {
-    var node     = this._root;
-    var comparator = this._compare;
-    while (node){
-      var cmp = comparator(key, node.key);
-      if    (cmp === 0) { return true; }
-      else if (cmp < 0) { node = node.left; }
-      else              { node = node.right; }
-    }
-
-    return false;
-  };
-
-
-  SplayTree.prototype.remove = function remove (key) {
-    var z = this.find(key);
-
-    if (!z) { return false; }
-
-    this.splay(z);
-
-    if (!z.left) { this.replace(z, z.right); }
-    else if (!z.right) { this.replace(z, z.left); }
-    else {
-      var y = this.minNode(z.right);
-      if (y.parent !== z) {
-        this.replace(y, y.right);
-        y.right = z.right;
-        y.right.parent = y;
-      }
-      this.replace(z, y);
-      y.left = z.left;
-      y.left.parent = y;
-    }
-
-    this._size--;
-    return true;
-  };
-
-
-  SplayTree.prototype.removeNode = function removeNode (z) {
-    if (!z) { return false; }
-
-    this.splay(z);
-
-    if (!z.left) { this.replace(z, z.right); }
-    else if (!z.right) { this.replace(z, z.left); }
-    else {
-      var y = this.minNode(z.right);
-      if (y.parent !== z) {
-        this.replace(y, y.right);
-        y.right = z.right;
-        y.right.parent = y;
-      }
-      this.replace(z, y);
-      y.left = z.left;
-      y.left.parent = y;
-    }
-
-    this._size--;
-    return true;
-  };
-
-
-  SplayTree.prototype.erase = function erase (key) {
-    var z = this.find(key);
-    if (!z) { return; }
-
-    this.splay(z);
-
-    var s = z.left;
-    var t = z.right;
-
-    var sMax = null;
-    if (s) {
-      s.parent = null;
-      sMax = this.maxNode(s);
-      this.splay(sMax);
-      this._root = sMax;
-    }
-    if (t) {
-      if (s) { sMax.right = t; }
-      else { this._root = t; }
-      t.parent = sMax;
-    }
-
-    this._size--;
-  };
-
-  /**
-   * Removes and returns the node with smallest key
-   * @return {?Node}
-   */
-  SplayTree.prototype.pop = function pop () {
-    var node = this._root, returnValue = null;
-    if (node) {
-      while (node.left) { node = node.left; }
-      returnValue = { key: node.key, data: node.data };
-      this.remove(node.key);
-    }
-    return returnValue;
-  };
-
-
-  /* eslint-disable class-methods-use-this */
-
-  /**
-   * Successor node
-   * @param{Node} node
-   * @return {?Node}
-   */
-  SplayTree.prototype.next = function next (node) {
-    var successor = node;
-    if (successor) {
-      if (successor.right) {
-        successor = successor.right;
-        while (successor && successor.left) { successor = successor.left; }
-      } else {
-        successor = node.parent;
-        while (successor && successor.right === node) {
-          node = successor; successor = successor.parent;
-        }
-      }
-    }
-    return successor;
-  };
-
-
-  /**
-   * Predecessor node
-   * @param{Node} node
-   * @return {?Node}
-   */
-  SplayTree.prototype.prev = function prev (node) {
-    var predecessor = node;
-    if (predecessor) {
-      if (predecessor.left) {
-        predecessor = predecessor.left;
-        while (predecessor && predecessor.right) { predecessor = predecessor.right; }
-      } else {
-        predecessor = node.parent;
-        while (predecessor && predecessor.left === node) {
-          node = predecessor;
-          predecessor = predecessor.parent;
-        }
-      }
-    }
-    return predecessor;
-  };
-  /* eslint-enable class-methods-use-this */
-
-
-  /**
-   * @param{forEachCallback} callback
-   * @return {SplayTree}
-   */
-  SplayTree.prototype.forEach = function forEach (callback) {
-    var current = this._root;
-    var s = [], done = false, i = 0;
-
-    while (!done) {
-      // Reach the left most Node of the current Node
-      if (current) {
-        // Place pointer to a tree node on the stack
-        // before traversing the node's left subtree
-        s.push(current);
-        current = current.left;
-      } else {
-        // BackTrack from the empty subtree and visit the Node
-        // at the top of the stack; however, if the stack is
-        // empty you are done
-        if (s.length > 0) {
-          current = s.pop();
-          callback(current, i++);
-
-          // We have visited the node and its left
-          // subtree. Now, it's right subtree's turn
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return this;
-  };
-
-
-  /**
-   * Walk key range from `low` to `high`. Stops if `fn` returns a value.
-   * @param{Key}    low
-   * @param{Key}    high
-   * @param{Function} fn
-   * @param{*?}     ctx
-   * @return {SplayTree}
-   */
-  SplayTree.prototype.range = function range (low, high, fn, ctx) {
-    var Q = [];
-    var compare = this._compare;
-    var node = this._root, cmp;
-
-    while (Q.length !== 0 || node) {
-      if (node) {
-        Q.push(node);
-        node = node.left;
-      } else {
-        node = Q.pop();
-        cmp = compare(node.key, high);
-        if (cmp > 0) {
-          break;
-        } else if (compare(node.key, low) >= 0) {
-          if (fn.call(ctx, node)) { return this; } // stop if smth is returned
-        }
-        node = node.right;
-      }
-    }
-    return this;
-  };
-
-  /**
-   * Returns all keys in order
-   * @return {Array<Key>}
-   */
-  SplayTree.prototype.keys = function keys () {
-    var current = this._root;
-    var s = [], r = [], done = false;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          r.push(current.key);
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return r;
-  };
-
-
-  /**
-   * Returns `data` fields of all nodes in order.
-   * @return {Array<Value>}
-   */
-  SplayTree.prototype.values = function values () {
-    var current = this._root;
-    var s = [], r = [], done = false;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          r.push(current.data);
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return r;
-  };
-
-
-  /**
-   * Returns node at given index
-   * @param{number} index
-   * @return {?Node}
-   */
-  SplayTree.prototype.at = function at (index) {
-    // removed after a consideration, more misleading than useful
-    // index = index % this.size;
-    // if (index < 0) index = this.size - index;
-
-    var current = this._root;
-    var s = [], done = false, i = 0;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          if (i === index) { return current; }
-          i++;
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return null;
-  };
-
-  /**
-   * Bulk-load items. Both array have to be same size
-   * @param{Array<Key>}  keys
-   * @param{Array<Value>}[values]
-   * @param{Boolean}     [presort=false] Pre-sort keys and values, using
-   *                                       tree's comparator. Sorting is done
-   *                                       in-place
-   * @return {AVLTree}
-   */
-  SplayTree.prototype.load = function load (keys, values, presort) {
-      if ( keys === void 0 ) keys = [];
-      if ( values === void 0 ) values = [];
-      if ( presort === void 0 ) presort = false;
-
-    if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
-    var size = keys.length;
-    if (presort) { sort(keys, values, 0, size - 1, this._compare); }
-    this._root = loadRecursive(null, keys, values, 0, size);
-    this._size = size;
-    return this;
-  };
-
-
-  SplayTree.prototype.min = function min () {
-    var node = this.minNode(this._root);
-    if (node) { return node.key; }
-    else    { return null; }
-  };
-
-
-  SplayTree.prototype.max = function max () {
-    var node = this.maxNode(this._root);
-    if (node) { return node.key; }
-    else    { return null; }
-  };
-
-  SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
-  prototypeAccessors.size.get = function () { return this._size; };
-
-
-  /**
-   * Create a tree and load it with items
-   * @param{Array<Key>}        keys
-   * @param{Array<Value>?}      [values]
-
-   * @param{Function?}          [comparator]
-   * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
-   *                                             tree's comparator. Sorting is done
-   *                                             in-place
-   * @param{Boolean?}           [noDuplicates=false] Allow duplicates
-   * @return {SplayTree}
-   */
-  SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
-    return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
-  };
-
-  Object.defineProperties( SplayTree.prototype, prototypeAccessors );
-
-
-  function loadRecursive (parent, keys, values, start, end) {
-    var size = end - start;
-    if (size > 0) {
-      var middle = start + Math.floor(size / 2);
-      var key    = keys[middle];
-      var data   = values[middle];
-      var node   = { key: key, data: data, parent: parent };
-      node.left    = loadRecursive(node, keys, values, start, middle);
-      node.right   = loadRecursive(node, keys, values, middle + 1, end);
-      return node;
-    }
-    return null;
-  }
-
-
-  function sort(keys, values, left, right, compare) {
-    if (left >= right) { return; }
-
-    var pivot = keys[(left + right) >> 1];
-    var i = left - 1;
-    var j = right + 1;
-
-    while (true) {
-      do { i++; } while (compare(keys[i], pivot) < 0);
-      do { j--; } while (compare(keys[j], pivot) > 0);
-      if (i >= j) { break; }
-
-      var tmp = keys[i];
-      keys[i] = keys[j];
-      keys[j] = tmp;
-
-      tmp = values[i];
-      values[i] = values[j];
-      values[j] = tmp;
-    }
-
-    sort(keys, values,  left,     j, compare);
-    sort(keys, values, j + 1, right, compare);
-  }
-
-  var NORMAL               = 0;
-  var NON_CONTRIBUTING     = 1;
-  var SAME_TRANSITION      = 2;
-  var DIFFERENT_TRANSITION = 3;
-
-  var INTERSECTION = 0;
-  var UNION        = 1;
-  var DIFFERENCE   = 2;
-  var XOR          = 3;
-
-  /**
-   * @param  {SweepEvent} event
-   * @param  {SweepEvent} prev
-   * @param  {Operation} operation
-   */
-  function computeFields (event, prev, operation) {
-    // compute inOut and otherInOut fields
-    if (prev === null) {
-      event.inOut      = false;
-      event.otherInOut = true;
-
-    // previous line segment in sweepline belongs to the same polygon
-    } else {
-      if (event.isSubject === prev.isSubject) {
-        event.inOut      = !prev.inOut;
-        event.otherInOut = prev.otherInOut;
-
-      // previous line segment in sweepline belongs to the clipping polygon
-      } else {
-        event.inOut      = !prev.otherInOut;
-        event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
-      }
-
-      // compute prevInResult field
-      if (prev) {
-        event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
-          ? prev.prevInResult : prev;
-      }
-    }
-
-    // check if the line segment belongs to the Boolean operation
-    var isInResult = inResult(event, operation);
-    if (isInResult) {
-      event.resultTransition = determineResultTransition(event, operation);
-    } else {
-      event.resultTransition = 0;
-    }
-  }
-
-
-  /* eslint-disable indent */
-  function inResult(event, operation) {
-    switch (event.type) {
-      case NORMAL:
-        switch (operation) {
-          case INTERSECTION:
-            return !event.otherInOut;
-          case UNION:
-            return event.otherInOut;
-          case DIFFERENCE:
-            // return (event.isSubject && !event.otherInOut) ||
-            //         (!event.isSubject && event.otherInOut);
-            return (event.isSubject && event.otherInOut) ||
-                    (!event.isSubject && !event.otherInOut);
-          case XOR:
-            return true;
-        }
-        break;
-      case SAME_TRANSITION:
-        return operation === INTERSECTION || operation === UNION;
-      case DIFFERENT_TRANSITION:
-        return operation === DIFFERENCE;
-      case NON_CONTRIBUTING:
-        return false;
-    }
-    return false;
-  }
-  /* eslint-enable indent */
-
-
-  function determineResultTransition(event, operation) {
-    var thisIn = !event.inOut;
-    var thatIn = !event.otherInOut;
-
-    var isIn;
-    switch (operation) {
-      case INTERSECTION:
-        isIn = thisIn && thatIn; break;
-      case UNION:
-        isIn = thisIn || thatIn; break;
-      case XOR:
-        isIn = thisIn ^ thatIn; break;
-      case DIFFERENCE:
-        if (event.isSubject) {
-          isIn = thisIn && !thatIn;
-        } else {
-          isIn = thatIn && !thisIn;
-        }
-        break;
-    }
-    return isIn ? +1 : -1;
-  }
-
-  var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
-
-    /**
-     * Is left endpoint?
-     * @type {Boolean}
-     */
-    this.left = left;
-
-    /**
-     * @type {Array.<Number>}
-     */
-    this.point = point;
-
-    /**
-     * Other edge reference
-     * @type {SweepEvent}
-     */
-    this.otherEvent = otherEvent;
-
-    /**
-     * Belongs to source or clipping polygon
-     * @type {Boolean}
-     */
-    this.isSubject = isSubject;
-
-    /**
-     * Edge contribution type
-     * @type {Number}
-     */
-    this.type = edgeType || NORMAL;
-
-
-    /**
-     * In-out transition for the sweepline crossing polygon
-     * @type {Boolean}
-     */
-    this.inOut = false;
-
-
-    /**
-     * @type {Boolean}
-     */
-    this.otherInOut = false;
-
-    /**
-     * Previous event in result?
-     * @type {SweepEvent}
-     */
-    this.prevInResult = null;
-
-    /**
-     * Type of result transition (0 = not in result, +1 = out-in, -1, in-out)
-     * @type {Number}
-     */
-    this.resultTransition = 0;
-
-    // connection step
-
-    /**
-     * @type {Number}
-     */
-    this.otherPos = -1;
-
-    /**
-     * @type {Number}
-     */
-    this.outputContourId = -1;
-
-    this.isExteriorRing = true; // TODO: Looks unused, remove?
-  };
-
-  var prototypeAccessors$1 = { inResult: { configurable: true } };
-
-
-  /**
-   * @param{Array.<Number>}p
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isBelow = function isBelow (p) {
-    var p0 = this.point, p1 = this.otherEvent.point;
-    return this.left
-      ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
-      // signedArea(this.point, this.otherEvent.point, p) > 0 :
-      : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
-      //signedArea(this.otherEvent.point, this.point, p) > 0;
-  };
-
-
-  /**
-   * @param{Array.<Number>}p
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isAbove = function isAbove (p) {
-    return !this.isBelow(p);
-  };
-
-
-  /**
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isVertical = function isVertical () {
-    return this.point[0] === this.otherEvent.point[0];
-  };
-
-
-  /**
-   * Does event belong to result?
-   * @return {Boolean}
-   */
-  prototypeAccessors$1.inResult.get = function () {
-    return this.resultTransition !== 0;
-  };
-
-
-  SweepEvent.prototype.clone = function clone () {
-    var copy = new SweepEvent(
-      this.point, this.left, this.otherEvent, this.isSubject, this.type);
-
-    copy.contourId      = this.contourId;
-    copy.resultTransition = this.resultTransition;
-    copy.prevInResult   = this.prevInResult;
-    copy.isExteriorRing = this.isExteriorRing;
-    copy.inOut          = this.inOut;
-    copy.otherInOut     = this.otherInOut;
-
-    return copy;
-  };
-
-  Object.defineProperties( SweepEvent.prototype, prototypeAccessors$1 );
-
-  function equals(p1, p2) {
-    if (p1[0] === p2[0]) {
-      if (p1[1] === p2[1]) {
-        return true;
-      } else {
-        return false;
-      }
-    }
-    return false;
-  }
-
-  // const EPSILON = 1e-9;
-  // const abs = Math.abs;
-  // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
-  // Precision problem.
-  //
-  // module.exports = function equals(p1, p2) {
-  //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
-  // };
-
-  var epsilon = 1.1102230246251565e-16;
-  var splitter = 134217729;
-  var resulterrbound = (3 + 8 * epsilon) * epsilon;
-
-  // fast_expansion_sum_zeroelim routine from oritinal code
-  function sum(elen, e, flen, f, h) {
-      var Q, Qnew, hh, bvirt;
-      var enow = e[0];
-      var fnow = f[0];
-      var eindex = 0;
-      var findex = 0;
-      if ((fnow > enow) === (fnow > -enow)) {
-          Q = enow;
-          enow = e[++eindex];
-      } else {
-          Q = fnow;
-          fnow = f[++findex];
-      }
-      var hindex = 0;
-      if (eindex < elen && findex < flen) {
-          if ((fnow > enow) === (fnow > -enow)) {
-              Qnew = enow + Q;
-              hh = Q - (Qnew - enow);
-              enow = e[++eindex];
-          } else {
-              Qnew = fnow + Q;
-              hh = Q - (Qnew - fnow);
-              fnow = f[++findex];
-          }
-          Q = Qnew;
-          if (hh !== 0) {
-              h[hindex++] = hh;
-          }
-          while (eindex < elen && findex < flen) {
-              if ((fnow > enow) === (fnow > -enow)) {
-                  Qnew = Q + enow;
-                  bvirt = Qnew - Q;
-                  hh = Q - (Qnew - bvirt) + (enow - bvirt);
-                  enow = e[++eindex];
-              } else {
-                  Qnew = Q + fnow;
-                  bvirt = Qnew - Q;
-                  hh = Q - (Qnew - bvirt) + (fnow - bvirt);
-                  fnow = f[++findex];
-              }
-              Q = Qnew;
-              if (hh !== 0) {
-                  h[hindex++] = hh;
-              }
-          }
-      }
-      while (eindex < elen) {
-          Qnew = Q + enow;
-          bvirt = Qnew - Q;
-          hh = Q - (Qnew - bvirt) + (enow - bvirt);
-          enow = e[++eindex];
-          Q = Qnew;
-          if (hh !== 0) {
-              h[hindex++] = hh;
-          }
-      }
-      while (findex < flen) {
-          Qnew = Q + fnow;
-          bvirt = Qnew - Q;
-          hh = Q - (Qnew - bvirt) + (fnow - bvirt);
-          fnow = f[++findex];
-          Q = Qnew;
-          if (hh !== 0) {
-              h[hindex++] = hh;
-          }
-      }
-      if (Q !== 0 || hindex === 0) {
-          h[hindex++] = Q;
-      }
-      return hindex;
-  }
-
-  function estimate(elen, e) {
-      var Q = e[0];
-      for (var i = 1; i < elen; i++) { Q += e[i]; }
-      return Q;
-  }
-
-  function vec(n) {
-      return new Float64Array(n);
-  }
-
-  var ccwerrboundA = (3 + 16 * epsilon) * epsilon;
-  var ccwerrboundB = (2 + 12 * epsilon) * epsilon;
-  var ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;
-
-  var B = vec(4);
-  var C1 = vec(8);
-  var C2 = vec(12);
-  var D = vec(16);
-  var u = vec(4);
-
-  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {
-      var acxtail, acytail, bcxtail, bcytail;
-      var bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
-
-      var acx = ax - cx;
-      var bcx = bx - cx;
-      var acy = ay - cy;
-      var bcy = by - cy;
-
-      s1 = acx * bcy;
-      c = splitter * acx;
-      ahi = c - (c - acx);
-      alo = acx - ahi;
-      c = splitter * bcy;
-      bhi = c - (c - bcy);
-      blo = bcy - bhi;
-      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
-      t1 = acy * bcx;
-      c = splitter * acy;
-      ahi = c - (c - acy);
-      alo = acy - ahi;
-      c = splitter * bcx;
-      bhi = c - (c - bcx);
-      blo = bcx - bhi;
-      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
-      _i = s0 - t0;
-      bvirt = s0 - _i;
-      B[0] = s0 - (_i + bvirt) + (bvirt - t0);
-      _j = s1 + _i;
-      bvirt = _j - s1;
-      _0 = s1 - (_j - bvirt) + (_i - bvirt);
-      _i = _0 - t1;
-      bvirt = _0 - _i;
-      B[1] = _0 - (_i + bvirt) + (bvirt - t1);
-      u3 = _j + _i;
-      bvirt = u3 - _j;
-      B[2] = _j - (u3 - bvirt) + (_i - bvirt);
-      B[3] = u3;
-
-      var det = estimate(4, B);
-      var errbound = ccwerrboundB * detsum;
-      if (det >= errbound || -det >= errbound) {
-          return det;
-      }
-
-      bvirt = ax - acx;
-      acxtail = ax - (acx + bvirt) + (bvirt - cx);
-      bvirt = bx - bcx;
-      bcxtail = bx - (bcx + bvirt) + (bvirt - cx);
-      bvirt = ay - acy;
-      acytail = ay - (acy + bvirt) + (bvirt - cy);
-      bvirt = by - bcy;
-      bcytail = by - (bcy + bvirt) + (bvirt - cy);
-
-      if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {
-          return det;
-      }
-
-      errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
-      det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
-      if (det >= errbound || -det >= errbound) { return det; }
-
-      s1 = acxtail * bcy;
-      c = splitter * acxtail;
-      ahi = c - (c - acxtail);
-      alo = acxtail - ahi;
-      c = splitter * bcy;
-      bhi = c - (c - bcy);
-      blo = bcy - bhi;
-      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
-      t1 = acytail * bcx;
-      c = splitter * acytail;
-      ahi = c - (c - acytail);
-      alo = acytail - ahi;
-      c = splitter * bcx;
-      bhi = c - (c - bcx);
-      blo = bcx - bhi;
-      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
-      _i = s0 - t0;
-      bvirt = s0 - _i;
-      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
-      _j = s1 + _i;
-      bvirt = _j - s1;
-      _0 = s1 - (_j - bvirt) + (_i - bvirt);
-      _i = _0 - t1;
-      bvirt = _0 - _i;
-      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
-      u3 = _j + _i;
-      bvirt = u3 - _j;
-      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
-      u[3] = u3;
-      var C1len = sum(4, B, 4, u, C1);
-
-      s1 = acx * bcytail;
-      c = splitter * acx;
-      ahi = c - (c - acx);
-      alo = acx - ahi;
-      c = splitter * bcytail;
-      bhi = c - (c - bcytail);
-      blo = bcytail - bhi;
-      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
-      t1 = acy * bcxtail;
-      c = splitter * acy;
-      ahi = c - (c - acy);
-      alo = acy - ahi;
-      c = splitter * bcxtail;
-      bhi = c - (c - bcxtail);
-      blo = bcxtail - bhi;
-      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
-      _i = s0 - t0;
-      bvirt = s0 - _i;
-      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
-      _j = s1 + _i;
-      bvirt = _j - s1;
-      _0 = s1 - (_j - bvirt) + (_i - bvirt);
-      _i = _0 - t1;
-      bvirt = _0 - _i;
-      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
-      u3 = _j + _i;
-      bvirt = u3 - _j;
-      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
-      u[3] = u3;
-      var C2len = sum(C1len, C1, 4, u, C2);
-
-      s1 = acxtail * bcytail;
-      c = splitter * acxtail;
-      ahi = c - (c - acxtail);
-      alo = acxtail - ahi;
-      c = splitter * bcytail;
-      bhi = c - (c - bcytail);
-      blo = bcytail - bhi;
-      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
-      t1 = acytail * bcxtail;
-      c = splitter * acytail;
-      ahi = c - (c - acytail);
-      alo = acytail - ahi;
-      c = splitter * bcxtail;
-      bhi = c - (c - bcxtail);
-      blo = bcxtail - bhi;
-      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
-      _i = s0 - t0;
-      bvirt = s0 - _i;
-      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
-      _j = s1 + _i;
-      bvirt = _j - s1;
-      _0 = s1 - (_j - bvirt) + (_i - bvirt);
-      _i = _0 - t1;
-      bvirt = _0 - _i;
-      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
-      u3 = _j + _i;
-      bvirt = u3 - _j;
-      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
-      u[3] = u3;
-      var Dlen = sum(C2len, C2, 4, u, D);
-
-      return D[Dlen - 1];
-  }
-
-  function orient2d(ax, ay, bx, by, cx, cy) {
-      var detleft = (ay - cy) * (bx - cx);
-      var detright = (ax - cx) * (by - cy);
-      var det = detleft - detright;
-
-      if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) { return det; }
-
-      var detsum = Math.abs(detleft + detright);
-      if (Math.abs(det) >= ccwerrboundA * detsum) { return det; }
-
-      return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
-  }
-
-  /**
-   * Signed area of the triangle (p0, p1, p2)
-   * @param  {Array.<Number>} p0
-   * @param  {Array.<Number>} p1
-   * @param  {Array.<Number>} p2
-   * @return {Number}
-   */
-  function signedArea(p0, p1, p2) {
-    var res = orient2d(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]);
-    if (res > 0) { return -1; }
-    if (res < 0) { return 1; }
-    return 0;
-  }
-
-  /**
-   * @param  {SweepEvent} e1
-   * @param  {SweepEvent} e2
-   * @return {Number}
-   */
-  function compareEvents(e1, e2) {
-    var p1 = e1.point;
-    var p2 = e2.point;
-
-    // Different x-coordinate
-    if (p1[0] > p2[0]) { return 1; }
-    if (p1[0] < p2[0]) { return -1; }
-
-    // Different points, but same x-coordinate
-    // Event with lower y-coordinate is processed first
-    if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
-
-    return specialCases(e1, e2, p1);
-  }
-
-
-  /* eslint-disable no-unused-vars */
-  function specialCases(e1, e2, p1, p2) {
-    // Same coordinates, but one is a left endpoint and the other is
-    // a right endpoint. The right endpoint is processed first
-    if (e1.left !== e2.left)
-      { return e1.left ? 1 : -1; }
-
-    // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
-    // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
-    // Same coordinates, both events
-    // are left endpoints or right endpoints.
-    // not collinear
-    if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
-      // the event associate to the bottom segment is processed first
-      return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
-    }
-
-    return (!e1.isSubject && e2.isSubject) ? 1 : -1;
-  }
-  /* eslint-enable no-unused-vars */
-
-  /**
-   * @param  {SweepEvent} se
-   * @param  {Array.<Number>} p
-   * @param  {Queue} queue
-   * @return {Queue}
-   */
-  function divideSegment(se, p, queue)  {
-    var r = new SweepEvent(p, false, se,            se.isSubject);
-    var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
-
-    /* eslint-disable no-console */
-    if (equals(se.point, se.otherEvent.point)) {
-      console.warn('what is that, a collapsed segment?', se);
-    }
-    /* eslint-enable no-console */
-
-    r.contourId = l.contourId = se.contourId;
-
-    // avoid a rounding error. The left event would be processed after the right event
-    if (compareEvents(l, se.otherEvent) > 0) {
-      se.otherEvent.left = true;
-      l.left = false;
-    }
-
-    // avoid a rounding error. The left event would be processed after the right event
-    // if (compareEvents(se, r) > 0) {}
-
-    se.otherEvent.otherEvent = l;
-    se.otherEvent = r;
-
-    queue.push(l);
-    queue.push(r);
-
-    return queue;
-  }
-
-  //const EPS = 1e-9;
-
-  /**
-   * Finds the magnitude of the cross product of two vectors (if we pretend
-   * they're in three dimensions)
-   *
-   * @param {Object} a First vector
-   * @param {Object} b Second vector
-   * @private
-   * @returns {Number} The magnitude of the cross product
-   */
-  function crossProduct(a, b) {
-    return (a[0] * b[1]) - (a[1] * b[0]);
-  }
-
-  /**
-   * Finds the dot product of two vectors.
-   *
-   * @param {Object} a First vector
-   * @param {Object} b Second vector
-   * @private
-   * @returns {Number} The dot product
-   */
-  function dotProduct(a, b) {
-    return (a[0] * b[0]) + (a[1] * b[1]);
-  }
-
-  /**
-   * Finds the intersection (if any) between two line segments a and b, given the
-   * line segments' end points a1, a2 and b1, b2.
-   *
-   * This algorithm is based on Schneider and Eberly.
-   * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
-   * Page 244.
-   *
-   * @param {Array.<Number>} a1 point of first line
-   * @param {Array.<Number>} a2 point of first line
-   * @param {Array.<Number>} b1 point of second line
-   * @param {Array.<Number>} b2 point of second line
-   * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
-   *                                         (meaning connected segments) as
-   *                                         intersections
-   * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
-   * intersection. If they overlap, the two end points of the overlapping segment.
-   * Otherwise, null.
-   */
-  function intersection (a1, a2, b1, b2, noEndpointTouch) {
-    // The algorithm expects our lines in the form P + sd, where P is a point,
-    // s is on the interval [0, 1], and d is a vector.
-    // We are passed two points. P can be the first point of each pair. The
-    // vector, then, could be thought of as the distance (in x and y components)
-    // from the first point to the second point.
-    // So first, let's make our vectors:
-    var va = [a2[0] - a1[0], a2[1] - a1[1]];
-    var vb = [b2[0] - b1[0], b2[1] - b1[1]];
-    // We also define a function to convert back to regular point form:
-
-    /* eslint-disable arrow-body-style */
-
-    function toPoint(p, s, d) {
-      return [
-        p[0] + s * d[0],
-        p[1] + s * d[1]
-      ];
-    }
-
-    /* eslint-enable arrow-body-style */
-
-    // The rest is pretty much a straight port of the algorithm.
-    var e = [b1[0] - a1[0], b1[1] - a1[1]];
-    var kross    = crossProduct(va, vb);
-    var sqrKross = kross * kross;
-    var sqrLenA  = dotProduct(va, va);
-    //const sqrLenB  = dotProduct(vb, vb);
-
-    // Check for line intersection. This works because of the properties of the
-    // cross product -- specifically, two vectors are parallel if and only if the
-    // cross product is the 0 vector. The full calculation involves relative error
-    // to account for possible very small line segments. See Schneider & Eberly
-    // for details.
-    if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
-      // If they're not parallel, then (because these are line segments) they
-      // still might not actually intersect. This code checks that the
-      // intersection point of the lines is actually on both line segments.
-      var s = crossProduct(e, vb) / kross;
-      if (s < 0 || s > 1) {
-        // not on line segment a
-        return null;
-      }
-      var t = crossProduct(e, va) / kross;
-      if (t < 0 || t > 1) {
-        // not on line segment b
-        return null;
-      }
-      if (s === 0 || s === 1) {
-        // on an endpoint of line segment a
-        return noEndpointTouch ? null : [toPoint(a1, s, va)];
-      }
-      if (t === 0 || t === 1) {
-        // on an endpoint of line segment b
-        return noEndpointTouch ? null : [toPoint(b1, t, vb)];
-      }
-      return [toPoint(a1, s, va)];
-    }
-
-    // If we've reached this point, then the lines are either parallel or the
-    // same, but the segments could overlap partially or fully, or not at all.
-    // So we need to find the overlap, if any. To do that, we can use e, which is
-    // the (vector) difference between the two initial points. If this is parallel
-    // with the line itself, then the two lines are the same line, and there will
-    // be overlap.
-    //const sqrLenE = dotProduct(e, e);
-    kross = crossProduct(e, va);
-    sqrKross = kross * kross;
-
-    if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
-    // Lines are just parallel, not the same. No overlap.
-      return null;
-    }
-
-    var sa = dotProduct(va, e) / sqrLenA;
-    var sb = sa + dotProduct(va, vb) / sqrLenA;
-    var smin = Math.min(sa, sb);
-    var smax = Math.max(sa, sb);
-
-    // this is, essentially, the FindIntersection acting on floats from
-    // Schneider & Eberly, just inlined into this function.
-    if (smin <= 1 && smax >= 0) {
-
-      // overlap on an end point
-      if (smin === 1) {
-        return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
-      }
-
-      if (smax === 0) {
-        return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
-      }
-
-      if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
-
-      // There's overlap on a segment -- two points of intersection. Return both.
-      return [
-        toPoint(a1, smin > 0 ? smin : 0, va),
-        toPoint(a1, smax < 1 ? smax : 1, va)
-      ];
-    }
-
-    return null;
-  }
-
-  /**
-   * @param  {SweepEvent} se1
-   * @param  {SweepEvent} se2
-   * @param  {Queue}      queue
-   * @return {Number}
-   */
-  function possibleIntersection (se1, se2, queue) {
-    // that disallows self-intersecting polygons,
-    // did cost us half a day, so I'll leave it
-    // out of respect
-    // if (se1.isSubject === se2.isSubject) return;
-    var inter = intersection(
-      se1.point, se1.otherEvent.point,
-      se2.point, se2.otherEvent.point
-    );
-
-    var nintersections = inter ? inter.length : 0;
-    if (nintersections === 0) { return 0; } // no intersection
-
-    // the line segments intersect at an endpoint of both line segments
-    if ((nintersections === 1) &&
-        (equals(se1.point, se2.point) ||
-         equals(se1.otherEvent.point, se2.otherEvent.point))) {
-      return 0;
-    }
-
-    if (nintersections === 2 && se1.isSubject === se2.isSubject) {
-      // if(se1.contourId === se2.contourId){
-      // console.warn('Edges of the same polygon overlap',
-      //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
-      // }
-      //throw new Error('Edges of the same polygon overlap');
-      return 0;
-    }
-
-    // The line segments associated to se1 and se2 intersect
-    if (nintersections === 1) {
-
-      // if the intersection point is not an endpoint of se1
-      if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
-        divideSegment(se1, inter[0], queue);
-      }
-
-      // if the intersection point is not an endpoint of se2
-      if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
-        divideSegment(se2, inter[0], queue);
-      }
-      return 1;
-    }
-
-    // The line segments associated to se1 and se2 overlap
-    var events        = [];
-    var leftCoincide  = false;
-    var rightCoincide = false;
-
-    if (equals(se1.point, se2.point)) {
-      leftCoincide = true; // linked
-    } else if (compareEvents(se1, se2) === 1) {
-      events.push(se2, se1);
-    } else {
-      events.push(se1, se2);
-    }
-
-    if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
-      rightCoincide = true;
-    } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
-      events.push(se2.otherEvent, se1.otherEvent);
-    } else {
-      events.push(se1.otherEvent, se2.otherEvent);
-    }
-
-    if ((leftCoincide && rightCoincide) || leftCoincide) {
-      // both line segments are equal or share the left endpoint
-      se2.type = NON_CONTRIBUTING;
-      se1.type = (se2.inOut === se1.inOut)
-        ? SAME_TRANSITION : DIFFERENT_TRANSITION;
-
-      if (leftCoincide && !rightCoincide) {
-        // honestly no idea, but changing events selection from [2, 1]
-        // to [0, 1] fixes the overlapping self-intersecting polygons issue
-        divideSegment(events[1].otherEvent, events[0].point, queue);
-      }
-      return 2;
-    }
-
-    // the line segments share the right endpoint
-    if (rightCoincide) {
-      divideSegment(events[0], events[1].point, queue);
-      return 3;
-    }
-
-    // no line segment includes totally the other one
-    if (events[0] !== events[3].otherEvent) {
-      divideSegment(events[0], events[1].point, queue);
-      divideSegment(events[1], events[2].point, queue);
-      return 3;
-    }
-
-    // one line segment includes the other one
-    divideSegment(events[0], events[1].point, queue);
-    divideSegment(events[3].otherEvent, events[2].point, queue);
-
-    return 3;
-  }
-
-  /**
-   * @param  {SweepEvent} le1
-   * @param  {SweepEvent} le2
-   * @return {Number}
-   */
-  function compareSegments(le1, le2) {
-    if (le1 === le2) { return 0; }
-
-    // Segments are not collinear
-    if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
-      signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
-
-      // If they share their left endpoint use the right endpoint to sort
-      if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
-
-      // Different left endpoint: use the left endpoint to sort
-      if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
-
-      // has the line segment associated to e1 been inserted
-      // into S after the line segment associated to e2 ?
-      if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
-
-      // The line segment associated to e2 has been inserted
-      // into S after the line segment associated to e1
-      return le1.isBelow(le2.point) ? -1 : 1;
-    }
-
-    if (le1.isSubject === le2.isSubject) { // same polygon
-      var p1 = le1.point, p2 = le2.point;
-      if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
-        p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
-        if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
-        else { return le1.contourId > le2.contourId ? 1 : -1; }
-      }
-    } else { // Segments are collinear, but belong to separate polygons
-      return le1.isSubject ? -1 : 1;
-    }
-
-    return compareEvents(le1, le2) === 1 ? 1 : -1;
-  }
-
-  function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
-    var sweepLine = new SplayTree(compareSegments);
-    var sortedEvents = [];
-
-    var rightbound = Math.min(sbbox[2], cbbox[2]);
-
-    var prev, next, begin;
-
-    while (eventQueue.length !== 0) {
-      var event = eventQueue.pop();
-      sortedEvents.push(event);
-
-      // optimization by bboxes for intersection and difference goes here
-      if ((operation === INTERSECTION && event.point[0] > rightbound) ||
-          (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
-        break;
-      }
-
-      if (event.left) {
-        next  = prev = sweepLine.insert(event);
-        begin = sweepLine.minNode();
-
-        if (prev !== begin) { prev = sweepLine.prev(prev); }
-        else                { prev = null; }
-
-        next = sweepLine.next(next);
-
-        var prevEvent = prev ? prev.key : null;
-        var prevprevEvent = (void 0);
-        computeFields(event, prevEvent, operation);
-        if (next) {
-          if (possibleIntersection(event, next.key, eventQueue) === 2) {
-            computeFields(event, prevEvent, operation);
-            computeFields(event, next.key, operation);
-          }
-        }
-
-        if (prev) {
-          if (possibleIntersection(prev.key, event, eventQueue) === 2) {
-            var prevprev = prev;
-            if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
-            else                    { prevprev = null; }
-
-            prevprevEvent = prevprev ? prevprev.key : null;
-            computeFields(prevEvent, prevprevEvent, operation);
-            computeFields(event,     prevEvent,     operation);
-          }
-        }
-      } else {
-        event = event.otherEvent;
-        next = prev = sweepLine.find(event);
-
-        if (prev && next) {
-
-          if (prev !== begin) { prev = sweepLine.prev(prev); }
-          else                { prev = null; }
-
-          next = sweepLine.next(next);
-          sweepLine.remove(event);
-
-          if (next && prev) {
-            possibleIntersection(prev.key, next.key, eventQueue);
-          }
-        }
-      }
-    }
-    return sortedEvents;
-  }
-
-  var Contour = function Contour() {
-    this.points = [];
-    this.holeIds = [];
-    this.holeOf = null;
-    this.depth = null;
-  };
-
-  Contour.prototype.isExterior = function isExterior () {
-    return this.holeOf == null;
-  };
-
-  /**
-   * @param  {Array.<SweepEvent>} sortedEvents
-   * @return {Array.<SweepEvent>}
-   */
-  function orderEvents(sortedEvents) {
-    var event, i, len, tmp;
-    var resultEvents = [];
-    for (i = 0, len = sortedEvents.length; i < len; i++) {
-      event = sortedEvents[i];
-      if ((event.left && event.inResult) ||
-        (!event.left && event.otherEvent.inResult)) {
-        resultEvents.push(event);
-      }
-    }
-    // Due to overlapping edges the resultEvents array can be not wholly sorted
-    var sorted = false;
-    while (!sorted) {
-      sorted = true;
-      for (i = 0, len = resultEvents.length; i < len; i++) {
-        if ((i + 1) < len &&
-          compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
-          tmp = resultEvents[i];
-          resultEvents[i] = resultEvents[i + 1];
-          resultEvents[i + 1] = tmp;
-          sorted = false;
-        }
-      }
-    }
-
-
-    for (i = 0, len = resultEvents.length; i < len; i++) {
-      event = resultEvents[i];
-      event.otherPos = i;
-    }
-
-    // imagine, the right event is found in the beginning of the queue,
-    // when his left counterpart is not marked yet
-    for (i = 0, len = resultEvents.length; i < len; i++) {
-      event = resultEvents[i];
-      if (!event.left) {
-        tmp = event.otherPos;
-        event.otherPos = event.otherEvent.otherPos;
-        event.otherEvent.otherPos = tmp;
-      }
-    }
-
-    return resultEvents;
-  }
-
-
-  /**
-   * @param  {Number} pos
-   * @param  {Array.<SweepEvent>} resultEvents
-   * @param  {Object>}    processed
-   * @return {Number}
-   */
-  function nextPos(pos, resultEvents, processed, origPos) {
-    var newPos = pos + 1,
-        p = resultEvents[pos].point,
-        p1;
-    var length = resultEvents.length;
-
-    if (newPos < length)
-      { p1 = resultEvents[newPos].point; }
-
-    while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
-      if (!processed[newPos]) {
-        return newPos;
-      } else   {
-        newPos++;
-      }
-      p1 = resultEvents[newPos].point;
-    }
-
-    newPos = pos - 1;
-
-    while (processed[newPos] && newPos > origPos) {
-      newPos--;
-    }
-
-    return newPos;
-  }
-
-
-  function initializeContourFromContext(event, contours, contourId) {
-    var contour = new Contour();
-    if (event.prevInResult != null) {
-      var prevInResult = event.prevInResult;
-      // Note that it is valid to query the "previous in result" for its output contour id,
-      // because we must have already processed it (i.e., assigned an output contour id)
-      // in an earlier iteration, otherwise it wouldn't be possible that it is "previous in
-      // result".
-      var lowerContourId = prevInResult.outputContourId;
-      var lowerResultTransition = prevInResult.resultTransition;
-      if (lowerResultTransition > 0) {
-        // We are inside. Now we have to check if the thing below us is another hole or
-        // an exterior contour.
-        var lowerContour = contours[lowerContourId];
-        if (lowerContour.holeOf != null) {
-          // The lower contour is a hole => Connect the new contour as a hole to its parent,
-          // and use same depth.
-          var parentContourId = lowerContour.holeOf;
-          contours[parentContourId].holeIds.push(contourId);
-          contour.holeOf = parentContourId;
-          contour.depth = contours[lowerContourId].depth;
-        } else {
-          // The lower contour is an exterior contour => Connect the new contour as a hole,
-          // and increment depth.
-          contours[lowerContourId].holeIds.push(contourId);
-          contour.holeOf = lowerContourId;
-          contour.depth = contours[lowerContourId].depth + 1;
-        }
-      } else {
-        // We are outside => this contour is an exterior contour of same depth.
-        contour.holeOf = null;
-        contour.depth = contours[lowerContourId].depth;
-      }
-    } else {
-      // There is no lower/previous contour => this contour is an exterior contour of depth 0.
-      contour.holeOf = null;
-      contour.depth = 0;
-    }
-    return contour;
-  }
-
-  /**
-   * @param  {Array.<SweepEvent>} sortedEvents
-   * @return {Array.<*>} polygons
-   */
-  function connectEdges(sortedEvents) {
-    var i, len;
-    var resultEvents = orderEvents(sortedEvents);
-
-    // "false"-filled array
-    var processed = {};
-    var contours = [];
-
-    var loop = function (  ) {
-
-      if (processed[i]) {
-        return;
-      }
-
-      var contourId = contours.length;
-      var contour = initializeContourFromContext(resultEvents[i], contours, contourId);
-
-      // Helper function that combines marking an event as processed with assigning its output contour ID
-      var markAsProcessed = function (pos) {
-        processed[pos] = true;
-        resultEvents[pos].outputContourId = contourId;
-      };
-
-      var pos = i;
-      var origPos = i;
-
-      var initial = resultEvents[i].point;
-      contour.points.push(initial);
-
-      /* eslint no-constant-condition: "off" */
-      while (true) {
-        markAsProcessed(pos);
-
-        pos = resultEvents[pos].otherPos;
-
-        markAsProcessed(pos);
-        contour.points.push(resultEvents[pos].point);
-
-        pos = nextPos(pos, resultEvents, processed, origPos);
-
-        if (pos == origPos) {
-          break;
-        }
-      }
-
-      contours.push(contour);
-    };
-
-    for (i = 0, len = resultEvents.length; i < len; i++) loop(  );
-
-    return contours;
-  }
-
-  var tinyqueue = TinyQueue;
-  var default_1 = TinyQueue;
-
-  function TinyQueue(data, compare) {
-      if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
-
-      this.data = data || [];
-      this.length = this.data.length;
-      this.compare = compare || defaultCompare;
-
-      if (this.length > 0) {
-          for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); }
-      }
-  }
-
-  function defaultCompare(a, b) {
-      return a < b ? -1 : a > b ? 1 : 0;
-  }
-
-  TinyQueue.prototype = {
-
-      push: function (item) {
-          this.data.push(item);
-          this.length++;
-          this._up(this.length - 1);
-      },
-
-      pop: function () {
-          if (this.length === 0) { return undefined; }
-
-          var top = this.data[0];
-          this.length--;
-
-          if (this.length > 0) {
-              this.data[0] = this.data[this.length];
-              this._down(0);
-          }
-          this.data.pop();
-
-          return top;
-      },
-
-      peek: function () {
-          return this.data[0];
-      },
-
-      _up: function (pos) {
-          var data = this.data;
-          var compare = this.compare;
-          var item = data[pos];
-
-          while (pos > 0) {
-              var parent = (pos - 1) >> 1;
-              var current = data[parent];
-              if (compare(item, current) >= 0) { break; }
-              data[pos] = current;
-              pos = parent;
-          }
-
-          data[pos] = item;
-      },
-
-      _down: function (pos) {
-          var data = this.data;
-          var compare = this.compare;
-          var halfLength = this.length >> 1;
-          var item = data[pos];
-
-          while (pos < halfLength) {
-              var left = (pos << 1) + 1;
-              var right = left + 1;
-              var best = data[left];
-
-              if (right < this.length && compare(data[right], best) < 0) {
-                  left = right;
-                  best = data[right];
-              }
-              if (compare(best, item) >= 0) { break; }
-
-              data[pos] = best;
-              pos = left;
-          }
-
-          data[pos] = item;
-      }
-  };
-  tinyqueue.default = default_1;
-
-  var max = Math.max;
-  var min = Math.min;
-
-  var contourId = 0;
-
-
-  function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
-    var i, len, s1, s2, e1, e2;
-    for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
-      s1 = contourOrHole[i];
-      s2 = contourOrHole[i + 1];
-      e1 = new SweepEvent(s1, false, undefined, isSubject);
-      e2 = new SweepEvent(s2, false, e1,        isSubject);
-      e1.otherEvent = e2;
-
-      if (s1[0] === s2[0] && s1[1] === s2[1]) {
-        continue; // skip collapsed edges, or it breaks
-      }
-
-      e1.contourId = e2.contourId = depth;
-      if (!isExteriorRing) {
-        e1.isExteriorRing = false;
-        e2.isExteriorRing = false;
-      }
-      if (compareEvents(e1, e2) > 0) {
-        e2.left = true;
-      } else {
-        e1.left = true;
-      }
-
-      var x = s1[0], y = s1[1];
-      bbox[0] = min(bbox[0], x);
-      bbox[1] = min(bbox[1], y);
-      bbox[2] = max(bbox[2], x);
-      bbox[3] = max(bbox[3], y);
-
-      // Pushing it so the queue is sorted from left to right,
-      // with object on the left having the highest priority.
-      Q.push(e1);
-      Q.push(e2);
-    }
-  }
-
-
-  function fillQueue(subject, clipping, sbbox, cbbox, operation) {
-    var eventQueue = new tinyqueue(null, compareEvents);
-    var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
-
-    for (i = 0, ii = subject.length; i < ii; i++) {
-      polygonSet = subject[i];
-      for (j = 0, jj = polygonSet.length; j < jj; j++) {
-        isExteriorRing = j === 0;
-        if (isExteriorRing) { contourId++; }
-        processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
-      }
-    }
-
-    for (i = 0, ii = clipping.length; i < ii; i++) {
-      polygonSet = clipping[i];
-      for (j = 0, jj = polygonSet.length; j < jj; j++) {
-        isExteriorRing = j === 0;
-        if (operation === DIFFERENCE) { isExteriorRing = false; }
-        if (isExteriorRing) { contourId++; }
-        processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
-      }
-    }
-
-    return eventQueue;
-  }
-
-  var EMPTY = [];
-
-
-  function trivialOperation(subject, clipping, operation) {
-    var result = null;
-    if (subject.length * clipping.length === 0) {
-      if        (operation === INTERSECTION) {
-        result = EMPTY;
-      } else if (operation === DIFFERENCE) {
-        result = subject;
-      } else if (operation === UNION ||
-                 operation === XOR) {
-        result = (subject.length === 0) ? clipping : subject;
-      }
-    }
-    return result;
-  }
-
-
-  function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
-    var result = null;
-    if (sbbox[0] > cbbox[2] ||
-        cbbox[0] > sbbox[2] ||
-        sbbox[1] > cbbox[3] ||
-        cbbox[1] > sbbox[3]) {
-      if        (operation === INTERSECTION) {
-        result = EMPTY;
-      } else if (operation === DIFFERENCE) {
-        result = subject;
-      } else if (operation === UNION ||
-                 operation === XOR) {
-        result = subject.concat(clipping);
-      }
-    }
-    return result;
-  }
-
-
-  function boolean(subject, clipping, operation) {
-    if (typeof subject[0][0][0] === 'number') {
-      subject = [subject];
-    }
-    if (typeof clipping[0][0][0] === 'number') {
-      clipping = [clipping];
-    }
-    var trivial = trivialOperation(subject, clipping, operation);
-    if (trivial) {
-      return trivial === EMPTY ? null : trivial;
-    }
-    var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
-    var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
-
-    // console.time('fill queue');
-    var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
-    //console.timeEnd('fill queue');
-
-    trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
-    if (trivial) {
-      return trivial === EMPTY ? null : trivial;
-    }
-    // console.time('subdivide edges');
-    var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
-    //console.timeEnd('subdivide edges');
-
-    // console.time('connect vertices');
-    var contours = connectEdges(sortedEvents);
-    //console.timeEnd('connect vertices');
-
-    // Convert contours to polygons
-    var polygons = [];
-    for (var i = 0; i < contours.length; i++) {
-      var contour = contours[i];
-      if (contour.isExterior()) {
-        // The exterior ring goes first
-        var rings = [contour.points];
-        // Followed by holes if any
-        for (var j = 0; j < contour.holeIds.length; j++) {
-          var holeId = contour.holeIds[j];
-          rings.push(contours[holeId].points);
-        }
-        polygons.push(rings);
-      }
-    }
-
-    return polygons;
-  }
-
-  function union (subject, clipping) {
-    return boolean(subject, clipping, UNION);
-  }
-
-  function diff (subject, clipping) {
-    return boolean(subject, clipping, DIFFERENCE);
-  }
-
-  function xor (subject, clipping) {
-    return boolean(subject, clipping, XOR);
-  }
-
-  function intersection$1 (subject, clipping) {
-    return boolean(subject, clipping, INTERSECTION);
-  }
-
-  /**
-   * @enum {Number}
-   */
-  var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
-
-  exports.diff = diff;
-  exports.intersection = intersection$1;
-  exports.operations = operations;
-  exports.union = union;
-  exports.xor = xor;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
-
-
-},{}],23:[function(require,module,exports){
-// Top level file is just a mixin of submodules & constants
-'use strict';
-
-var assign    = require('./lib/utils/common').assign;
-
-var deflate   = require('./lib/deflate');
-var inflate   = require('./lib/inflate');
-var constants = require('./lib/zlib/constants');
-
-var pako = {};
-
-assign(pako, deflate, inflate, constants);
-
-module.exports = pako;
-
-},{"./lib/deflate":24,"./lib/inflate":25,"./lib/utils/common":26,"./lib/zlib/constants":29}],24:[function(require,module,exports){
-'use strict';
-
-
-var zlib_deflate = require('./zlib/deflate');
-var utils        = require('./utils/common');
-var strings      = require('./utils/strings');
-var msg          = require('./zlib/messages');
-var ZStream      = require('./zlib/zstream');
-
-var toString = Object.prototype.toString;
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-var Z_NO_FLUSH      = 0;
-var Z_FINISH        = 4;
-
-var Z_OK            = 0;
-var Z_STREAM_END    = 1;
-var Z_SYNC_FLUSH    = 2;
-
-var Z_DEFAULT_COMPRESSION = -1;
-
-var Z_DEFAULT_STRATEGY    = 0;
-
-var Z_DEFLATED  = 8;
-
-/* ===========================================================================*/
-
-
-/**
- * class Deflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[deflate]],
- * [[deflateRaw]] and [[gzip]].
- **/
-
-/* internal
- * Deflate.chunks -> Array
- *
- * Chunks of output data, if [[Deflate#onData]] not overridden.
- **/
-
-/**
- * Deflate.result -> Uint8Array|Array
- *
- * Compressed result, generated by default [[Deflate#onData]]
- * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you
- * push a chunk with explicit flush (call [[Deflate#push]] with
- * `Z_SYNC_FLUSH` param).
- **/
-
-/**
- * Deflate.err -> Number
- *
- * Error code after deflate finished. 0 (Z_OK) on success.
- * You will not need it in real life, because deflate errors
- * are possible only on wrong options or bad `onData` / `onEnd`
- * custom handlers.
- **/
-
-/**
- * Deflate.msg -> String
- *
- * Error message, if [[Deflate.err]] != 0
- **/
-
-
-/**
- * new Deflate(options)
- * - options (Object): zlib deflate options.
- *
- * Creates new deflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `level`
- * - `windowBits`
- * - `memLevel`
- * - `strategy`
- * - `dictionary`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw deflate
- * - `gzip` (Boolean) - create gzip wrapper
- * - `to` (String) - if equal to 'string', then result will be "binary string"
- *    (each char code [0..255])
- * - `header` (Object) - custom header for gzip
- *   - `text` (Boolean) - true if compressed data believed to be text
- *   - `time` (Number) - modification time, unix timestamp
- *   - `os` (Number) - operation system code
- *   - `extra` (Array) - array of bytes with extra data (max 65536)
- *   - `name` (String) - file name (binary string)
- *   - `comment` (String) - comment (binary string)
- *   - `hcrc` (Boolean) - true if header crc should be added
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
- *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * var deflate = new pako.Deflate({ level: 3});
- *
- * deflate.push(chunk1, false);
- * deflate.push(chunk2, true);  // true -> last chunk
- *
- * if (deflate.err) { throw new Error(deflate.err); }
- *
- * console.log(deflate.result);
- * ```
- **/
-function Deflate(options) {
-  if (!(this instanceof Deflate)) return new Deflate(options);
-
-  this.options = utils.assign({
-    level: Z_DEFAULT_COMPRESSION,
-    method: Z_DEFLATED,
-    chunkSize: 16384,
-    windowBits: 15,
-    memLevel: 8,
-    strategy: Z_DEFAULT_STRATEGY,
-    to: ''
-  }, options || {});
-
-  var opt = this.options;
-
-  if (opt.raw && (opt.windowBits > 0)) {
-    opt.windowBits = -opt.windowBits;
-  }
-
-  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
-    opt.windowBits += 16;
-  }
-
-  this.err    = 0;      // error code, if happens (0 = Z_OK)
-  this.msg    = '';     // error message
-  this.ended  = false;  // used to avoid multiple onEnd() calls
-  this.chunks = [];     // chunks of compressed data
-
-  this.strm = new ZStream();
-  this.strm.avail_out = 0;
-
-  var status = zlib_deflate.deflateInit2(
-    this.strm,
-    opt.level,
-    opt.method,
-    opt.windowBits,
-    opt.memLevel,
-    opt.strategy
-  );
-
-  if (status !== Z_OK) {
-    throw new Error(msg[status]);
-  }
-
-  if (opt.header) {
-    zlib_deflate.deflateSetHeader(this.strm, opt.header);
-  }
-
-  if (opt.dictionary) {
-    var dict;
-    // Convert data if needed
-    if (typeof opt.dictionary === 'string') {
-      // If we need to compress text, change encoding to utf8.
-      dict = strings.string2buf(opt.dictionary);
-    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
-      dict = new Uint8Array(opt.dictionary);
-    } else {
-      dict = opt.dictionary;
-    }
-
-    status = zlib_deflate.deflateSetDictionary(this.strm, dict);
-
-    if (status !== Z_OK) {
-      throw new Error(msg[status]);
-    }
-
-    this._dict_set = true;
-  }
-}
-
-/**
- * Deflate#push(data[, mode]) -> Boolean
- * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be
- *   converted to utf8 byte sequence.
- * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
- *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
- *
- * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
- * new compressed chunks. Returns `true` on success. The last data block must have
- * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
- * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you
- * can use mode Z_SYNC_FLUSH, keeping the compression context.
- *
- * On fail call [[Deflate#onEnd]] with error code and return false.
- *
- * We strongly recommend to use `Uint8Array` on input for best speed (output
- * array format is detected automatically). Also, don't skip last param and always
- * use the same type in your code (boolean or number). That will improve JS speed.
- *
- * For regular `Array`-s make sure all elements are [0..255].
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true);  // push last chunk
- * ```
- **/
-Deflate.prototype.push = function (data, mode) {
-  var strm = this.strm;
-  var chunkSize = this.options.chunkSize;
-  var status, _mode;
-
-  if (this.ended) { return false; }
-
-  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
-
-  // Convert data if needed
-  if (typeof data === 'string') {
-    // If we need to compress text, change encoding to utf8.
-    strm.input = strings.string2buf(data);
-  } else if (toString.call(data) === '[object ArrayBuffer]') {
-    strm.input = new Uint8Array(data);
-  } else {
-    strm.input = data;
-  }
-
-  strm.next_in = 0;
-  strm.avail_in = strm.input.length;
-
-  do {
-    if (strm.avail_out === 0) {
-      strm.output = new utils.Buf8(chunkSize);
-      strm.next_out = 0;
-      strm.avail_out = chunkSize;
-    }
-    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
-
-    if (status !== Z_STREAM_END && status !== Z_OK) {
-      this.onEnd(status);
-      this.ended = true;
-      return false;
-    }
-    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {
-      if (this.options.to === 'string') {
-        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
-      } else {
-        this.onData(utils.shrinkBuf(strm.output, strm.next_out));
-      }
-    }
-  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
-
-  // Finalize on the last chunk.
-  if (_mode === Z_FINISH) {
-    status = zlib_deflate.deflateEnd(this.strm);
-    this.onEnd(status);
-    this.ended = true;
-    return status === Z_OK;
-  }
-
-  // callback interim results if Z_SYNC_FLUSH.
-  if (_mode === Z_SYNC_FLUSH) {
-    this.onEnd(Z_OK);
-    strm.avail_out = 0;
-    return true;
-  }
-
-  return true;
-};
-
-
-/**
- * Deflate#onData(chunk) -> Void
- * - chunk (Uint8Array|Array|String): output data. Type of array depends
- *   on js engine support. When string output requested, each chunk
- *   will be string.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
-Deflate.prototype.onData = function (chunk) {
-  this.chunks.push(chunk);
-};
-
-
-/**
- * Deflate#onEnd(status) -> Void
- * - status (Number): deflate status. 0 (Z_OK) on success,
- *   other if not.
- *
- * Called once after you tell deflate that the input stream is
- * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
- * or if an error happened. By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
-Deflate.prototype.onEnd = function (status) {
-  // On success - join
-  if (status === Z_OK) {
-    if (this.options.to === 'string') {
-      this.result = this.chunks.join('');
-    } else {
-      this.result = utils.flattenChunks(this.chunks);
-    }
-  }
-  this.chunks = [];
-  this.err = status;
-  this.msg = this.strm.msg;
-};
-
-
-/**
- * deflate(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * Compress `data` with deflate algorithm and `options`.
- *
- * Supported options are:
- *
- * - level
- * - windowBits
- * - memLevel
- * - strategy
- * - dictionary
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- *   negative windowBits implicitly.
- * - `to` (String) - if equal to 'string', then result will be "binary string"
- *    (each char code [0..255])
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
- *
- * console.log(pako.deflate(data));
- * ```
- **/
-function deflate(input, options) {
-  var deflator = new Deflate(options);
-
-  deflator.push(input, true);
-
-  // That will never happens, if you don't cheat with options :)
-  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }
-
-  return deflator.result;
-}
-
-
-/**
- * deflateRaw(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
-function deflateRaw(input, options) {
-  options = options || {};
-  options.raw = true;
-  return deflate(input, options);
-}
-
-
-/**
- * gzip(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but create gzip wrapper instead of
- * deflate one.
- **/
-function gzip(input, options) {
-  options = options || {};
-  options.gzip = true;
-  return deflate(input, options);
-}
-
-
-exports.Deflate = Deflate;
-exports.deflate = deflate;
-exports.deflateRaw = deflateRaw;
-exports.gzip = gzip;
-
-},{"./utils/common":26,"./utils/strings":27,"./zlib/deflate":31,"./zlib/messages":36,"./zlib/zstream":38}],25:[function(require,module,exports){
-'use strict';
-
-
-var zlib_inflate = require('./zlib/inflate');
-var utils        = require('./utils/common');
-var strings      = require('./utils/strings');
-var c            = require('./zlib/constants');
-var msg          = require('./zlib/messages');
-var ZStream      = require('./zlib/zstream');
-var GZheader     = require('./zlib/gzheader');
-
-var toString = Object.prototype.toString;
-
-/**
- * class Inflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[inflate]]
- * and [[inflateRaw]].
- **/
-
-/* internal
- * inflate.chunks -> Array
- *
- * Chunks of output data, if [[Inflate#onData]] not overridden.
- **/
-
-/**
- * Inflate.result -> Uint8Array|Array|String
- *
- * Uncompressed result, generated by default [[Inflate#onData]]
- * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
- * push a chunk with explicit flush (call [[Inflate#push]] with
- * `Z_SYNC_FLUSH` param).
- **/
-
-/**
- * Inflate.err -> Number
- *
- * Error code after inflate finished. 0 (Z_OK) on success.
- * Should be checked if broken data possible.
- **/
-
-/**
- * Inflate.msg -> String
- *
- * Error message, if [[Inflate.err]] != 0
- **/
-
-
-/**
- * new Inflate(options)
- * - options (Object): zlib inflate options.
- *
- * Creates new inflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `windowBits`
- * - `dictionary`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw inflate
- * - `to` (String) - if equal to 'string', then result will be converted
- *   from utf8 to utf16 (javascript) string. When string output requested,
- *   chunk length can differ from `chunkSize`, depending on content.
- *
- * By default, when no options set, autodetect deflate/gzip data format via
- * wrapper header.
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
- *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * var inflate = new pako.Inflate({ level: 3});
- *
- * inflate.push(chunk1, false);
- * inflate.push(chunk2, true);  // true -> last chunk
- *
- * if (inflate.err) { throw new Error(inflate.err); }
- *
- * console.log(inflate.result);
- * ```
- **/
-function Inflate(options) {
-  if (!(this instanceof Inflate)) return new Inflate(options);
-
-  this.options = utils.assign({
-    chunkSize: 16384,
-    windowBits: 0,
-    to: ''
-  }, options || {});
-
-  var opt = this.options;
-
-  // Force window size for `raw` data, if not set directly,
-  // because we have no header for autodetect.
-  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
-    opt.windowBits = -opt.windowBits;
-    if (opt.windowBits === 0) { opt.windowBits = -15; }
-  }
-
-  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
-  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
-      !(options && options.windowBits)) {
-    opt.windowBits += 32;
-  }
-
-  // Gzip header has no info about windows size, we can do autodetect only
-  // for deflate. So, if window size not set, force it to max when gzip possible
-  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
-    // bit 3 (16) -> gzipped data
-    // bit 4 (32) -> autodetect gzip/deflate
-    if ((opt.windowBits & 15) === 0) {
-      opt.windowBits |= 15;
-    }
-  }
-
-  this.err    = 0;      // error code, if happens (0 = Z_OK)
-  this.msg    = '';     // error message
-  this.ended  = false;  // used to avoid multiple onEnd() calls
-  this.chunks = [];     // chunks of compressed data
-
-  this.strm   = new ZStream();
-  this.strm.avail_out = 0;
-
-  var status  = zlib_inflate.inflateInit2(
-    this.strm,
-    opt.windowBits
-  );
-
-  if (status !== c.Z_OK) {
-    throw new Error(msg[status]);
-  }
-
-  this.header = new GZheader();
-
-  zlib_inflate.inflateGetHeader(this.strm, this.header);
-
-  // Setup dictionary
-  if (opt.dictionary) {
-    // Convert data if needed
-    if (typeof opt.dictionary === 'string') {
-      opt.dictionary = strings.string2buf(opt.dictionary);
-    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
-      opt.dictionary = new Uint8Array(opt.dictionary);
-    }
-    if (opt.raw) { //In raw mode we need to set the dictionary early
-      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);
-      if (status !== c.Z_OK) {
-        throw new Error(msg[status]);
-      }
-    }
-  }
-}
-
-/**
- * Inflate#push(data[, mode]) -> Boolean
- * - data (Uint8Array|Array|ArrayBuffer|String): input data
- * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
- *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
- *
- * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
- * new output chunks. Returns `true` on success. The last data block must have
- * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
- * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
- * can use mode Z_SYNC_FLUSH, keeping the decompression context.
- *
- * On fail call [[Inflate#onEnd]] with error code and return false.
- *
- * We strongly recommend to use `Uint8Array` on input for best speed (output
- * format is detected automatically). Also, don't skip last param and always
- * use the same type in your code (boolean or number). That will improve JS speed.
- *
- * For regular `Array`-s make sure all elements are [0..255].
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true);  // push last chunk
- * ```
- **/
-Inflate.prototype.push = function (data, mode) {
-  var strm = this.strm;
-  var chunkSize = this.options.chunkSize;
-  var dictionary = this.options.dictionary;
-  var status, _mode;
-  var next_out_utf8, tail, utf8str;
-
-  // Flag to properly process Z_BUF_ERROR on testing inflate call
-  // when we check that all output data was flushed.
-  var allowBufError = false;
-
-  if (this.ended) { return false; }
-  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
-
-  // Convert data if needed
-  if (typeof data === 'string') {
-    // Only binary strings can be decompressed on practice
-    strm.input = strings.binstring2buf(data);
-  } else if (toString.call(data) === '[object ArrayBuffer]') {
-    strm.input = new Uint8Array(data);
-  } else {
-    strm.input = data;
-  }
-
-  strm.next_in = 0;
-  strm.avail_in = strm.input.length;
-
-  do {
-    if (strm.avail_out === 0) {
-      strm.output = new utils.Buf8(chunkSize);
-      strm.next_out = 0;
-      strm.avail_out = chunkSize;
-    }
-
-    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
-
-    if (status === c.Z_NEED_DICT && dictionary) {
-      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);
-    }
-
-    if (status === c.Z_BUF_ERROR && allowBufError === true) {
-      status = c.Z_OK;
-      allowBufError = false;
-    }
-
-    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
-      this.onEnd(status);
-      this.ended = true;
-      return false;
-    }
-
-    if (strm.next_out) {
-      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {
-
-        if (this.options.to === 'string') {
-
-          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
-
-          tail = strm.next_out - next_out_utf8;
-          utf8str = strings.buf2string(strm.output, next_out_utf8);
-
-          // move tail
-          strm.next_out = tail;
-          strm.avail_out = chunkSize - tail;
-          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
-
-          this.onData(utf8str);
-
-        } else {
-          this.onData(utils.shrinkBuf(strm.output, strm.next_out));
-        }
-      }
-    }
-
-    // When no more input data, we should check that internal inflate buffers
-    // are flushed. The only way to do it when avail_out = 0 - run one more
-    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
-    // Here we set flag to process this error properly.
-    //
-    // NOTE. Deflate does not return error in this case and does not needs such
-    // logic.
-    if (strm.avail_in === 0 && strm.avail_out === 0) {
-      allowBufError = true;
-    }
-
-  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);
-
-  if (status === c.Z_STREAM_END) {
-    _mode = c.Z_FINISH;
-  }
-
-  // Finalize on the last chunk.
-  if (_mode === c.Z_FINISH) {
-    status = zlib_inflate.inflateEnd(this.strm);
-    this.onEnd(status);
-    this.ended = true;
-    return status === c.Z_OK;
-  }
-
-  // callback interim results if Z_SYNC_FLUSH.
-  if (_mode === c.Z_SYNC_FLUSH) {
-    this.onEnd(c.Z_OK);
-    strm.avail_out = 0;
-    return true;
-  }
-
-  return true;
-};
-
-
-/**
- * Inflate#onData(chunk) -> Void
- * - chunk (Uint8Array|Array|String): output data. Type of array depends
- *   on js engine support. When string output requested, each chunk
- *   will be string.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
-Inflate.prototype.onData = function (chunk) {
-  this.chunks.push(chunk);
-};
-
-
-/**
- * Inflate#onEnd(status) -> Void
- * - status (Number): inflate status. 0 (Z_OK) on success,
- *   other if not.
- *
- * Called either after you tell inflate that the input stream is
- * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
- * or if an error happened. By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
-Inflate.prototype.onEnd = function (status) {
-  // On success - join
-  if (status === c.Z_OK) {
-    if (this.options.to === 'string') {
-      // Glue & convert here, until we teach pako to send
-      // utf8 aligned strings to onData
-      this.result = this.chunks.join('');
-    } else {
-      this.result = utils.flattenChunks(this.chunks);
-    }
-  }
-  this.chunks = [];
-  this.err = status;
-  this.msg = this.strm.msg;
-};
-
-
-/**
- * inflate(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Decompress `data` with inflate/ungzip and `options`. Autodetect
- * format via wrapper header by default. That's why we don't provide
- * separate `ungzip` method.
- *
- * Supported options are:
- *
- * - windowBits
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- *   negative windowBits implicitly.
- * - `to` (String) - if equal to 'string', then result will be converted
- *   from utf8 to utf16 (javascript) string. When string output requested,
- *   chunk length can differ from `chunkSize`, depending on content.
- *
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
- *   , output;
- *
- * try {
- *   output = pako.inflate(input);
- * } catch (err)
- *   console.log(err);
- * }
- * ```
- **/
-function inflate(input, options) {
-  var inflator = new Inflate(options);
-
-  inflator.push(input, true);
-
-  // That will never happens, if you don't cheat with options :)
-  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }
-
-  return inflator.result;
-}
-
-
-/**
- * inflateRaw(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * The same as [[inflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
-function inflateRaw(input, options) {
-  options = options || {};
-  options.raw = true;
-  return inflate(input, options);
-}
-
-
-/**
- * ungzip(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Just shortcut to [[inflate]], because it autodetects format
- * by header.content. Done for convenience.
- **/
-
-
-exports.Inflate = Inflate;
-exports.inflate = inflate;
-exports.inflateRaw = inflateRaw;
-exports.ungzip  = inflate;
-
-},{"./utils/common":26,"./utils/strings":27,"./zlib/constants":29,"./zlib/gzheader":32,"./zlib/inflate":34,"./zlib/messages":36,"./zlib/zstream":38}],26:[function(require,module,exports){
-'use strict';
-
-
-var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
-                (typeof Uint16Array !== 'undefined') &&
-                (typeof Int32Array !== 'undefined');
-
-function _has(obj, key) {
-  return Object.prototype.hasOwnProperty.call(obj, key);
-}
-
-exports.assign = function (obj /*from1, from2, from3, ...*/) {
-  var sources = Array.prototype.slice.call(arguments, 1);
-  while (sources.length) {
-    var source = sources.shift();
-    if (!source) { continue; }
-
-    if (typeof source !== 'object') {
-      throw new TypeError(source + 'must be non-object');
-    }
-
-    for (var p in source) {
-      if (_has(source, p)) {
-        obj[p] = source[p];
-      }
-    }
-  }
-
-  return obj;
-};
-
-
-// reduce buffer size, avoiding mem copy
-exports.shrinkBuf = function (buf, size) {
-  if (buf.length === size) { return buf; }
-  if (buf.subarray) { return buf.subarray(0, size); }
-  buf.length = size;
-  return buf;
-};
-
-
-var fnTyped = {
-  arraySet: function (dest, src, src_offs, len, dest_offs) {
-    if (src.subarray && dest.subarray) {
-      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
-      return;
-    }
-    // Fallback to ordinary array
-    for (var i = 0; i < len; i++) {
-      dest[dest_offs + i] = src[src_offs + i];
-    }
-  },
-  // Join array of chunks to single array.
-  flattenChunks: function (chunks) {
-    var i, l, len, pos, chunk, result;
-
-    // calculate data length
-    len = 0;
-    for (i = 0, l = chunks.length; i < l; i++) {
-      len += chunks[i].length;
-    }
-
-    // join chunks
-    result = new Uint8Array(len);
-    pos = 0;
-    for (i = 0, l = chunks.length; i < l; i++) {
-      chunk = chunks[i];
-      result.set(chunk, pos);
-      pos += chunk.length;
-    }
-
-    return result;
-  }
-};
-
-var fnUntyped = {
-  arraySet: function (dest, src, src_offs, len, dest_offs) {
-    for (var i = 0; i < len; i++) {
-      dest[dest_offs + i] = src[src_offs + i];
-    }
-  },
-  // Join array of chunks to single array.
-  flattenChunks: function (chunks) {
-    return [].concat.apply([], chunks);
-  }
-};
-
-
-// Enable/Disable typed arrays use, for testing
-//
-exports.setTyped = function (on) {
-  if (on) {
-    exports.Buf8  = Uint8Array;
-    exports.Buf16 = Uint16Array;
-    exports.Buf32 = Int32Array;
-    exports.assign(exports, fnTyped);
-  } else {
-    exports.Buf8  = Array;
-    exports.Buf16 = Array;
-    exports.Buf32 = Array;
-    exports.assign(exports, fnUntyped);
-  }
-};
-
-exports.setTyped(TYPED_OK);
-
-},{}],27:[function(require,module,exports){
-// String encode/decode helpers
-'use strict';
-
-
-var utils = require('./common');
-
-
-// Quick check if we can use fast array to bin string conversion
-//
-// - apply(Array) can fail on Android 2.2
-// - apply(Uint8Array) can fail on iOS 5.1 Safari
-//
-var STR_APPLY_OK = true;
-var STR_APPLY_UIA_OK = true;
-
-try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
-try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
-
-
-// Table with utf8 lengths (calculated by first byte of sequence)
-// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
-// because max possible codepoint is 0x10ffff
-var _utf8len = new utils.Buf8(256);
-for (var q = 0; q < 256; q++) {
-  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
-}
-_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
-
-
-// convert string to array (typed, when possible)
-exports.string2buf = function (str) {
-  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
-
-  // count binary size
-  for (m_pos = 0; m_pos < str_len; m_pos++) {
-    c = str.charCodeAt(m_pos);
-    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
-      c2 = str.charCodeAt(m_pos + 1);
-      if ((c2 & 0xfc00) === 0xdc00) {
-        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
-        m_pos++;
-      }
-    }
-    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
-  }
-
-  // allocate buffer
-  buf = new utils.Buf8(buf_len);
-
-  // convert
-  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
-    c = str.charCodeAt(m_pos);
-    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
-      c2 = str.charCodeAt(m_pos + 1);
-      if ((c2 & 0xfc00) === 0xdc00) {
-        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
-        m_pos++;
-      }
-    }
-    if (c < 0x80) {
-      /* one byte */
-      buf[i++] = c;
-    } else if (c < 0x800) {
-      /* two bytes */
-      buf[i++] = 0xC0 | (c >>> 6);
-      buf[i++] = 0x80 | (c & 0x3f);
-    } else if (c < 0x10000) {
-      /* three bytes */
-      buf[i++] = 0xE0 | (c >>> 12);
-      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
-      buf[i++] = 0x80 | (c & 0x3f);
-    } else {
-      /* four bytes */
-      buf[i++] = 0xf0 | (c >>> 18);
-      buf[i++] = 0x80 | (c >>> 12 & 0x3f);
-      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
-      buf[i++] = 0x80 | (c & 0x3f);
-    }
-  }
-
-  return buf;
-};
-
-// Helper (used in 2 places)
-function buf2binstring(buf, len) {
-  // On Chrome, the arguments in a function call that are allowed is `65534`.
-  // If the length of the buffer is smaller than that, we can use this optimization,
-  // otherwise we will take a slower path.
-  if (len < 65534) {
-    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
-      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
-    }
-  }
-
-  var result = '';
-  for (var i = 0; i < len; i++) {
-    result += String.fromCharCode(buf[i]);
-  }
-  return result;
-}
-
-
-// Convert byte array to binary string
-exports.buf2binstring = function (buf) {
-  return buf2binstring(buf, buf.length);
-};
-
-
-// Convert binary string (typed, when possible)
-exports.binstring2buf = function (str) {
-  var buf = new utils.Buf8(str.length);
-  for (var i = 0, len = buf.length; i < len; i++) {
-    buf[i] = str.charCodeAt(i);
-  }
-  return buf;
-};
-
-
-// convert array to string
-exports.buf2string = function (buf, max) {
-  var i, out, c, c_len;
-  var len = max || buf.length;
-
-  // Reserve max possible length (2 words per char)
-  // NB: by unknown reasons, Array is significantly faster for
-  //     String.fromCharCode.apply than Uint16Array.
-  var utf16buf = new Array(len * 2);
-
-  for (out = 0, i = 0; i < len;) {
-    c = buf[i++];
-    // quick process ascii
-    if (c < 0x80) { utf16buf[out++] = c; continue; }
-
-    c_len = _utf8len[c];
-    // skip 5 & 6 byte codes
-    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
-
-    // apply mask on first byte
-    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
-    // join the rest
-    while (c_len > 1 && i < len) {
-      c = (c << 6) | (buf[i++] & 0x3f);
-      c_len--;
-    }
-
-    // terminated by end of string?
-    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
-
-    if (c < 0x10000) {
-      utf16buf[out++] = c;
-    } else {
-      c -= 0x10000;
-      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
-      utf16buf[out++] = 0xdc00 | (c & 0x3ff);
-    }
-  }
-
-  return buf2binstring(utf16buf, out);
-};
-
-
-// Calculate max possible position in utf8 buffer,
-// that will not break sequence. If that's not possible
-// - (very small limits) return max size as is.
-//
-// buf[] - utf8 bytes array
-// max   - length limit (mandatory);
-exports.utf8border = function (buf, max) {
-  var pos;
-
-  max = max || buf.length;
-  if (max > buf.length) { max = buf.length; }
-
-  // go back from last position, until start of sequence found
-  pos = max - 1;
-  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
-
-  // Very small and broken sequence,
-  // return max, because we should return something anyway.
-  if (pos < 0) { return max; }
-
-  // If we came to start of buffer - that means buffer is too small,
-  // return max too.
-  if (pos === 0) { return max; }
-
-  return (pos + _utf8len[buf[pos]] > max) ? pos : max;
-};
-
-},{"./common":26}],28:[function(require,module,exports){
-'use strict';
-
-// Note: adler32 takes 12% for level 0 and 2% for level 6.
-// It isn't worth it to make additional optimizations as in original.
-// Small size is preferable.
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-function adler32(adler, buf, len, pos) {
-  var s1 = (adler & 0xffff) |0,
-      s2 = ((adler >>> 16) & 0xffff) |0,
-      n = 0;
-
-  while (len !== 0) {
-    // Set limit ~ twice less than 5552, to keep
-    // s2 in 31-bits, because we force signed ints.
-    // in other case %= will fail.
-    n = len > 2000 ? 2000 : len;
-    len -= n;
-
-    do {
-      s1 = (s1 + buf[pos++]) |0;
-      s2 = (s2 + s1) |0;
-    } while (--n);
-
-    s1 %= 65521;
-    s2 %= 65521;
-  }
-
-  return (s1 | (s2 << 16)) |0;
-}
-
-
-module.exports = adler32;
-
-},{}],29:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-module.exports = {
-
-  /* Allowed flush values; see deflate() and inflate() below for details */
-  Z_NO_FLUSH:         0,
-  Z_PARTIAL_FLUSH:    1,
-  Z_SYNC_FLUSH:       2,
-  Z_FULL_FLUSH:       3,
-  Z_FINISH:           4,
-  Z_BLOCK:            5,
-  Z_TREES:            6,
-
-  /* Return codes for the compression/decompression functions. Negative values
-  * are errors, positive values are used for special but normal events.
-  */
-  Z_OK:               0,
-  Z_STREAM_END:       1,
-  Z_NEED_DICT:        2,
-  Z_ERRNO:           -1,
-  Z_STREAM_ERROR:    -2,
-  Z_DATA_ERROR:      -3,
-  //Z_MEM_ERROR:     -4,
-  Z_BUF_ERROR:       -5,
-  //Z_VERSION_ERROR: -6,
-
-  /* compression levels */
-  Z_NO_COMPRESSION:         0,
-  Z_BEST_SPEED:             1,
-  Z_BEST_COMPRESSION:       9,
-  Z_DEFAULT_COMPRESSION:   -1,
-
-
-  Z_FILTERED:               1,
-  Z_HUFFMAN_ONLY:           2,
-  Z_RLE:                    3,
-  Z_FIXED:                  4,
-  Z_DEFAULT_STRATEGY:       0,
-
-  /* Possible values of the data_type field (though see inflate()) */
-  Z_BINARY:                 0,
-  Z_TEXT:                   1,
-  //Z_ASCII:                1, // = Z_TEXT (deprecated)
-  Z_UNKNOWN:                2,
-
-  /* The deflate compression method */
-  Z_DEFLATED:               8
-  //Z_NULL:                 null // Use -1 or null inline, depending on var type
-};
-
-},{}],30:[function(require,module,exports){
-'use strict';
-
-// Note: we can't get significant speed boost here.
-// So write code to minimize size - no pregenerated tables
-// and array tools dependencies.
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-// Use ordinary array, since untyped makes no boost here
-function makeTable() {
-  var c, table = [];
-
-  for (var n = 0; n < 256; n++) {
-    c = n;
-    for (var k = 0; k < 8; k++) {
-      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
-    }
-    table[n] = c;
-  }
-
-  return table;
-}
-
-// Create table on load. Just 255 signed longs. Not a problem.
-var crcTable = makeTable();
-
-
-function crc32(crc, buf, len, pos) {
-  var t = crcTable,
-      end = pos + len;
-
-  crc ^= -1;
-
-  for (var i = pos; i < end; i++) {
-    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
-  }
-
-  return (crc ^ (-1)); // >>> 0;
-}
-
-
-module.exports = crc32;
-
-},{}],31:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-var utils   = require('../utils/common');
-var trees   = require('./trees');
-var adler32 = require('./adler32');
-var crc32   = require('./crc32');
-var msg     = require('./messages');
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-
-/* Allowed flush values; see deflate() and inflate() below for details */
-var Z_NO_FLUSH      = 0;
-var Z_PARTIAL_FLUSH = 1;
-//var Z_SYNC_FLUSH    = 2;
-var Z_FULL_FLUSH    = 3;
-var Z_FINISH        = 4;
-var Z_BLOCK         = 5;
-//var Z_TREES         = 6;
-
-
-/* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
-var Z_OK            = 0;
-var Z_STREAM_END    = 1;
-//var Z_NEED_DICT     = 2;
-//var Z_ERRNO         = -1;
-var Z_STREAM_ERROR  = -2;
-var Z_DATA_ERROR    = -3;
-//var Z_MEM_ERROR     = -4;
-var Z_BUF_ERROR     = -5;
-//var Z_VERSION_ERROR = -6;
-
-
-/* compression levels */
-//var Z_NO_COMPRESSION      = 0;
-//var Z_BEST_SPEED          = 1;
-//var Z_BEST_COMPRESSION    = 9;
-var Z_DEFAULT_COMPRESSION = -1;
-
-
-var Z_FILTERED            = 1;
-var Z_HUFFMAN_ONLY        = 2;
-var Z_RLE                 = 3;
-var Z_FIXED               = 4;
-var Z_DEFAULT_STRATEGY    = 0;
-
-/* Possible values of the data_type field (though see inflate()) */
-//var Z_BINARY              = 0;
-//var Z_TEXT                = 1;
-//var Z_ASCII               = 1; // = Z_TEXT
-var Z_UNKNOWN             = 2;
-
-
-/* The deflate compression method */
-var Z_DEFLATED  = 8;
-
-/*============================================================================*/
-
-
-var MAX_MEM_LEVEL = 9;
-/* Maximum value for memLevel in deflateInit2 */
-var MAX_WBITS = 15;
-/* 32K LZ77 window */
-var DEF_MEM_LEVEL = 8;
-
-
-var LENGTH_CODES  = 29;
-/* number of length codes, not counting the special END_BLOCK code */
-var LITERALS      = 256;
-/* number of literal bytes 0..255 */
-var L_CODES       = LITERALS + 1 + LENGTH_CODES;
-/* number of Literal or Length codes, including the END_BLOCK code */
-var D_CODES       = 30;
-/* number of distance codes */
-var BL_CODES      = 19;
-/* number of codes used to transfer the bit lengths */
-var HEAP_SIZE     = 2 * L_CODES + 1;
-/* maximum heap size */
-var MAX_BITS  = 15;
-/* All codes must not exceed MAX_BITS bits */
-
-var MIN_MATCH = 3;
-var MAX_MATCH = 258;
-var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
-
-var PRESET_DICT = 0x20;
-
-var INIT_STATE = 42;
-var EXTRA_STATE = 69;
-var NAME_STATE = 73;
-var COMMENT_STATE = 91;
-var HCRC_STATE = 103;
-var BUSY_STATE = 113;
-var FINISH_STATE = 666;
-
-var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
-var BS_BLOCK_DONE     = 2; /* block flush performed */
-var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
-var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
-
-var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
-
-function err(strm, errorCode) {
-  strm.msg = msg[errorCode];
-  return errorCode;
-}
-
-function rank(f) {
-  return ((f) << 1) - ((f) > 4 ? 9 : 0);
-}
-
-function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
-
-
-/* =========================================================================
- * Flush as much pending output as possible. All deflate() output goes
- * through this function so some applications may wish to modify it
- * to avoid allocating a large strm->output buffer and copying into it.
- * (See also read_buf()).
- */
-function flush_pending(strm) {
-  var s = strm.state;
-
-  //_tr_flush_bits(s);
-  var len = s.pending;
-  if (len > strm.avail_out) {
-    len = strm.avail_out;
-  }
-  if (len === 0) { return; }
-
-  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
-  strm.next_out += len;
-  s.pending_out += len;
-  strm.total_out += len;
-  strm.avail_out -= len;
-  s.pending -= len;
-  if (s.pending === 0) {
-    s.pending_out = 0;
-  }
-}
-
-
-function flush_block_only(s, last) {
-  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
-  s.block_start = s.strstart;
-  flush_pending(s.strm);
-}
-
-
-function put_byte(s, b) {
-  s.pending_buf[s.pending++] = b;
-}
-
-
-/* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
-function putShortMSB(s, b) {
-//  put_byte(s, (Byte)(b >> 8));
-//  put_byte(s, (Byte)(b & 0xff));
-  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
-  s.pending_buf[s.pending++] = b & 0xff;
-}
-
-
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read.  All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->input buffer and copying from it.
- * (See also flush_pending()).
- */
-function read_buf(strm, buf, start, size) {
-  var len = strm.avail_in;
-
-  if (len > size) { len = size; }
-  if (len === 0) { return 0; }
-
-  strm.avail_in -= len;
-
-  // zmemcpy(buf, strm->next_in, len);
-  utils.arraySet(buf, strm.input, strm.next_in, len, start);
-  if (strm.state.wrap === 1) {
-    strm.adler = adler32(strm.adler, buf, len, start);
-  }
-
-  else if (strm.state.wrap === 2) {
-    strm.adler = crc32(strm.adler, buf, len, start);
-  }
-
-  strm.next_in += len;
-  strm.total_in += len;
-
-  return len;
-}
-
-
-/* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
-function longest_match(s, cur_match) {
-  var chain_length = s.max_chain_length;      /* max hash chain length */
-  var scan = s.strstart; /* current string */
-  var match;                       /* matched string */
-  var len;                           /* length of current match */
-  var best_len = s.prev_length;              /* best match length so far */
-  var nice_match = s.nice_match;             /* stop if match long enough */
-  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
-      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
-
-  var _win = s.window; // shortcut
-
-  var wmask = s.w_mask;
-  var prev  = s.prev;
-
-  /* Stop when cur_match becomes <= limit. To simplify the code,
-   * we prevent matches with the string of window index 0.
-   */
-
-  var strend = s.strstart + MAX_MATCH;
-  var scan_end1  = _win[scan + best_len - 1];
-  var scan_end   = _win[scan + best_len];
-
-  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
-   * It is easy to get rid of this optimization if necessary.
-   */
-  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
-  /* Do not waste too much time if we already have a good match: */
-  if (s.prev_length >= s.good_match) {
-    chain_length >>= 2;
-  }
-  /* Do not look for matches beyond the end of the input. This is necessary
-   * to make deflate deterministic.
-   */
-  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
-
-  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
-  do {
-    // Assert(cur_match < s->strstart, "no future");
-    match = cur_match;
-
-    /* Skip to next match if the match length cannot increase
-     * or if the match length is less than 2.  Note that the checks below
-     * for insufficient lookahead only occur occasionally for performance
-     * reasons.  Therefore uninitialized memory will be accessed, and
-     * conditional jumps will be made that depend on those values.
-     * However the length of the match is limited to the lookahead, so
-     * the output of deflate is not affected by the uninitialized values.
-     */
-
-    if (_win[match + best_len]     !== scan_end  ||
-        _win[match + best_len - 1] !== scan_end1 ||
-        _win[match]                !== _win[scan] ||
-        _win[++match]              !== _win[scan + 1]) {
-      continue;
-    }
-
-    /* The check at best_len-1 can be removed because it will be made
-     * again later. (This heuristic is not always a win.)
-     * It is not necessary to compare scan[2] and match[2] since they
-     * are always equal when the other bytes match, given that
-     * the hash keys are equal and that HASH_BITS >= 8.
-     */
-    scan += 2;
-    match++;
-    // Assert(*scan == *match, "match[2]?");
-
-    /* We check for insufficient lookahead only every 8th comparison;
-     * the 256th check will be made at strstart+258.
-     */
-    do {
-      /*jshint noempty:false*/
-    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
-             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
-             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
-             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
-             scan < strend);
-
-    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
-    len = MAX_MATCH - (strend - scan);
-    scan = strend - MAX_MATCH;
-
-    if (len > best_len) {
-      s.match_start = cur_match;
-      best_len = len;
-      if (len >= nice_match) {
-        break;
-      }
-      scan_end1  = _win[scan + best_len - 1];
-      scan_end   = _win[scan + best_len];
-    }
-  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
-
-  if (best_len <= s.lookahead) {
-    return best_len;
-  }
-  return s.lookahead;
-}
-
-
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- *    At least one byte has been read, or avail_in == 0; reads are
- *    performed for at least two bytes (required for the zip translate_eol
- *    option -- not supported here).
- */
-function fill_window(s) {
-  var _w_size = s.w_size;
-  var p, n, m, more, str;
-
-  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
-  do {
-    more = s.window_size - s.lookahead - s.strstart;
-
-    // JS ints have 32 bit, block below not needed
-    /* Deal with !@#$% 64K limit: */
-    //if (sizeof(int) <= 2) {
-    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
-    //        more = wsize;
-    //
-    //  } else if (more == (unsigned)(-1)) {
-    //        /* Very unlikely, but possible on 16 bit machine if
-    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
-    //         */
-    //        more--;
-    //    }
-    //}
-
-
-    /* If the window is almost full and there is insufficient lookahead,
-     * move the upper half to the lower one to make room in the upper half.
-     */
-    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
-
-      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
-      s.match_start -= _w_size;
-      s.strstart -= _w_size;
-      /* we now have strstart >= MAX_DIST */
-      s.block_start -= _w_size;
-
-      /* Slide the hash table (could be avoided with 32 bit values
-       at the expense of memory usage). We slide even when level == 0
-       to keep the hash table consistent if we switch back to level > 0
-       later. (Using level 0 permanently is not an optimal usage of
-       zlib, so we don't care about this pathological case.)
-       */
-
-      n = s.hash_size;
-      p = n;
-      do {
-        m = s.head[--p];
-        s.head[p] = (m >= _w_size ? m - _w_size : 0);
-      } while (--n);
-
-      n = _w_size;
-      p = n;
-      do {
-        m = s.prev[--p];
-        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
-        /* If n is not on any hash chain, prev[n] is garbage but
-         * its value will never be used.
-         */
-      } while (--n);
-
-      more += _w_size;
-    }
-    if (s.strm.avail_in === 0) {
-      break;
-    }
-
-    /* If there was no sliding:
-     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
-     *    more == window_size - lookahead - strstart
-     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
-     * => more >= window_size - 2*WSIZE + 2
-     * In the BIG_MEM or MMAP case (not yet supported),
-     *   window_size == input_size + MIN_LOOKAHEAD  &&
-     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
-     * Otherwise, window_size == 2*WSIZE so more >= 2.
-     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
-     */
-    //Assert(more >= 2, "more < 2");
-    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
-    s.lookahead += n;
-
-    /* Initialize the hash value now that we have some input: */
-    if (s.lookahead + s.insert >= MIN_MATCH) {
-      str = s.strstart - s.insert;
-      s.ins_h = s.window[str];
-
-      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
-      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
-//#if MIN_MATCH != 3
-//        Call update_hash() MIN_MATCH-3 more times
-//#endif
-      while (s.insert) {
-        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
-        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
-
-        s.prev[str & s.w_mask] = s.head[s.ins_h];
-        s.head[s.ins_h] = str;
-        str++;
-        s.insert--;
-        if (s.lookahead + s.insert < MIN_MATCH) {
-          break;
-        }
-      }
-    }
-    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
-     * but this is not important since only literal bytes will be emitted.
-     */
-
-  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
-
-  /* If the WIN_INIT bytes after the end of the current data have never been
-   * written, then zero those bytes in order to avoid memory check reports of
-   * the use of uninitialized (or uninitialised as Julian writes) bytes by
-   * the longest match routines.  Update the high water mark for the next
-   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
-   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
-   */
-//  if (s.high_water < s.window_size) {
-//    var curr = s.strstart + s.lookahead;
-//    var init = 0;
-//
-//    if (s.high_water < curr) {
-//      /* Previous high water mark below current data -- zero WIN_INIT
-//       * bytes or up to end of window, whichever is less.
-//       */
-//      init = s.window_size - curr;
-//      if (init > WIN_INIT)
-//        init = WIN_INIT;
-//      zmemzero(s->window + curr, (unsigned)init);
-//      s->high_water = curr + init;
-//    }
-//    else if (s->high_water < (ulg)curr + WIN_INIT) {
-//      /* High water mark at or above current data, but below current data
-//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
-//       * to end of window, whichever is less.
-//       */
-//      init = (ulg)curr + WIN_INIT - s->high_water;
-//      if (init > s->window_size - s->high_water)
-//        init = s->window_size - s->high_water;
-//      zmemzero(s->window + s->high_water, (unsigned)init);
-//      s->high_water += init;
-//    }
-//  }
-//
-//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
-//    "not enough room for search");
-}
-
-/* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- * This function does not insert new strings in the dictionary since
- * uncompressible data is probably not useful. This function is used
- * only for the level=0 compression option.
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
-function deflate_stored(s, flush) {
-  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
-   * to pending_buf_size, and each stored block has a 5 byte header:
-   */
-  var max_block_size = 0xffff;
-
-  if (max_block_size > s.pending_buf_size - 5) {
-    max_block_size = s.pending_buf_size - 5;
-  }
-
-  /* Copy as much as possible from input to output: */
-  for (;;) {
-    /* Fill the window as much as possible: */
-    if (s.lookahead <= 1) {
-
-      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
-      //  s->block_start >= (long)s->w_size, "slide too late");
-//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
-//        s.block_start >= s.w_size)) {
-//        throw  new Error("slide too late");
-//      }
-
-      fill_window(s);
-      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
-        return BS_NEED_MORE;
-      }
-
-      if (s.lookahead === 0) {
-        break;
-      }
-      /* flush the current block */
-    }
-    //Assert(s->block_start >= 0L, "block gone");
-//    if (s.block_start < 0) throw new Error("block gone");
-
-    s.strstart += s.lookahead;
-    s.lookahead = 0;
-
-    /* Emit a stored block if pending_buf will be full: */
-    var max_start = s.block_start + max_block_size;
-
-    if (s.strstart === 0 || s.strstart >= max_start) {
-      /* strstart == 0 is possible when wraparound on 16-bit machine */
-      s.lookahead = s.strstart - max_start;
-      s.strstart = max_start;
-      /*** FLUSH_BLOCK(s, 0); ***/
-      flush_block_only(s, false);
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-      /***/
-
-
-    }
-    /* Flush if we may have to slide, otherwise block_start may become
-     * negative and the data will be gone:
-     */
-    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
-      /*** FLUSH_BLOCK(s, 0); ***/
-      flush_block_only(s, false);
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-      /***/
-    }
-  }
-
-  s.insert = 0;
-
-  if (flush === Z_FINISH) {
-    /*** FLUSH_BLOCK(s, 1); ***/
-    flush_block_only(s, true);
-    if (s.strm.avail_out === 0) {
-      return BS_FINISH_STARTED;
-    }
-    /***/
-    return BS_FINISH_DONE;
-  }
-
-  if (s.strstart > s.block_start) {
-    /*** FLUSH_BLOCK(s, 0); ***/
-    flush_block_only(s, false);
-    if (s.strm.avail_out === 0) {
-      return BS_NEED_MORE;
-    }
-    /***/
-  }
-
-  return BS_NEED_MORE;
-}
-
-/* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
-function deflate_fast(s, flush) {
-  var hash_head;        /* head of the hash chain */
-  var bflush;           /* set if current block must be flushed */
-
-  for (;;) {
-    /* Make sure that we always have enough lookahead, except
-     * at the end of the input file. We need MAX_MATCH bytes
-     * for the next match, plus MIN_MATCH bytes to insert the
-     * string following the next match.
-     */
-    if (s.lookahead < MIN_LOOKAHEAD) {
-      fill_window(s);
-      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
-        return BS_NEED_MORE;
-      }
-      if (s.lookahead === 0) {
-        break; /* flush the current block */
-      }
-    }
-
-    /* Insert the string window[strstart .. strstart+2] in the
-     * dictionary, and set hash_head to the head of the hash chain:
-     */
-    hash_head = 0/*NIL*/;
-    if (s.lookahead >= MIN_MATCH) {
-      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
-      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
-      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
-      s.head[s.ins_h] = s.strstart;
-      /***/
-    }
-
-    /* Find the longest match, discarding those <= prev_length.
-     * At this point we have always match_length < MIN_MATCH
-     */
-    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
-      /* To simplify the code, we prevent matches with the string
-       * of window index 0 (in particular we have to avoid a match
-       * of the string with itself at the start of the input file).
-       */
-      s.match_length = longest_match(s, hash_head);
-      /* longest_match() sets match_start */
-    }
-    if (s.match_length >= MIN_MATCH) {
-      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
-
-      /*** _tr_tally_dist(s, s.strstart - s.match_start,
-                     s.match_length - MIN_MATCH, bflush); ***/
-      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
-
-      s.lookahead -= s.match_length;
-
-      /* Insert new strings in the hash table only if the match length
-       * is not too large. This saves time but degrades compression.
-       */
-      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
-        s.match_length--; /* string at strstart already in table */
-        do {
-          s.strstart++;
-          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
-          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
-          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
-          s.head[s.ins_h] = s.strstart;
-          /***/
-          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
-           * always MIN_MATCH bytes ahead.
-           */
-        } while (--s.match_length !== 0);
-        s.strstart++;
-      } else
-      {
-        s.strstart += s.match_length;
-        s.match_length = 0;
-        s.ins_h = s.window[s.strstart];
-        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
-        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
-
-//#if MIN_MATCH != 3
-//                Call UPDATE_HASH() MIN_MATCH-3 more times
-//#endif
-        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
-         * matter since it will be recomputed at next deflate call.
-         */
-      }
-    } else {
-      /* No match, output a literal byte */
-      //Tracevv((stderr,"%c", s.window[s.strstart]));
-      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
-      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
-
-      s.lookahead--;
-      s.strstart++;
-    }
-    if (bflush) {
-      /*** FLUSH_BLOCK(s, 0); ***/
-      flush_block_only(s, false);
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-      /***/
-    }
-  }
-  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
-  if (flush === Z_FINISH) {
-    /*** FLUSH_BLOCK(s, 1); ***/
-    flush_block_only(s, true);
-    if (s.strm.avail_out === 0) {
-      return BS_FINISH_STARTED;
-    }
-    /***/
-    return BS_FINISH_DONE;
-  }
-  if (s.last_lit) {
-    /*** FLUSH_BLOCK(s, 0); ***/
-    flush_block_only(s, false);
-    if (s.strm.avail_out === 0) {
-      return BS_NEED_MORE;
-    }
-    /***/
-  }
-  return BS_BLOCK_DONE;
-}
-
-/* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
-function deflate_slow(s, flush) {
-  var hash_head;          /* head of hash chain */
-  var bflush;              /* set if current block must be flushed */
-
-  var max_insert;
-
-  /* Process the input block. */
-  for (;;) {
-    /* Make sure that we always have enough lookahead, except
-     * at the end of the input file. We need MAX_MATCH bytes
-     * for the next match, plus MIN_MATCH bytes to insert the
-     * string following the next match.
-     */
-    if (s.lookahead < MIN_LOOKAHEAD) {
-      fill_window(s);
-      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
-        return BS_NEED_MORE;
-      }
-      if (s.lookahead === 0) { break; } /* flush the current block */
-    }
-
-    /* Insert the string window[strstart .. strstart+2] in the
-     * dictionary, and set hash_head to the head of the hash chain:
-     */
-    hash_head = 0/*NIL*/;
-    if (s.lookahead >= MIN_MATCH) {
-      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
-      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
-      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
-      s.head[s.ins_h] = s.strstart;
-      /***/
-    }
-
-    /* Find the longest match, discarding those <= prev_length.
-     */
-    s.prev_length = s.match_length;
-    s.prev_match = s.match_start;
-    s.match_length = MIN_MATCH - 1;
-
-    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
-        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
-      /* To simplify the code, we prevent matches with the string
-       * of window index 0 (in particular we have to avoid a match
-       * of the string with itself at the start of the input file).
-       */
-      s.match_length = longest_match(s, hash_head);
-      /* longest_match() sets match_start */
-
-      if (s.match_length <= 5 &&
-         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
-
-        /* If prev_match is also MIN_MATCH, match_start is garbage
-         * but we will ignore the current match anyway.
-         */
-        s.match_length = MIN_MATCH - 1;
-      }
-    }
-    /* If there was a match at the previous step and the current
-     * match is not better, output the previous match:
-     */
-    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
-      max_insert = s.strstart + s.lookahead - MIN_MATCH;
-      /* Do not insert strings in hash table beyond this. */
-
-      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
-
-      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
-                     s.prev_length - MIN_MATCH, bflush);***/
-      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
-      /* Insert in hash table all strings up to the end of the match.
-       * strstart-1 and strstart are already inserted. If there is not
-       * enough lookahead, the last two strings are not inserted in
-       * the hash table.
-       */
-      s.lookahead -= s.prev_length - 1;
-      s.prev_length -= 2;
-      do {
-        if (++s.strstart <= max_insert) {
-          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
-          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
-          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
-          s.head[s.ins_h] = s.strstart;
-          /***/
-        }
-      } while (--s.prev_length !== 0);
-      s.match_available = 0;
-      s.match_length = MIN_MATCH - 1;
-      s.strstart++;
-
-      if (bflush) {
-        /*** FLUSH_BLOCK(s, 0); ***/
-        flush_block_only(s, false);
-        if (s.strm.avail_out === 0) {
-          return BS_NEED_MORE;
-        }
-        /***/
-      }
-
-    } else if (s.match_available) {
-      /* If there was no match at the previous position, output a
-       * single literal. If there was a match but the current match
-       * is longer, truncate the previous match to a single literal.
-       */
-      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
-      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
-      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
-
-      if (bflush) {
-        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
-        flush_block_only(s, false);
-        /***/
-      }
-      s.strstart++;
-      s.lookahead--;
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-    } else {
-      /* There is no previous match to compare with, wait for
-       * the next step to decide.
-       */
-      s.match_available = 1;
-      s.strstart++;
-      s.lookahead--;
-    }
-  }
-  //Assert (flush != Z_NO_FLUSH, "no flush?");
-  if (s.match_available) {
-    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
-    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
-    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
-
-    s.match_available = 0;
-  }
-  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
-  if (flush === Z_FINISH) {
-    /*** FLUSH_BLOCK(s, 1); ***/
-    flush_block_only(s, true);
-    if (s.strm.avail_out === 0) {
-      return BS_FINISH_STARTED;
-    }
-    /***/
-    return BS_FINISH_DONE;
-  }
-  if (s.last_lit) {
-    /*** FLUSH_BLOCK(s, 0); ***/
-    flush_block_only(s, false);
-    if (s.strm.avail_out === 0) {
-      return BS_NEED_MORE;
-    }
-    /***/
-  }
-
-  return BS_BLOCK_DONE;
-}
-
-
-/* ===========================================================================
- * For Z_RLE, simply look for runs of bytes, generate matches only of distance
- * one.  Do not maintain a hash table.  (It will be regenerated if this run of
- * deflate switches away from Z_RLE.)
- */
-function deflate_rle(s, flush) {
-  var bflush;            /* set if current block must be flushed */
-  var prev;              /* byte at distance one to match */
-  var scan, strend;      /* scan goes up to strend for length of run */
-
-  var _win = s.window;
-
-  for (;;) {
-    /* Make sure that we always have enough lookahead, except
-     * at the end of the input file. We need MAX_MATCH bytes
-     * for the longest run, plus one for the unrolled loop.
-     */
-    if (s.lookahead <= MAX_MATCH) {
-      fill_window(s);
-      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
-        return BS_NEED_MORE;
-      }
-      if (s.lookahead === 0) { break; } /* flush the current block */
-    }
-
-    /* See how many times the previous byte repeats */
-    s.match_length = 0;
-    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
-      scan = s.strstart - 1;
-      prev = _win[scan];
-      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
-        strend = s.strstart + MAX_MATCH;
-        do {
-          /*jshint noempty:false*/
-        } while (prev === _win[++scan] && prev === _win[++scan] &&
-                 prev === _win[++scan] && prev === _win[++scan] &&
-                 prev === _win[++scan] && prev === _win[++scan] &&
-                 prev === _win[++scan] && prev === _win[++scan] &&
-                 scan < strend);
-        s.match_length = MAX_MATCH - (strend - scan);
-        if (s.match_length > s.lookahead) {
-          s.match_length = s.lookahead;
-        }
-      }
-      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
-    }
-
-    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
-    if (s.match_length >= MIN_MATCH) {
-      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
-
-      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
-      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
-
-      s.lookahead -= s.match_length;
-      s.strstart += s.match_length;
-      s.match_length = 0;
-    } else {
-      /* No match, output a literal byte */
-      //Tracevv((stderr,"%c", s->window[s->strstart]));
-      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
-      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
-
-      s.lookahead--;
-      s.strstart++;
-    }
-    if (bflush) {
-      /*** FLUSH_BLOCK(s, 0); ***/
-      flush_block_only(s, false);
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-      /***/
-    }
-  }
-  s.insert = 0;
-  if (flush === Z_FINISH) {
-    /*** FLUSH_BLOCK(s, 1); ***/
-    flush_block_only(s, true);
-    if (s.strm.avail_out === 0) {
-      return BS_FINISH_STARTED;
-    }
-    /***/
-    return BS_FINISH_DONE;
-  }
-  if (s.last_lit) {
-    /*** FLUSH_BLOCK(s, 0); ***/
-    flush_block_only(s, false);
-    if (s.strm.avail_out === 0) {
-      return BS_NEED_MORE;
-    }
-    /***/
-  }
-  return BS_BLOCK_DONE;
-}
-
-/* ===========================================================================
- * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
- * (It will be regenerated if this run of deflate switches away from Huffman.)
- */
-function deflate_huff(s, flush) {
-  var bflush;             /* set if current block must be flushed */
-
-  for (;;) {
-    /* Make sure that we have a literal to write. */
-    if (s.lookahead === 0) {
-      fill_window(s);
-      if (s.lookahead === 0) {
-        if (flush === Z_NO_FLUSH) {
-          return BS_NEED_MORE;
-        }
-        break;      /* flush the current block */
-      }
-    }
-
-    /* Output a literal byte */
-    s.match_length = 0;
-    //Tracevv((stderr,"%c", s->window[s->strstart]));
-    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
-    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
-    s.lookahead--;
-    s.strstart++;
-    if (bflush) {
-      /*** FLUSH_BLOCK(s, 0); ***/
-      flush_block_only(s, false);
-      if (s.strm.avail_out === 0) {
-        return BS_NEED_MORE;
-      }
-      /***/
-    }
-  }
-  s.insert = 0;
-  if (flush === Z_FINISH) {
-    /*** FLUSH_BLOCK(s, 1); ***/
-    flush_block_only(s, true);
-    if (s.strm.avail_out === 0) {
-      return BS_FINISH_STARTED;
-    }
-    /***/
-    return BS_FINISH_DONE;
-  }
-  if (s.last_lit) {
-    /*** FLUSH_BLOCK(s, 0); ***/
-    flush_block_only(s, false);
-    if (s.strm.avail_out === 0) {
-      return BS_NEED_MORE;
-    }
-    /***/
-  }
-  return BS_BLOCK_DONE;
-}
-
-/* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
-function Config(good_length, max_lazy, nice_length, max_chain, func) {
-  this.good_length = good_length;
-  this.max_lazy = max_lazy;
-  this.nice_length = nice_length;
-  this.max_chain = max_chain;
-  this.func = func;
-}
-
-var configuration_table;
-
-configuration_table = [
-  /*      good lazy nice chain */
-  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
-  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
-  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
-  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
-
-  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
-  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
-  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
-  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
-  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
-  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
-];
-
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-function lm_init(s) {
-  s.window_size = 2 * s.w_size;
-
-  /*** CLEAR_HASH(s); ***/
-  zero(s.head); // Fill with NIL (= 0);
-
-  /* Set the default configuration parameters:
-   */
-  s.max_lazy_match = configuration_table[s.level].max_lazy;
-  s.good_match = configuration_table[s.level].good_length;
-  s.nice_match = configuration_table[s.level].nice_length;
-  s.max_chain_length = configuration_table[s.level].max_chain;
-
-  s.strstart = 0;
-  s.block_start = 0;
-  s.lookahead = 0;
-  s.insert = 0;
-  s.match_length = s.prev_length = MIN_MATCH - 1;
-  s.match_available = 0;
-  s.ins_h = 0;
-}
-
-
-function DeflateState() {
-  this.strm = null;            /* pointer back to this zlib stream */
-  this.status = 0;            /* as the name implies */
-  this.pending_buf = null;      /* output still pending */
-  this.pending_buf_size = 0;  /* size of pending_buf */
-  this.pending_out = 0;       /* next pending byte to output to the stream */
-  this.pending = 0;           /* nb of bytes in the pending buffer */
-  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
-  this.gzhead = null;         /* gzip header information to write */
-  this.gzindex = 0;           /* where in extra, name, or comment */
-  this.method = Z_DEFLATED; /* can only be DEFLATED */
-  this.last_flush = -1;   /* value of flush param for previous deflate call */
-
-  this.w_size = 0;  /* LZ77 window size (32K by default) */
-  this.w_bits = 0;  /* log2(w_size)  (8..16) */
-  this.w_mask = 0;  /* w_size - 1 */
-
-  this.window = null;
-  /* Sliding window. Input bytes are read into the second half of the window,
-   * and move to the first half later to keep a dictionary of at least wSize
-   * bytes. With this organization, matches are limited to a distance of
-   * wSize-MAX_MATCH bytes, but this ensures that IO is always
-   * performed with a length multiple of the block size.
-   */
-
-  this.window_size = 0;
-  /* Actual size of window: 2*wSize, except when the user input buffer
-   * is directly used as sliding window.
-   */
-
-  this.prev = null;
-  /* Link to older string with same hash index. To limit the size of this
-   * array to 64K, this link is maintained only for the last 32K strings.
-   * An index in this array is thus a window index modulo 32K.
-   */
-
-  this.head = null;   /* Heads of the hash chains or NIL. */
-
-  this.ins_h = 0;       /* hash index of string to be inserted */
-  this.hash_size = 0;   /* number of elements in hash table */
-  this.hash_bits = 0;   /* log2(hash_size) */
-  this.hash_mask = 0;   /* hash_size-1 */
-
-  this.hash_shift = 0;
-  /* Number of bits by which ins_h must be shifted at each input
-   * step. It must be such that after MIN_MATCH steps, the oldest
-   * byte no longer takes part in the hash key, that is:
-   *   hash_shift * MIN_MATCH >= hash_bits
-   */
-
-  this.block_start = 0;
-  /* Window position at the beginning of the current output block. Gets
-   * negative when the window is moved backwards.
-   */
-
-  this.match_length = 0;      /* length of best match */
-  this.prev_match = 0;        /* previous match */
-  this.match_available = 0;   /* set if previous match exists */
-  this.strstart = 0;          /* start of string to insert */
-  this.match_start = 0;       /* start of matching string */
-  this.lookahead = 0;         /* number of valid bytes ahead in window */
-
-  this.prev_length = 0;
-  /* Length of the best match at previous step. Matches not greater than this
-   * are discarded. This is used in the lazy match evaluation.
-   */
-
-  this.max_chain_length = 0;
-  /* To speed up deflation, hash chains are never searched beyond this
-   * length.  A higher limit improves compression ratio but degrades the
-   * speed.
-   */
-
-  this.max_lazy_match = 0;
-  /* Attempt to find a better match only when the current match is strictly
-   * smaller than this value. This mechanism is used only for compression
-   * levels >= 4.
-   */
-  // That's alias to max_lazy_match, don't use directly
-  //this.max_insert_length = 0;
-  /* Insert new strings in the hash table only if the match length is not
-   * greater than this length. This saves time but degrades compression.
-   * max_insert_length is used only for compression levels <= 3.
-   */
-
-  this.level = 0;     /* compression level (1..9) */
-  this.strategy = 0;  /* favor or force Huffman coding*/
-
-  this.good_match = 0;
-  /* Use a faster search when the previous match is longer than this */
-
-  this.nice_match = 0; /* Stop searching when current match exceeds this */
-
-              /* used by trees.c: */
-
-  /* Didn't use ct_data typedef below to suppress compiler warning */
-
-  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
-  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
-  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
-
-  // Use flat array of DOUBLE size, with interleaved fata,
-  // because JS does not support effective
-  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
-  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
-  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
-  zero(this.dyn_ltree);
-  zero(this.dyn_dtree);
-  zero(this.bl_tree);
-
-  this.l_desc   = null;         /* desc. for literal tree */
-  this.d_desc   = null;         /* desc. for distance tree */
-  this.bl_desc  = null;         /* desc. for bit length tree */
-
-  //ush bl_count[MAX_BITS+1];
-  this.bl_count = new utils.Buf16(MAX_BITS + 1);
-  /* number of codes at each bit length for an optimal tree */
-
-  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
-  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
-  zero(this.heap);
-
-  this.heap_len = 0;               /* number of elements in the heap */
-  this.heap_max = 0;               /* element of largest frequency */
-  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
-   * The same heap array is used to build all trees.
-   */
-
-  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
-  zero(this.depth);
-  /* Depth of each subtree used as tie breaker for trees of equal frequency
-   */
-
-  this.l_buf = 0;          /* buffer index for literals or lengths */
-
-  this.lit_bufsize = 0;
-  /* Size of match buffer for literals/lengths.  There are 4 reasons for
-   * limiting lit_bufsize to 64K:
-   *   - frequencies can be kept in 16 bit counters
-   *   - if compression is not successful for the first block, all input
-   *     data is still in the window so we can still emit a stored block even
-   *     when input comes from standard input.  (This can also be done for
-   *     all blocks if lit_bufsize is not greater than 32K.)
-   *   - if compression is not successful for a file smaller than 64K, we can
-   *     even emit a stored file instead of a stored block (saving 5 bytes).
-   *     This is applicable only for zip (not gzip or zlib).
-   *   - creating new Huffman trees less frequently may not provide fast
-   *     adaptation to changes in the input data statistics. (Take for
-   *     example a binary file with poorly compressible code followed by
-   *     a highly compressible string table.) Smaller buffer sizes give
-   *     fast adaptation but have of course the overhead of transmitting
-   *     trees more frequently.
-   *   - I can't count above 4
-   */
-
-  this.last_lit = 0;      /* running index in l_buf */
-
-  this.d_buf = 0;
-  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
-   * the same number of elements. To use different lengths, an extra flag
-   * array would be necessary.
-   */
-
-  this.opt_len = 0;       /* bit length of current block with optimal trees */
-  this.static_len = 0;    /* bit length of current block with static trees */
-  this.matches = 0;       /* number of string matches in current block */
-  this.insert = 0;        /* bytes at end of window left to insert */
-
-
-  this.bi_buf = 0;
-  /* Output buffer. bits are inserted starting at the bottom (least
-   * significant bits).
-   */
-  this.bi_valid = 0;
-  /* Number of valid bits in bi_buf.  All bits above the last valid bit
-   * are always zero.
-   */
-
-  // Used for window memory init. We safely ignore it for JS. That makes
-  // sense only for pointers and memory check tools.
-  //this.high_water = 0;
-  /* High water mark offset in window for initialized bytes -- bytes above
-   * this are set to zero in order to avoid memory check warnings when
-   * longest match routines access bytes past the input.  This is then
-   * updated to the new high water mark.
-   */
-}
-
-
-function deflateResetKeep(strm) {
-  var s;
-
-  if (!strm || !strm.state) {
-    return err(strm, Z_STREAM_ERROR);
-  }
-
-  strm.total_in = strm.total_out = 0;
-  strm.data_type = Z_UNKNOWN;
-
-  s = strm.state;
-  s.pending = 0;
-  s.pending_out = 0;
-
-  if (s.wrap < 0) {
-    s.wrap = -s.wrap;
-    /* was made negative by deflate(..., Z_FINISH); */
-  }
-  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
-  strm.adler = (s.wrap === 2) ?
-    0  // crc32(0, Z_NULL, 0)
-  :
-    1; // adler32(0, Z_NULL, 0)
-  s.last_flush = Z_NO_FLUSH;
-  trees._tr_init(s);
-  return Z_OK;
-}
-
-
-function deflateReset(strm) {
-  var ret = deflateResetKeep(strm);
-  if (ret === Z_OK) {
-    lm_init(strm.state);
-  }
-  return ret;
-}
-
-
-function deflateSetHeader(strm, head) {
-  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
-  strm.state.gzhead = head;
-  return Z_OK;
-}
-
-
-function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
-  if (!strm) { // === Z_NULL
-    return Z_STREAM_ERROR;
-  }
-  var wrap = 1;
-
-  if (level === Z_DEFAULT_COMPRESSION) {
-    level = 6;
-  }
-
-  if (windowBits < 0) { /* suppress zlib wrapper */
-    wrap = 0;
-    windowBits = -windowBits;
-  }
-
-  else if (windowBits > 15) {
-    wrap = 2;           /* write gzip wrapper instead */
-    windowBits -= 16;
-  }
-
-
-  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
-    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
-    strategy < 0 || strategy > Z_FIXED) {
-    return err(strm, Z_STREAM_ERROR);
-  }
-
-
-  if (windowBits === 8) {
-    windowBits = 9;
-  }
-  /* until 256-byte window bug fixed */
-
-  var s = new DeflateState();
-
-  strm.state = s;
-  s.strm = strm;
-
-  s.wrap = wrap;
-  s.gzhead = null;
-  s.w_bits = windowBits;
-  s.w_size = 1 << s.w_bits;
-  s.w_mask = s.w_size - 1;
-
-  s.hash_bits = memLevel + 7;
-  s.hash_size = 1 << s.hash_bits;
-  s.hash_mask = s.hash_size - 1;
-  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
-
-  s.window = new utils.Buf8(s.w_size * 2);
-  s.head = new utils.Buf16(s.hash_size);
-  s.prev = new utils.Buf16(s.w_size);
-
-  // Don't need mem init magic for JS.
-  //s.high_water = 0;  /* nothing written to s->window yet */
-
-  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
-  s.pending_buf_size = s.lit_bufsize * 4;
-
-  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
-  //s->pending_buf = (uchf *) overlay;
-  s.pending_buf = new utils.Buf8(s.pending_buf_size);
-
-  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
-  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
-  s.d_buf = 1 * s.lit_bufsize;
-
-  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
-  s.l_buf = (1 + 2) * s.lit_bufsize;
-
-  s.level = level;
-  s.strategy = strategy;
-  s.method = method;
-
-  return deflateReset(strm);
-}
-
-function deflateInit(strm, level) {
-  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
-}
-
-
-function deflate(strm, flush) {
-  var old_flush, s;
-  var beg, val; // for gzip header write only
-
-  if (!strm || !strm.state ||
-    flush > Z_BLOCK || flush < 0) {
-    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
-  }
-
-  s = strm.state;
-
-  if (!strm.output ||
-      (!strm.input && strm.avail_in !== 0) ||
-      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
-    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
-  }
-
-  s.strm = strm; /* just in case */
-  old_flush = s.last_flush;
-  s.last_flush = flush;
-
-  /* Write the header */
-  if (s.status === INIT_STATE) {
-
-    if (s.wrap === 2) { // GZIP header
-      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
-      put_byte(s, 31);
-      put_byte(s, 139);
-      put_byte(s, 8);
-      if (!s.gzhead) { // s->gzhead == Z_NULL
-        put_byte(s, 0);
-        put_byte(s, 0);
-        put_byte(s, 0);
-        put_byte(s, 0);
-        put_byte(s, 0);
-        put_byte(s, s.level === 9 ? 2 :
-                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
-                     4 : 0));
-        put_byte(s, OS_CODE);
-        s.status = BUSY_STATE;
-      }
-      else {
-        put_byte(s, (s.gzhead.text ? 1 : 0) +
-                    (s.gzhead.hcrc ? 2 : 0) +
-                    (!s.gzhead.extra ? 0 : 4) +
-                    (!s.gzhead.name ? 0 : 8) +
-                    (!s.gzhead.comment ? 0 : 16)
-        );
-        put_byte(s, s.gzhead.time & 0xff);
-        put_byte(s, (s.gzhead.time >> 8) & 0xff);
-        put_byte(s, (s.gzhead.time >> 16) & 0xff);
-        put_byte(s, (s.gzhead.time >> 24) & 0xff);
-        put_byte(s, s.level === 9 ? 2 :
-                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
-                     4 : 0));
-        put_byte(s, s.gzhead.os & 0xff);
-        if (s.gzhead.extra && s.gzhead.extra.length) {
-          put_byte(s, s.gzhead.extra.length & 0xff);
-          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
-        }
-        if (s.gzhead.hcrc) {
-          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
-        }
-        s.gzindex = 0;
-        s.status = EXTRA_STATE;
-      }
-    }
-    else // DEFLATE header
-    {
-      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
-      var level_flags = -1;
-
-      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
-        level_flags = 0;
-      } else if (s.level < 6) {
-        level_flags = 1;
-      } else if (s.level === 6) {
-        level_flags = 2;
-      } else {
-        level_flags = 3;
-      }
-      header |= (level_flags << 6);
-      if (s.strstart !== 0) { header |= PRESET_DICT; }
-      header += 31 - (header % 31);
-
-      s.status = BUSY_STATE;
-      putShortMSB(s, header);
-
-      /* Save the adler32 of the preset dictionary: */
-      if (s.strstart !== 0) {
-        putShortMSB(s, strm.adler >>> 16);
-        putShortMSB(s, strm.adler & 0xffff);
-      }
-      strm.adler = 1; // adler32(0L, Z_NULL, 0);
-    }
-  }
-
-//#ifdef GZIP
-  if (s.status === EXTRA_STATE) {
-    if (s.gzhead.extra/* != Z_NULL*/) {
-      beg = s.pending;  /* start of bytes to update crc */
-
-      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
-        if (s.pending === s.pending_buf_size) {
-          if (s.gzhead.hcrc && s.pending > beg) {
-            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-          }
-          flush_pending(strm);
-          beg = s.pending;
-          if (s.pending === s.pending_buf_size) {
-            break;
-          }
-        }
-        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
-        s.gzindex++;
-      }
-      if (s.gzhead.hcrc && s.pending > beg) {
-        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-      }
-      if (s.gzindex === s.gzhead.extra.length) {
-        s.gzindex = 0;
-        s.status = NAME_STATE;
-      }
-    }
-    else {
-      s.status = NAME_STATE;
-    }
-  }
-  if (s.status === NAME_STATE) {
-    if (s.gzhead.name/* != Z_NULL*/) {
-      beg = s.pending;  /* start of bytes to update crc */
-      //int val;
-
-      do {
-        if (s.pending === s.pending_buf_size) {
-          if (s.gzhead.hcrc && s.pending > beg) {
-            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-          }
-          flush_pending(strm);
-          beg = s.pending;
-          if (s.pending === s.pending_buf_size) {
-            val = 1;
-            break;
-          }
-        }
-        // JS specific: little magic to add zero terminator to end of string
-        if (s.gzindex < s.gzhead.name.length) {
-          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
-        } else {
-          val = 0;
-        }
-        put_byte(s, val);
-      } while (val !== 0);
-
-      if (s.gzhead.hcrc && s.pending > beg) {
-        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-      }
-      if (val === 0) {
-        s.gzindex = 0;
-        s.status = COMMENT_STATE;
-      }
-    }
-    else {
-      s.status = COMMENT_STATE;
-    }
-  }
-  if (s.status === COMMENT_STATE) {
-    if (s.gzhead.comment/* != Z_NULL*/) {
-      beg = s.pending;  /* start of bytes to update crc */
-      //int val;
-
-      do {
-        if (s.pending === s.pending_buf_size) {
-          if (s.gzhead.hcrc && s.pending > beg) {
-            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-          }
-          flush_pending(strm);
-          beg = s.pending;
-          if (s.pending === s.pending_buf_size) {
-            val = 1;
-            break;
-          }
-        }
-        // JS specific: little magic to add zero terminator to end of string
-        if (s.gzindex < s.gzhead.comment.length) {
-          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
-        } else {
-          val = 0;
-        }
-        put_byte(s, val);
-      } while (val !== 0);
-
-      if (s.gzhead.hcrc && s.pending > beg) {
-        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
-      }
-      if (val === 0) {
-        s.status = HCRC_STATE;
-      }
-    }
-    else {
-      s.status = HCRC_STATE;
-    }
-  }
-  if (s.status === HCRC_STATE) {
-    if (s.gzhead.hcrc) {
-      if (s.pending + 2 > s.pending_buf_size) {
-        flush_pending(strm);
-      }
-      if (s.pending + 2 <= s.pending_buf_size) {
-        put_byte(s, strm.adler & 0xff);
-        put_byte(s, (strm.adler >> 8) & 0xff);
-        strm.adler = 0; //crc32(0L, Z_NULL, 0);
-        s.status = BUSY_STATE;
-      }
-    }
-    else {
-      s.status = BUSY_STATE;
-    }
-  }
-//#endif
-
-  /* Flush as much pending output as possible */
-  if (s.pending !== 0) {
-    flush_pending(strm);
-    if (strm.avail_out === 0) {
-      /* Since avail_out is 0, deflate will be called again with
-       * more output space, but possibly with both pending and
-       * avail_in equal to zero. There won't be anything to do,
-       * but this is not an error situation so make sure we
-       * return OK instead of BUF_ERROR at next call of deflate:
-       */
-      s.last_flush = -1;
-      return Z_OK;
-    }
-
-    /* Make sure there is something to do and avoid duplicate consecutive
-     * flushes. For repeated and useless calls with Z_FINISH, we keep
-     * returning Z_STREAM_END instead of Z_BUF_ERROR.
-     */
-  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
-    flush !== Z_FINISH) {
-    return err(strm, Z_BUF_ERROR);
-  }
-
-  /* User must not provide more input after the first FINISH: */
-  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
-    return err(strm, Z_BUF_ERROR);
-  }
-
-  /* Start a new block or continue the current one.
-   */
-  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
-    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
-    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
-      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
-        configuration_table[s.level].func(s, flush));
-
-    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
-      s.status = FINISH_STATE;
-    }
-    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
-      if (strm.avail_out === 0) {
-        s.last_flush = -1;
-        /* avoid BUF_ERROR next call, see above */
-      }
-      return Z_OK;
-      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
-       * of deflate should use the same flush parameter to make sure
-       * that the flush is complete. So we don't have to output an
-       * empty block here, this will be done at next call. This also
-       * ensures that for a very small output buffer, we emit at most
-       * one empty block.
-       */
-    }
-    if (bstate === BS_BLOCK_DONE) {
-      if (flush === Z_PARTIAL_FLUSH) {
-        trees._tr_align(s);
-      }
-      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
-
-        trees._tr_stored_block(s, 0, 0, false);
-        /* For a full flush, this empty block will be recognized
-         * as a special marker by inflate_sync().
-         */
-        if (flush === Z_FULL_FLUSH) {
-          /*** CLEAR_HASH(s); ***/             /* forget history */
-          zero(s.head); // Fill with NIL (= 0);
-
-          if (s.lookahead === 0) {
-            s.strstart = 0;
-            s.block_start = 0;
-            s.insert = 0;
-          }
-        }
-      }
-      flush_pending(strm);
-      if (strm.avail_out === 0) {
-        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
-        return Z_OK;
-      }
-    }
-  }
-  //Assert(strm->avail_out > 0, "bug2");
-  //if (strm.avail_out <= 0) { throw new Error("bug2");}
-
-  if (flush !== Z_FINISH) { return Z_OK; }
-  if (s.wrap <= 0) { return Z_STREAM_END; }
-
-  /* Write the trailer */
-  if (s.wrap === 2) {
-    put_byte(s, strm.adler & 0xff);
-    put_byte(s, (strm.adler >> 8) & 0xff);
-    put_byte(s, (strm.adler >> 16) & 0xff);
-    put_byte(s, (strm.adler >> 24) & 0xff);
-    put_byte(s, strm.total_in & 0xff);
-    put_byte(s, (strm.total_in >> 8) & 0xff);
-    put_byte(s, (strm.total_in >> 16) & 0xff);
-    put_byte(s, (strm.total_in >> 24) & 0xff);
-  }
-  else
-  {
-    putShortMSB(s, strm.adler >>> 16);
-    putShortMSB(s, strm.adler & 0xffff);
-  }
-
-  flush_pending(strm);
-  /* If avail_out is zero, the application will call deflate again
-   * to flush the rest.
-   */
-  if (s.wrap > 0) { s.wrap = -s.wrap; }
-  /* write the trailer only once! */
-  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
-}
-
-function deflateEnd(strm) {
-  var status;
-
-  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
-    return Z_STREAM_ERROR;
-  }
-
-  status = strm.state.status;
-  if (status !== INIT_STATE &&
-    status !== EXTRA_STATE &&
-    status !== NAME_STATE &&
-    status !== COMMENT_STATE &&
-    status !== HCRC_STATE &&
-    status !== BUSY_STATE &&
-    status !== FINISH_STATE
-  ) {
-    return err(strm, Z_STREAM_ERROR);
-  }
-
-  strm.state = null;
-
-  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
-}
-
-
-/* =========================================================================
- * Initializes the compression dictionary from the given byte
- * sequence without producing any compressed output.
- */
-function deflateSetDictionary(strm, dictionary) {
-  var dictLength = dictionary.length;
-
-  var s;
-  var str, n;
-  var wrap;
-  var avail;
-  var next;
-  var input;
-  var tmpDict;
-
-  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
-    return Z_STREAM_ERROR;
-  }
-
-  s = strm.state;
-  wrap = s.wrap;
-
-  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
-    return Z_STREAM_ERROR;
-  }
-
-  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
-  if (wrap === 1) {
-    /* adler32(strm->adler, dictionary, dictLength); */
-    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
-  }
-
-  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
-
-  /* if dictionary would fill window, just replace the history */
-  if (dictLength >= s.w_size) {
-    if (wrap === 0) {            /* already empty otherwise */
-      /*** CLEAR_HASH(s); ***/
-      zero(s.head); // Fill with NIL (= 0);
-      s.strstart = 0;
-      s.block_start = 0;
-      s.insert = 0;
-    }
-    /* use the tail */
-    // dictionary = dictionary.slice(dictLength - s.w_size);
-    tmpDict = new utils.Buf8(s.w_size);
-    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
-    dictionary = tmpDict;
-    dictLength = s.w_size;
-  }
-  /* insert dictionary into window and hash */
-  avail = strm.avail_in;
-  next = strm.next_in;
-  input = strm.input;
-  strm.avail_in = dictLength;
-  strm.next_in = 0;
-  strm.input = dictionary;
-  fill_window(s);
-  while (s.lookahead >= MIN_MATCH) {
-    str = s.strstart;
-    n = s.lookahead - (MIN_MATCH - 1);
-    do {
-      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
-      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
-
-      s.prev[str & s.w_mask] = s.head[s.ins_h];
-
-      s.head[s.ins_h] = str;
-      str++;
-    } while (--n);
-    s.strstart = str;
-    s.lookahead = MIN_MATCH - 1;
-    fill_window(s);
-  }
-  s.strstart += s.lookahead;
-  s.block_start = s.strstart;
-  s.insert = s.lookahead;
-  s.lookahead = 0;
-  s.match_length = s.prev_length = MIN_MATCH - 1;
-  s.match_available = 0;
-  strm.next_in = next;
-  strm.input = input;
-  strm.avail_in = avail;
-  s.wrap = wrap;
-  return Z_OK;
-}
-
-
-exports.deflateInit = deflateInit;
-exports.deflateInit2 = deflateInit2;
-exports.deflateReset = deflateReset;
-exports.deflateResetKeep = deflateResetKeep;
-exports.deflateSetHeader = deflateSetHeader;
-exports.deflate = deflate;
-exports.deflateEnd = deflateEnd;
-exports.deflateSetDictionary = deflateSetDictionary;
-exports.deflateInfo = 'pako deflate (from Nodeca project)';
-
-/* Not implemented
-exports.deflateBound = deflateBound;
-exports.deflateCopy = deflateCopy;
-exports.deflateParams = deflateParams;
-exports.deflatePending = deflatePending;
-exports.deflatePrime = deflatePrime;
-exports.deflateTune = deflateTune;
-*/
-
-},{"../utils/common":26,"./adler32":28,"./crc32":30,"./messages":36,"./trees":37}],32:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-function GZheader() {
-  /* true if compressed data believed to be text */
-  this.text       = 0;
-  /* modification time */
-  this.time       = 0;
-  /* extra flags (not used when writing a gzip file) */
-  this.xflags     = 0;
-  /* operating system */
-  this.os         = 0;
-  /* pointer to extra field or Z_NULL if none */
-  this.extra      = null;
-  /* extra field length (valid if extra != Z_NULL) */
-  this.extra_len  = 0; // Actually, we don't need it in JS,
-                       // but leave for few code modifications
-
-  //
-  // Setup limits is not necessary because in js we should not preallocate memory
-  // for inflate use constant limit in 65536 bytes
-  //
-
-  /* space at extra (only when reading header) */
-  // this.extra_max  = 0;
-  /* pointer to zero-terminated file name or Z_NULL */
-  this.name       = '';
-  /* space at name (only when reading header) */
-  // this.name_max   = 0;
-  /* pointer to zero-terminated comment or Z_NULL */
-  this.comment    = '';
-  /* space at comment (only when reading header) */
-  // this.comm_max   = 0;
-  /* true if there was or will be a header crc */
-  this.hcrc       = 0;
-  /* true when done reading gzip header (not used when writing a gzip file) */
-  this.done       = false;
-}
-
-module.exports = GZheader;
-
-},{}],33:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-// See state defs from inflate.js
-var BAD = 30;       /* got a data error -- remain here until reset */
-var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
-
-/*
-   Decode literal, length, and distance codes and write out the resulting
-   literal and match bytes until either not enough input or output is
-   available, an end-of-block is encountered, or a data error is encountered.
-   When large enough input and output buffers are supplied to inflate(), for
-   example, a 16K input buffer and a 64K output buffer, more than 95% of the
-   inflate execution time is spent in this routine.
-
-   Entry assumptions:
-
-        state.mode === LEN
-        strm.avail_in >= 6
-        strm.avail_out >= 258
-        start >= strm.avail_out
-        state.bits < 8
-
-   On return, state.mode is one of:
-
-        LEN -- ran out of enough output space or enough available input
-        TYPE -- reached end of block code, inflate() to interpret next block
-        BAD -- error in block data
-
-   Notes:
-
-    - The maximum input bits used by a length/distance pair is 15 bits for the
-      length code, 5 bits for the length extra, 15 bits for the distance code,
-      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
-      Therefore if strm.avail_in >= 6, then there is enough input to avoid
-      checking for available input while decoding.
-
-    - The maximum bytes that a single length/distance pair can output is 258
-      bytes, which is the maximum length that can be coded.  inflate_fast()
-      requires strm.avail_out >= 258 for each loop to avoid checking for
-      output space.
- */
-module.exports = function inflate_fast(strm, start) {
-  var state;
-  var _in;                    /* local strm.input */
-  var last;                   /* have enough input while in < last */
-  var _out;                   /* local strm.output */
-  var beg;                    /* inflate()'s initial strm.output */
-  var end;                    /* while out < end, enough space available */
-//#ifdef INFLATE_STRICT
-  var dmax;                   /* maximum distance from zlib header */
-//#endif
-  var wsize;                  /* window size or zero if not using window */
-  var whave;                  /* valid bytes in the window */
-  var wnext;                  /* window write index */
-  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
-  var s_window;               /* allocated sliding window, if wsize != 0 */
-  var hold;                   /* local strm.hold */
-  var bits;                   /* local strm.bits */
-  var lcode;                  /* local strm.lencode */
-  var dcode;                  /* local strm.distcode */
-  var lmask;                  /* mask for first level of length codes */
-  var dmask;                  /* mask for first level of distance codes */
-  var here;                   /* retrieved table entry */
-  var op;                     /* code bits, operation, extra bits, or */
-                              /*  window position, window bytes to copy */
-  var len;                    /* match length, unused bytes */
-  var dist;                   /* match distance */
-  var from;                   /* where to copy match from */
-  var from_source;
-
-
-  var input, output; // JS specific, because we have no pointers
-
-  /* copy state to local variables */
-  state = strm.state;
-  //here = state.here;
-  _in = strm.next_in;
-  input = strm.input;
-  last = _in + (strm.avail_in - 5);
-  _out = strm.next_out;
-  output = strm.output;
-  beg = _out - (start - strm.avail_out);
-  end = _out + (strm.avail_out - 257);
-//#ifdef INFLATE_STRICT
-  dmax = state.dmax;
-//#endif
-  wsize = state.wsize;
-  whave = state.whave;
-  wnext = state.wnext;
-  s_window = state.window;
-  hold = state.hold;
-  bits = state.bits;
-  lcode = state.lencode;
-  dcode = state.distcode;
-  lmask = (1 << state.lenbits) - 1;
-  dmask = (1 << state.distbits) - 1;
-
-
-  /* decode literals and length/distances until end-of-block or not enough
-     input data or output space */
-
-  top:
-  do {
-    if (bits < 15) {
-      hold += input[_in++] << bits;
-      bits += 8;
-      hold += input[_in++] << bits;
-      bits += 8;
-    }
-
-    here = lcode[hold & lmask];
-
-    dolen:
-    for (;;) { // Goto emulation
-      op = here >>> 24/*here.bits*/;
-      hold >>>= op;
-      bits -= op;
-      op = (here >>> 16) & 0xff/*here.op*/;
-      if (op === 0) {                          /* literal */
-        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
-        //        "inflate:         literal '%c'\n" :
-        //        "inflate:         literal 0x%02x\n", here.val));
-        output[_out++] = here & 0xffff/*here.val*/;
-      }
-      else if (op & 16) {                     /* length base */
-        len = here & 0xffff/*here.val*/;
-        op &= 15;                           /* number of extra bits */
-        if (op) {
-          if (bits < op) {
-            hold += input[_in++] << bits;
-            bits += 8;
-          }
-          len += hold & ((1 << op) - 1);
-          hold >>>= op;
-          bits -= op;
-        }
-        //Tracevv((stderr, "inflate:         length %u\n", len));
-        if (bits < 15) {
-          hold += input[_in++] << bits;
-          bits += 8;
-          hold += input[_in++] << bits;
-          bits += 8;
-        }
-        here = dcode[hold & dmask];
-
-        dodist:
-        for (;;) { // goto emulation
-          op = here >>> 24/*here.bits*/;
-          hold >>>= op;
-          bits -= op;
-          op = (here >>> 16) & 0xff/*here.op*/;
-
-          if (op & 16) {                      /* distance base */
-            dist = here & 0xffff/*here.val*/;
-            op &= 15;                       /* number of extra bits */
-            if (bits < op) {
-              hold += input[_in++] << bits;
-              bits += 8;
-              if (bits < op) {
-                hold += input[_in++] << bits;
-                bits += 8;
-              }
-            }
-            dist += hold & ((1 << op) - 1);
-//#ifdef INFLATE_STRICT
-            if (dist > dmax) {
-              strm.msg = 'invalid distance too far back';
-              state.mode = BAD;
-              break top;
-            }
-//#endif
-            hold >>>= op;
-            bits -= op;
-            //Tracevv((stderr, "inflate:         distance %u\n", dist));
-            op = _out - beg;                /* max distance in output */
-            if (dist > op) {                /* see if copy from window */
-              op = dist - op;               /* distance back in window */
-              if (op > whave) {
-                if (state.sane) {
-                  strm.msg = 'invalid distance too far back';
-                  state.mode = BAD;
-                  break top;
-                }
-
-// (!) This block is disabled in zlib defaults,
-// don't enable it for binary compatibility
-//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-//                if (len <= op - whave) {
-//                  do {
-//                    output[_out++] = 0;
-//                  } while (--len);
-//                  continue top;
-//                }
-//                len -= op - whave;
-//                do {
-//                  output[_out++] = 0;
-//                } while (--op > whave);
-//                if (op === 0) {
-//                  from = _out - dist;
-//                  do {
-//                    output[_out++] = output[from++];
-//                  } while (--len);
-//                  continue top;
-//                }
-//#endif
-              }
-              from = 0; // window index
-              from_source = s_window;
-              if (wnext === 0) {           /* very common case */
-                from += wsize - op;
-                if (op < len) {         /* some from window */
-                  len -= op;
-                  do {
-                    output[_out++] = s_window[from++];
-                  } while (--op);
-                  from = _out - dist;  /* rest from output */
-                  from_source = output;
-                }
-              }
-              else if (wnext < op) {      /* wrap around window */
-                from += wsize + wnext - op;
-                op -= wnext;
-                if (op < len) {         /* some from end of window */
-                  len -= op;
-                  do {
-                    output[_out++] = s_window[from++];
-                  } while (--op);
-                  from = 0;
-                  if (wnext < len) {  /* some from start of window */
-                    op = wnext;
-                    len -= op;
-                    do {
-                      output[_out++] = s_window[from++];
-                    } while (--op);
-                    from = _out - dist;      /* rest from output */
-                    from_source = output;
-                  }
-                }
-              }
-              else {                      /* contiguous in window */
-                from += wnext - op;
-                if (op < len) {         /* some from window */
-                  len -= op;
-                  do {
-                    output[_out++] = s_window[from++];
-                  } while (--op);
-                  from = _out - dist;  /* rest from output */
-                  from_source = output;
-                }
-              }
-              while (len > 2) {
-                output[_out++] = from_source[from++];
-                output[_out++] = from_source[from++];
-                output[_out++] = from_source[from++];
-                len -= 3;
-              }
-              if (len) {
-                output[_out++] = from_source[from++];
-                if (len > 1) {
-                  output[_out++] = from_source[from++];
-                }
-              }
-            }
-            else {
-              from = _out - dist;          /* copy direct from output */
-              do {                        /* minimum length is three */
-                output[_out++] = output[from++];
-                output[_out++] = output[from++];
-                output[_out++] = output[from++];
-                len -= 3;
-              } while (len > 2);
-              if (len) {
-                output[_out++] = output[from++];
-                if (len > 1) {
-                  output[_out++] = output[from++];
-                }
-              }
-            }
-          }
-          else if ((op & 64) === 0) {          /* 2nd level distance code */
-            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
-            continue dodist;
-          }
-          else {
-            strm.msg = 'invalid distance code';
-            state.mode = BAD;
-            break top;
-          }
-
-          break; // need to emulate goto via "continue"
-        }
-      }
-      else if ((op & 64) === 0) {              /* 2nd level length code */
-        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
-        continue dolen;
-      }
-      else if (op & 32) {                     /* end-of-block */
-        //Tracevv((stderr, "inflate:         end of block\n"));
-        state.mode = TYPE;
-        break top;
-      }
-      else {
-        strm.msg = 'invalid literal/length code';
-        state.mode = BAD;
-        break top;
-      }
-
-      break; // need to emulate goto via "continue"
-    }
-  } while (_in < last && _out < end);
-
-  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
-  len = bits >> 3;
-  _in -= len;
-  bits -= len << 3;
-  hold &= (1 << bits) - 1;
-
-  /* update state and return */
-  strm.next_in = _in;
-  strm.next_out = _out;
-  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
-  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
-  state.hold = hold;
-  state.bits = bits;
-  return;
-};
-
-},{}],34:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-var utils         = require('../utils/common');
-var adler32       = require('./adler32');
-var crc32         = require('./crc32');
-var inflate_fast  = require('./inffast');
-var inflate_table = require('./inftrees');
-
-var CODES = 0;
-var LENS = 1;
-var DISTS = 2;
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-
-/* Allowed flush values; see deflate() and inflate() below for details */
-//var Z_NO_FLUSH      = 0;
-//var Z_PARTIAL_FLUSH = 1;
-//var Z_SYNC_FLUSH    = 2;
-//var Z_FULL_FLUSH    = 3;
-var Z_FINISH        = 4;
-var Z_BLOCK         = 5;
-var Z_TREES         = 6;
-
-
-/* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
-var Z_OK            = 0;
-var Z_STREAM_END    = 1;
-var Z_NEED_DICT     = 2;
-//var Z_ERRNO         = -1;
-var Z_STREAM_ERROR  = -2;
-var Z_DATA_ERROR    = -3;
-var Z_MEM_ERROR     = -4;
-var Z_BUF_ERROR     = -5;
-//var Z_VERSION_ERROR = -6;
-
-/* The deflate compression method */
-var Z_DEFLATED  = 8;
-
-
-/* STATES ====================================================================*/
-/* ===========================================================================*/
-
-
-var    HEAD = 1;       /* i: waiting for magic header */
-var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
-var    TIME = 3;       /* i: waiting for modification time (gzip) */
-var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
-var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
-var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
-var    NAME = 7;       /* i: waiting for end of file name (gzip) */
-var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
-var    HCRC = 9;       /* i: waiting for header crc (gzip) */
-var    DICTID = 10;    /* i: waiting for dictionary check value */
-var    DICT = 11;      /* waiting for inflateSetDictionary() call */
-var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
-var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
-var        STORED = 14;    /* i: waiting for stored size (length and complement) */
-var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
-var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
-var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
-var        LENLENS = 18;   /* i: waiting for code length code lengths */
-var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
-var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
-var            LEN = 21;       /* i: waiting for length/lit/eob code */
-var            LENEXT = 22;    /* i: waiting for length extra bits */
-var            DIST = 23;      /* i: waiting for distance code */
-var            DISTEXT = 24;   /* i: waiting for distance extra bits */
-var            MATCH = 25;     /* o: waiting for output space to copy string */
-var            LIT = 26;       /* o: waiting for output space to write literal */
-var    CHECK = 27;     /* i: waiting for 32-bit check value */
-var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
-var    DONE = 29;      /* finished check, done -- remain here until reset */
-var    BAD = 30;       /* got a data error -- remain here until reset */
-var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
-var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
-
-/* ===========================================================================*/
-
-
-
-var ENOUGH_LENS = 852;
-var ENOUGH_DISTS = 592;
-//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
-
-var MAX_WBITS = 15;
-/* 32K LZ77 window */
-var DEF_WBITS = MAX_WBITS;
-
-
-function zswap32(q) {
-  return  (((q >>> 24) & 0xff) +
-          ((q >>> 8) & 0xff00) +
-          ((q & 0xff00) << 8) +
-          ((q & 0xff) << 24));
-}
-
-
-function InflateState() {
-  this.mode = 0;             /* current inflate mode */
-  this.last = false;          /* true if processing last block */
-  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
-  this.havedict = false;      /* true if dictionary provided */
-  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
-  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
-  this.check = 0;             /* protected copy of check value */
-  this.total = 0;             /* protected copy of output count */
-  // TODO: may be {}
-  this.head = null;           /* where to save gzip header information */
-
-  /* sliding window */
-  this.wbits = 0;             /* log base 2 of requested window size */
-  this.wsize = 0;             /* window size or zero if not using window */
-  this.whave = 0;             /* valid bytes in the window */
-  this.wnext = 0;             /* window write index */
-  this.window = null;         /* allocated sliding window, if needed */
-
-  /* bit accumulator */
-  this.hold = 0;              /* input bit accumulator */
-  this.bits = 0;              /* number of bits in "in" */
-
-  /* for string and stored block copying */
-  this.length = 0;            /* literal or length of data to copy */
-  this.offset = 0;            /* distance back to copy string from */
-
-  /* for table and code decoding */
-  this.extra = 0;             /* extra bits needed */
-
-  /* fixed and dynamic code tables */
-  this.lencode = null;          /* starting table for length/literal codes */
-  this.distcode = null;         /* starting table for distance codes */
-  this.lenbits = 0;           /* index bits for lencode */
-  this.distbits = 0;          /* index bits for distcode */
-
-  /* dynamic table building */
-  this.ncode = 0;             /* number of code length code lengths */
-  this.nlen = 0;              /* number of length code lengths */
-  this.ndist = 0;             /* number of distance code lengths */
-  this.have = 0;              /* number of code lengths in lens[] */
-  this.next = null;              /* next available space in codes[] */
-
-  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
-  this.work = new utils.Buf16(288); /* work area for code table building */
-
-  /*
-   because we don't have pointers in js, we use lencode and distcode directly
-   as buffers so we don't need codes
-  */
-  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
-  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
-  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
-  this.sane = 0;                   /* if false, allow invalid distance too far */
-  this.back = 0;                   /* bits back of last unprocessed length/lit */
-  this.was = 0;                    /* initial length of match */
-}
-
-function inflateResetKeep(strm) {
-  var state;
-
-  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-  state = strm.state;
-  strm.total_in = strm.total_out = state.total = 0;
-  strm.msg = ''; /*Z_NULL*/
-  if (state.wrap) {       /* to support ill-conceived Java test suite */
-    strm.adler = state.wrap & 1;
-  }
-  state.mode = HEAD;
-  state.last = 0;
-  state.havedict = 0;
-  state.dmax = 32768;
-  state.head = null/*Z_NULL*/;
-  state.hold = 0;
-  state.bits = 0;
-  //state.lencode = state.distcode = state.next = state.codes;
-  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
-  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
-
-  state.sane = 1;
-  state.back = -1;
-  //Tracev((stderr, "inflate: reset\n"));
-  return Z_OK;
-}
-
-function inflateReset(strm) {
-  var state;
-
-  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-  state = strm.state;
-  state.wsize = 0;
-  state.whave = 0;
-  state.wnext = 0;
-  return inflateResetKeep(strm);
-
-}
-
-function inflateReset2(strm, windowBits) {
-  var wrap;
-  var state;
-
-  /* get the state */
-  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-  state = strm.state;
-
-  /* extract wrap request from windowBits parameter */
-  if (windowBits < 0) {
-    wrap = 0;
-    windowBits = -windowBits;
-  }
-  else {
-    wrap = (windowBits >> 4) + 1;
-    if (windowBits < 48) {
-      windowBits &= 15;
-    }
-  }
-
-  /* set number of window bits, free window if different */
-  if (windowBits && (windowBits < 8 || windowBits > 15)) {
-    return Z_STREAM_ERROR;
-  }
-  if (state.window !== null && state.wbits !== windowBits) {
-    state.window = null;
-  }
-
-  /* update state and reset the rest of it */
-  state.wrap = wrap;
-  state.wbits = windowBits;
-  return inflateReset(strm);
-}
-
-function inflateInit2(strm, windowBits) {
-  var ret;
-  var state;
-
-  if (!strm) { return Z_STREAM_ERROR; }
-  //strm.msg = Z_NULL;                 /* in case we return an error */
-
-  state = new InflateState();
-
-  //if (state === Z_NULL) return Z_MEM_ERROR;
-  //Tracev((stderr, "inflate: allocated\n"));
-  strm.state = state;
-  state.window = null/*Z_NULL*/;
-  ret = inflateReset2(strm, windowBits);
-  if (ret !== Z_OK) {
-    strm.state = null/*Z_NULL*/;
-  }
-  return ret;
-}
-
-function inflateInit(strm) {
-  return inflateInit2(strm, DEF_WBITS);
-}
-
-
-/*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding.  Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter.  This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time.  However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
-var virgin = true;
-
-var lenfix, distfix; // We have no pointers in JS, so keep tables separate
-
-function fixedtables(state) {
-  /* build fixed huffman tables if first call (may not be thread safe) */
-  if (virgin) {
-    var sym;
-
-    lenfix = new utils.Buf32(512);
-    distfix = new utils.Buf32(32);
-
-    /* literal/length table */
-    sym = 0;
-    while (sym < 144) { state.lens[sym++] = 8; }
-    while (sym < 256) { state.lens[sym++] = 9; }
-    while (sym < 280) { state.lens[sym++] = 7; }
-    while (sym < 288) { state.lens[sym++] = 8; }
-
-    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
-
-    /* distance table */
-    sym = 0;
-    while (sym < 32) { state.lens[sym++] = 5; }
-
-    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
-
-    /* do this just once */
-    virgin = false;
-  }
-
-  state.lencode = lenfix;
-  state.lenbits = 9;
-  state.distcode = distfix;
-  state.distbits = 5;
-}
-
-
-/*
- Update the window with the last wsize (normally 32K) bytes written before
- returning.  If window does not exist yet, create it.  This is only called
- when a window is already in use, or when output has been written during this
- inflate call, but the end of the deflate stream has not been reached yet.
- It is also called to create a window for dictionary data when a dictionary
- is loaded.
-
- Providing output buffers larger than 32K to inflate() should provide a speed
- advantage, since only the last 32K of output is copied to the sliding window
- upon return from inflate(), and since all distances after the first 32K of
- output will fall in the output data, making match copies simpler and faster.
- The advantage may be dependent on the size of the processor's data caches.
- */
-function updatewindow(strm, src, end, copy) {
-  var dist;
-  var state = strm.state;
-
-  /* if it hasn't been done already, allocate space for the window */
-  if (state.window === null) {
-    state.wsize = 1 << state.wbits;
-    state.wnext = 0;
-    state.whave = 0;
-
-    state.window = new utils.Buf8(state.wsize);
-  }
-
-  /* copy state->wsize or less output bytes into the circular window */
-  if (copy >= state.wsize) {
-    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
-    state.wnext = 0;
-    state.whave = state.wsize;
-  }
-  else {
-    dist = state.wsize - state.wnext;
-    if (dist > copy) {
-      dist = copy;
-    }
-    //zmemcpy(state->window + state->wnext, end - copy, dist);
-    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
-    copy -= dist;
-    if (copy) {
-      //zmemcpy(state->window, end - copy, copy);
-      utils.arraySet(state.window, src, end - copy, copy, 0);
-      state.wnext = copy;
-      state.whave = state.wsize;
-    }
-    else {
-      state.wnext += dist;
-      if (state.wnext === state.wsize) { state.wnext = 0; }
-      if (state.whave < state.wsize) { state.whave += dist; }
-    }
-  }
-  return 0;
-}
-
-function inflate(strm, flush) {
-  var state;
-  var input, output;          // input/output buffers
-  var next;                   /* next input INDEX */
-  var put;                    /* next output INDEX */
-  var have, left;             /* available input and output */
-  var hold;                   /* bit buffer */
-  var bits;                   /* bits in bit buffer */
-  var _in, _out;              /* save starting available input and output */
-  var copy;                   /* number of stored or match bytes to copy */
-  var from;                   /* where to copy match bytes from */
-  var from_source;
-  var here = 0;               /* current decoding table entry */
-  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
-  //var last;                   /* parent table entry */
-  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
-  var len;                    /* length to copy for repeats, bits to drop */
-  var ret;                    /* return code */
-  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
-  var opts;
-
-  var n; // temporary var for NEED_BITS
-
-  var order = /* permutation of code lengths */
-    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
-
-
-  if (!strm || !strm.state || !strm.output ||
-      (!strm.input && strm.avail_in !== 0)) {
-    return Z_STREAM_ERROR;
-  }
-
-  state = strm.state;
-  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
-
-
-  //--- LOAD() ---
-  put = strm.next_out;
-  output = strm.output;
-  left = strm.avail_out;
-  next = strm.next_in;
-  input = strm.input;
-  have = strm.avail_in;
-  hold = state.hold;
-  bits = state.bits;
-  //---
-
-  _in = have;
-  _out = left;
-  ret = Z_OK;
-
-  inf_leave: // goto emulation
-  for (;;) {
-    switch (state.mode) {
-      case HEAD:
-        if (state.wrap === 0) {
-          state.mode = TYPEDO;
-          break;
-        }
-        //=== NEEDBITS(16);
-        while (bits < 16) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
-          state.check = 0/*crc32(0L, Z_NULL, 0)*/;
-          //=== CRC2(state.check, hold);
-          hbuf[0] = hold & 0xff;
-          hbuf[1] = (hold >>> 8) & 0xff;
-          state.check = crc32(state.check, hbuf, 2, 0);
-          //===//
-
-          //=== INITBITS();
-          hold = 0;
-          bits = 0;
-          //===//
-          state.mode = FLAGS;
-          break;
-        }
-        state.flags = 0;           /* expect zlib header */
-        if (state.head) {
-          state.head.done = false;
-        }
-        if (!(state.wrap & 1) ||   /* check if zlib header allowed */
-          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
-          strm.msg = 'incorrect header check';
-          state.mode = BAD;
-          break;
-        }
-        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
-          strm.msg = 'unknown compression method';
-          state.mode = BAD;
-          break;
-        }
-        //--- DROPBITS(4) ---//
-        hold >>>= 4;
-        bits -= 4;
-        //---//
-        len = (hold & 0x0f)/*BITS(4)*/ + 8;
-        if (state.wbits === 0) {
-          state.wbits = len;
-        }
-        else if (len > state.wbits) {
-          strm.msg = 'invalid window size';
-          state.mode = BAD;
-          break;
-        }
-        state.dmax = 1 << len;
-        //Tracev((stderr, "inflate:   zlib header ok\n"));
-        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
-        state.mode = hold & 0x200 ? DICTID : TYPE;
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        break;
-      case FLAGS:
-        //=== NEEDBITS(16); */
-        while (bits < 16) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        state.flags = hold;
-        if ((state.flags & 0xff) !== Z_DEFLATED) {
-          strm.msg = 'unknown compression method';
-          state.mode = BAD;
-          break;
-        }
-        if (state.flags & 0xe000) {
-          strm.msg = 'unknown header flags set';
-          state.mode = BAD;
-          break;
-        }
-        if (state.head) {
-          state.head.text = ((hold >> 8) & 1);
-        }
-        if (state.flags & 0x0200) {
-          //=== CRC2(state.check, hold);
-          hbuf[0] = hold & 0xff;
-          hbuf[1] = (hold >>> 8) & 0xff;
-          state.check = crc32(state.check, hbuf, 2, 0);
-          //===//
-        }
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        state.mode = TIME;
-        /* falls through */
-      case TIME:
-        //=== NEEDBITS(32); */
-        while (bits < 32) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        if (state.head) {
-          state.head.time = hold;
-        }
-        if (state.flags & 0x0200) {
-          //=== CRC4(state.check, hold)
-          hbuf[0] = hold & 0xff;
-          hbuf[1] = (hold >>> 8) & 0xff;
-          hbuf[2] = (hold >>> 16) & 0xff;
-          hbuf[3] = (hold >>> 24) & 0xff;
-          state.check = crc32(state.check, hbuf, 4, 0);
-          //===
-        }
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        state.mode = OS;
-        /* falls through */
-      case OS:
-        //=== NEEDBITS(16); */
-        while (bits < 16) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        if (state.head) {
-          state.head.xflags = (hold & 0xff);
-          state.head.os = (hold >> 8);
-        }
-        if (state.flags & 0x0200) {
-          //=== CRC2(state.check, hold);
-          hbuf[0] = hold & 0xff;
-          hbuf[1] = (hold >>> 8) & 0xff;
-          state.check = crc32(state.check, hbuf, 2, 0);
-          //===//
-        }
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        state.mode = EXLEN;
-        /* falls through */
-      case EXLEN:
-        if (state.flags & 0x0400) {
-          //=== NEEDBITS(16); */
-          while (bits < 16) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          state.length = hold;
-          if (state.head) {
-            state.head.extra_len = hold;
-          }
-          if (state.flags & 0x0200) {
-            //=== CRC2(state.check, hold);
-            hbuf[0] = hold & 0xff;
-            hbuf[1] = (hold >>> 8) & 0xff;
-            state.check = crc32(state.check, hbuf, 2, 0);
-            //===//
-          }
-          //=== INITBITS();
-          hold = 0;
-          bits = 0;
-          //===//
-        }
-        else if (state.head) {
-          state.head.extra = null/*Z_NULL*/;
-        }
-        state.mode = EXTRA;
-        /* falls through */
-      case EXTRA:
-        if (state.flags & 0x0400) {
-          copy = state.length;
-          if (copy > have) { copy = have; }
-          if (copy) {
-            if (state.head) {
-              len = state.head.extra_len - state.length;
-              if (!state.head.extra) {
-                // Use untyped array for more convenient processing later
-                state.head.extra = new Array(state.head.extra_len);
-              }
-              utils.arraySet(
-                state.head.extra,
-                input,
-                next,
-                // extra field is limited to 65536 bytes
-                // - no need for additional size check
-                copy,
-                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
-                len
-              );
-              //zmemcpy(state.head.extra + len, next,
-              //        len + copy > state.head.extra_max ?
-              //        state.head.extra_max - len : copy);
-            }
-            if (state.flags & 0x0200) {
-              state.check = crc32(state.check, input, copy, next);
-            }
-            have -= copy;
-            next += copy;
-            state.length -= copy;
-          }
-          if (state.length) { break inf_leave; }
-        }
-        state.length = 0;
-        state.mode = NAME;
-        /* falls through */
-      case NAME:
-        if (state.flags & 0x0800) {
-          if (have === 0) { break inf_leave; }
-          copy = 0;
-          do {
-            // TODO: 2 or 1 bytes?
-            len = input[next + copy++];
-            /* use constant limit because in js we should not preallocate memory */
-            if (state.head && len &&
-                (state.length < 65536 /*state.head.name_max*/)) {
-              state.head.name += String.fromCharCode(len);
-            }
-          } while (len && copy < have);
-
-          if (state.flags & 0x0200) {
-            state.check = crc32(state.check, input, copy, next);
-          }
-          have -= copy;
-          next += copy;
-          if (len) { break inf_leave; }
-        }
-        else if (state.head) {
-          state.head.name = null;
-        }
-        state.length = 0;
-        state.mode = COMMENT;
-        /* falls through */
-      case COMMENT:
-        if (state.flags & 0x1000) {
-          if (have === 0) { break inf_leave; }
-          copy = 0;
-          do {
-            len = input[next + copy++];
-            /* use constant limit because in js we should not preallocate memory */
-            if (state.head && len &&
-                (state.length < 65536 /*state.head.comm_max*/)) {
-              state.head.comment += String.fromCharCode(len);
-            }
-          } while (len && copy < have);
-          if (state.flags & 0x0200) {
-            state.check = crc32(state.check, input, copy, next);
-          }
-          have -= copy;
-          next += copy;
-          if (len) { break inf_leave; }
-        }
-        else if (state.head) {
-          state.head.comment = null;
-        }
-        state.mode = HCRC;
-        /* falls through */
-      case HCRC:
-        if (state.flags & 0x0200) {
-          //=== NEEDBITS(16); */
-          while (bits < 16) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          if (hold !== (state.check & 0xffff)) {
-            strm.msg = 'header crc mismatch';
-            state.mode = BAD;
-            break;
-          }
-          //=== INITBITS();
-          hold = 0;
-          bits = 0;
-          //===//
-        }
-        if (state.head) {
-          state.head.hcrc = ((state.flags >> 9) & 1);
-          state.head.done = true;
-        }
-        strm.adler = state.check = 0;
-        state.mode = TYPE;
-        break;
-      case DICTID:
-        //=== NEEDBITS(32); */
-        while (bits < 32) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        strm.adler = state.check = zswap32(hold);
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        state.mode = DICT;
-        /* falls through */
-      case DICT:
-        if (state.havedict === 0) {
-          //--- RESTORE() ---
-          strm.next_out = put;
-          strm.avail_out = left;
-          strm.next_in = next;
-          strm.avail_in = have;
-          state.hold = hold;
-          state.bits = bits;
-          //---
-          return Z_NEED_DICT;
-        }
-        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
-        state.mode = TYPE;
-        /* falls through */
-      case TYPE:
-        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
-        /* falls through */
-      case TYPEDO:
-        if (state.last) {
-          //--- BYTEBITS() ---//
-          hold >>>= bits & 7;
-          bits -= bits & 7;
-          //---//
-          state.mode = CHECK;
-          break;
-        }
-        //=== NEEDBITS(3); */
-        while (bits < 3) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        state.last = (hold & 0x01)/*BITS(1)*/;
-        //--- DROPBITS(1) ---//
-        hold >>>= 1;
-        bits -= 1;
-        //---//
-
-        switch ((hold & 0x03)/*BITS(2)*/) {
-          case 0:                             /* stored block */
-            //Tracev((stderr, "inflate:     stored block%s\n",
-            //        state.last ? " (last)" : ""));
-            state.mode = STORED;
-            break;
-          case 1:                             /* fixed block */
-            fixedtables(state);
-            //Tracev((stderr, "inflate:     fixed codes block%s\n",
-            //        state.last ? " (last)" : ""));
-            state.mode = LEN_;             /* decode codes */
-            if (flush === Z_TREES) {
-              //--- DROPBITS(2) ---//
-              hold >>>= 2;
-              bits -= 2;
-              //---//
-              break inf_leave;
-            }
-            break;
-          case 2:                             /* dynamic block */
-            //Tracev((stderr, "inflate:     dynamic codes block%s\n",
-            //        state.last ? " (last)" : ""));
-            state.mode = TABLE;
-            break;
-          case 3:
-            strm.msg = 'invalid block type';
-            state.mode = BAD;
-        }
-        //--- DROPBITS(2) ---//
-        hold >>>= 2;
-        bits -= 2;
-        //---//
-        break;
-      case STORED:
-        //--- BYTEBITS() ---// /* go to byte boundary */
-        hold >>>= bits & 7;
-        bits -= bits & 7;
-        //---//
-        //=== NEEDBITS(32); */
-        while (bits < 32) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
-          strm.msg = 'invalid stored block lengths';
-          state.mode = BAD;
-          break;
-        }
-        state.length = hold & 0xffff;
-        //Tracev((stderr, "inflate:       stored length %u\n",
-        //        state.length));
-        //=== INITBITS();
-        hold = 0;
-        bits = 0;
-        //===//
-        state.mode = COPY_;
-        if (flush === Z_TREES) { break inf_leave; }
-        /* falls through */
-      case COPY_:
-        state.mode = COPY;
-        /* falls through */
-      case COPY:
-        copy = state.length;
-        if (copy) {
-          if (copy > have) { copy = have; }
-          if (copy > left) { copy = left; }
-          if (copy === 0) { break inf_leave; }
-          //--- zmemcpy(put, next, copy); ---
-          utils.arraySet(output, input, next, copy, put);
-          //---//
-          have -= copy;
-          next += copy;
-          left -= copy;
-          put += copy;
-          state.length -= copy;
-          break;
-        }
-        //Tracev((stderr, "inflate:       stored end\n"));
-        state.mode = TYPE;
-        break;
-      case TABLE:
-        //=== NEEDBITS(14); */
-        while (bits < 14) {
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-        }
-        //===//
-        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
-        //--- DROPBITS(5) ---//
-        hold >>>= 5;
-        bits -= 5;
-        //---//
-        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
-        //--- DROPBITS(5) ---//
-        hold >>>= 5;
-        bits -= 5;
-        //---//
-        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
-        //--- DROPBITS(4) ---//
-        hold >>>= 4;
-        bits -= 4;
-        //---//
-//#ifndef PKZIP_BUG_WORKAROUND
-        if (state.nlen > 286 || state.ndist > 30) {
-          strm.msg = 'too many length or distance symbols';
-          state.mode = BAD;
-          break;
-        }
-//#endif
-        //Tracev((stderr, "inflate:       table sizes ok\n"));
-        state.have = 0;
-        state.mode = LENLENS;
-        /* falls through */
-      case LENLENS:
-        while (state.have < state.ncode) {
-          //=== NEEDBITS(3);
-          while (bits < 3) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
-          //--- DROPBITS(3) ---//
-          hold >>>= 3;
-          bits -= 3;
-          //---//
-        }
-        while (state.have < 19) {
-          state.lens[order[state.have++]] = 0;
-        }
-        // We have separate tables & no pointers. 2 commented lines below not needed.
-        //state.next = state.codes;
-        //state.lencode = state.next;
-        // Switch to use dynamic table
-        state.lencode = state.lendyn;
-        state.lenbits = 7;
-
-        opts = { bits: state.lenbits };
-        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
-        state.lenbits = opts.bits;
-
-        if (ret) {
-          strm.msg = 'invalid code lengths set';
-          state.mode = BAD;
-          break;
-        }
-        //Tracev((stderr, "inflate:       code lengths ok\n"));
-        state.have = 0;
-        state.mode = CODELENS;
-        /* falls through */
-      case CODELENS:
-        while (state.have < state.nlen + state.ndist) {
-          for (;;) {
-            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
-            here_bits = here >>> 24;
-            here_op = (here >>> 16) & 0xff;
-            here_val = here & 0xffff;
-
-            if ((here_bits) <= bits) { break; }
-            //--- PULLBYTE() ---//
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-            //---//
-          }
-          if (here_val < 16) {
-            //--- DROPBITS(here.bits) ---//
-            hold >>>= here_bits;
-            bits -= here_bits;
-            //---//
-            state.lens[state.have++] = here_val;
-          }
-          else {
-            if (here_val === 16) {
-              //=== NEEDBITS(here.bits + 2);
-              n = here_bits + 2;
-              while (bits < n) {
-                if (have === 0) { break inf_leave; }
-                have--;
-                hold += input[next++] << bits;
-                bits += 8;
-              }
-              //===//
-              //--- DROPBITS(here.bits) ---//
-              hold >>>= here_bits;
-              bits -= here_bits;
-              //---//
-              if (state.have === 0) {
-                strm.msg = 'invalid bit length repeat';
-                state.mode = BAD;
-                break;
-              }
-              len = state.lens[state.have - 1];
-              copy = 3 + (hold & 0x03);//BITS(2);
-              //--- DROPBITS(2) ---//
-              hold >>>= 2;
-              bits -= 2;
-              //---//
-            }
-            else if (here_val === 17) {
-              //=== NEEDBITS(here.bits + 3);
-              n = here_bits + 3;
-              while (bits < n) {
-                if (have === 0) { break inf_leave; }
-                have--;
-                hold += input[next++] << bits;
-                bits += 8;
-              }
-              //===//
-              //--- DROPBITS(here.bits) ---//
-              hold >>>= here_bits;
-              bits -= here_bits;
-              //---//
-              len = 0;
-              copy = 3 + (hold & 0x07);//BITS(3);
-              //--- DROPBITS(3) ---//
-              hold >>>= 3;
-              bits -= 3;
-              //---//
-            }
-            else {
-              //=== NEEDBITS(here.bits + 7);
-              n = here_bits + 7;
-              while (bits < n) {
-                if (have === 0) { break inf_leave; }
-                have--;
-                hold += input[next++] << bits;
-                bits += 8;
-              }
-              //===//
-              //--- DROPBITS(here.bits) ---//
-              hold >>>= here_bits;
-              bits -= here_bits;
-              //---//
-              len = 0;
-              copy = 11 + (hold & 0x7f);//BITS(7);
-              //--- DROPBITS(7) ---//
-              hold >>>= 7;
-              bits -= 7;
-              //---//
-            }
-            if (state.have + copy > state.nlen + state.ndist) {
-              strm.msg = 'invalid bit length repeat';
-              state.mode = BAD;
-              break;
-            }
-            while (copy--) {
-              state.lens[state.have++] = len;
-            }
-          }
-        }
-
-        /* handle error breaks in while */
-        if (state.mode === BAD) { break; }
-
-        /* check for end-of-block code (better have one) */
-        if (state.lens[256] === 0) {
-          strm.msg = 'invalid code -- missing end-of-block';
-          state.mode = BAD;
-          break;
-        }
-
-        /* build code tables -- note: do not change the lenbits or distbits
-           values here (9 and 6) without reading the comments in inftrees.h
-           concerning the ENOUGH constants, which depend on those values */
-        state.lenbits = 9;
-
-        opts = { bits: state.lenbits };
-        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
-        // We have separate tables & no pointers. 2 commented lines below not needed.
-        // state.next_index = opts.table_index;
-        state.lenbits = opts.bits;
-        // state.lencode = state.next;
-
-        if (ret) {
-          strm.msg = 'invalid literal/lengths set';
-          state.mode = BAD;
-          break;
-        }
-
-        state.distbits = 6;
-        //state.distcode.copy(state.codes);
-        // Switch to use dynamic table
-        state.distcode = state.distdyn;
-        opts = { bits: state.distbits };
-        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
-        // We have separate tables & no pointers. 2 commented lines below not needed.
-        // state.next_index = opts.table_index;
-        state.distbits = opts.bits;
-        // state.distcode = state.next;
-
-        if (ret) {
-          strm.msg = 'invalid distances set';
-          state.mode = BAD;
-          break;
-        }
-        //Tracev((stderr, 'inflate:       codes ok\n'));
-        state.mode = LEN_;
-        if (flush === Z_TREES) { break inf_leave; }
-        /* falls through */
-      case LEN_:
-        state.mode = LEN;
-        /* falls through */
-      case LEN:
-        if (have >= 6 && left >= 258) {
-          //--- RESTORE() ---
-          strm.next_out = put;
-          strm.avail_out = left;
-          strm.next_in = next;
-          strm.avail_in = have;
-          state.hold = hold;
-          state.bits = bits;
-          //---
-          inflate_fast(strm, _out);
-          //--- LOAD() ---
-          put = strm.next_out;
-          output = strm.output;
-          left = strm.avail_out;
-          next = strm.next_in;
-          input = strm.input;
-          have = strm.avail_in;
-          hold = state.hold;
-          bits = state.bits;
-          //---
-
-          if (state.mode === TYPE) {
-            state.back = -1;
-          }
-          break;
-        }
-        state.back = 0;
-        for (;;) {
-          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
-          here_bits = here >>> 24;
-          here_op = (here >>> 16) & 0xff;
-          here_val = here & 0xffff;
-
-          if (here_bits <= bits) { break; }
-          //--- PULLBYTE() ---//
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-          //---//
-        }
-        if (here_op && (here_op & 0xf0) === 0) {
-          last_bits = here_bits;
-          last_op = here_op;
-          last_val = here_val;
-          for (;;) {
-            here = state.lencode[last_val +
-                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
-            here_bits = here >>> 24;
-            here_op = (here >>> 16) & 0xff;
-            here_val = here & 0xffff;
-
-            if ((last_bits + here_bits) <= bits) { break; }
-            //--- PULLBYTE() ---//
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-            //---//
-          }
-          //--- DROPBITS(last.bits) ---//
-          hold >>>= last_bits;
-          bits -= last_bits;
-          //---//
-          state.back += last_bits;
-        }
-        //--- DROPBITS(here.bits) ---//
-        hold >>>= here_bits;
-        bits -= here_bits;
-        //---//
-        state.back += here_bits;
-        state.length = here_val;
-        if (here_op === 0) {
-          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
-          //        "inflate:         literal '%c'\n" :
-          //        "inflate:         literal 0x%02x\n", here.val));
-          state.mode = LIT;
-          break;
-        }
-        if (here_op & 32) {
-          //Tracevv((stderr, "inflate:         end of block\n"));
-          state.back = -1;
-          state.mode = TYPE;
-          break;
-        }
-        if (here_op & 64) {
-          strm.msg = 'invalid literal/length code';
-          state.mode = BAD;
-          break;
-        }
-        state.extra = here_op & 15;
-        state.mode = LENEXT;
-        /* falls through */
-      case LENEXT:
-        if (state.extra) {
-          //=== NEEDBITS(state.extra);
-          n = state.extra;
-          while (bits < n) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
-          //--- DROPBITS(state.extra) ---//
-          hold >>>= state.extra;
-          bits -= state.extra;
-          //---//
-          state.back += state.extra;
-        }
-        //Tracevv((stderr, "inflate:         length %u\n", state.length));
-        state.was = state.length;
-        state.mode = DIST;
-        /* falls through */
-      case DIST:
-        for (;;) {
-          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
-          here_bits = here >>> 24;
-          here_op = (here >>> 16) & 0xff;
-          here_val = here & 0xffff;
-
-          if ((here_bits) <= bits) { break; }
-          //--- PULLBYTE() ---//
-          if (have === 0) { break inf_leave; }
-          have--;
-          hold += input[next++] << bits;
-          bits += 8;
-          //---//
-        }
-        if ((here_op & 0xf0) === 0) {
-          last_bits = here_bits;
-          last_op = here_op;
-          last_val = here_val;
-          for (;;) {
-            here = state.distcode[last_val +
-                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
-            here_bits = here >>> 24;
-            here_op = (here >>> 16) & 0xff;
-            here_val = here & 0xffff;
-
-            if ((last_bits + here_bits) <= bits) { break; }
-            //--- PULLBYTE() ---//
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-            //---//
-          }
-          //--- DROPBITS(last.bits) ---//
-          hold >>>= last_bits;
-          bits -= last_bits;
-          //---//
-          state.back += last_bits;
-        }
-        //--- DROPBITS(here.bits) ---//
-        hold >>>= here_bits;
-        bits -= here_bits;
-        //---//
-        state.back += here_bits;
-        if (here_op & 64) {
-          strm.msg = 'invalid distance code';
-          state.mode = BAD;
-          break;
-        }
-        state.offset = here_val;
-        state.extra = (here_op) & 15;
-        state.mode = DISTEXT;
-        /* falls through */
-      case DISTEXT:
-        if (state.extra) {
-          //=== NEEDBITS(state.extra);
-          n = state.extra;
-          while (bits < n) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
-          //--- DROPBITS(state.extra) ---//
-          hold >>>= state.extra;
-          bits -= state.extra;
-          //---//
-          state.back += state.extra;
-        }
-//#ifdef INFLATE_STRICT
-        if (state.offset > state.dmax) {
-          strm.msg = 'invalid distance too far back';
-          state.mode = BAD;
-          break;
-        }
-//#endif
-        //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
-        state.mode = MATCH;
-        /* falls through */
-      case MATCH:
-        if (left === 0) { break inf_leave; }
-        copy = _out - left;
-        if (state.offset > copy) {         /* copy from window */
-          copy = state.offset - copy;
-          if (copy > state.whave) {
-            if (state.sane) {
-              strm.msg = 'invalid distance too far back';
-              state.mode = BAD;
-              break;
-            }
-// (!) This block is disabled in zlib defaults,
-// don't enable it for binary compatibility
-//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-//          Trace((stderr, "inflate.c too far\n"));
-//          copy -= state.whave;
-//          if (copy > state.length) { copy = state.length; }
-//          if (copy > left) { copy = left; }
-//          left -= copy;
-//          state.length -= copy;
-//          do {
-//            output[put++] = 0;
-//          } while (--copy);
-//          if (state.length === 0) { state.mode = LEN; }
-//          break;
-//#endif
-          }
-          if (copy > state.wnext) {
-            copy -= state.wnext;
-            from = state.wsize - copy;
-          }
-          else {
-            from = state.wnext - copy;
-          }
-          if (copy > state.length) { copy = state.length; }
-          from_source = state.window;
-        }
-        else {                              /* copy from output */
-          from_source = output;
-          from = put - state.offset;
-          copy = state.length;
-        }
-        if (copy > left) { copy = left; }
-        left -= copy;
-        state.length -= copy;
-        do {
-          output[put++] = from_source[from++];
-        } while (--copy);
-        if (state.length === 0) { state.mode = LEN; }
-        break;
-      case LIT:
-        if (left === 0) { break inf_leave; }
-        output[put++] = state.length;
-        left--;
-        state.mode = LEN;
-        break;
-      case CHECK:
-        if (state.wrap) {
-          //=== NEEDBITS(32);
-          while (bits < 32) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            // Use '|' instead of '+' to make sure that result is signed
-            hold |= input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          _out -= left;
-          strm.total_out += _out;
-          state.total += _out;
-          if (_out) {
-            strm.adler = state.check =
-                /*UPDATE(state.check, put - _out, _out);*/
-                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
-
-          }
-          _out = left;
-          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
-          if ((state.flags ? hold : zswap32(hold)) !== state.check) {
-            strm.msg = 'incorrect data check';
-            state.mode = BAD;
-            break;
-          }
-          //=== INITBITS();
-          hold = 0;
-          bits = 0;
-          //===//
-          //Tracev((stderr, "inflate:   check matches trailer\n"));
-        }
-        state.mode = LENGTH;
-        /* falls through */
-      case LENGTH:
-        if (state.wrap && state.flags) {
-          //=== NEEDBITS(32);
-          while (bits < 32) {
-            if (have === 0) { break inf_leave; }
-            have--;
-            hold += input[next++] << bits;
-            bits += 8;
-          }
-          //===//
-          if (hold !== (state.total & 0xffffffff)) {
-            strm.msg = 'incorrect length check';
-            state.mode = BAD;
-            break;
-          }
-          //=== INITBITS();
-          hold = 0;
-          bits = 0;
-          //===//
-          //Tracev((stderr, "inflate:   length matches trailer\n"));
-        }
-        state.mode = DONE;
-        /* falls through */
-      case DONE:
-        ret = Z_STREAM_END;
-        break inf_leave;
-      case BAD:
-        ret = Z_DATA_ERROR;
-        break inf_leave;
-      case MEM:
-        return Z_MEM_ERROR;
-      case SYNC:
-        /* falls through */
-      default:
-        return Z_STREAM_ERROR;
-    }
-  }
-
-  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
-
-  /*
-     Return from inflate(), updating the total counts and the check value.
-     If there was no progress during the inflate() call, return a buffer
-     error.  Call updatewindow() to create and/or update the window state.
-     Note: a memory error from inflate() is non-recoverable.
-   */
-
-  //--- RESTORE() ---
-  strm.next_out = put;
-  strm.avail_out = left;
-  strm.next_in = next;
-  strm.avail_in = have;
-  state.hold = hold;
-  state.bits = bits;
-  //---
-
-  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
-                      (state.mode < CHECK || flush !== Z_FINISH))) {
-    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
-      state.mode = MEM;
-      return Z_MEM_ERROR;
-    }
-  }
-  _in -= strm.avail_in;
-  _out -= strm.avail_out;
-  strm.total_in += _in;
-  strm.total_out += _out;
-  state.total += _out;
-  if (state.wrap && _out) {
-    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
-      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
-  }
-  strm.data_type = state.bits + (state.last ? 64 : 0) +
-                    (state.mode === TYPE ? 128 : 0) +
-                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
-  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
-    ret = Z_BUF_ERROR;
-  }
-  return ret;
-}
-
-function inflateEnd(strm) {
-
-  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
-    return Z_STREAM_ERROR;
-  }
-
-  var state = strm.state;
-  if (state.window) {
-    state.window = null;
-  }
-  strm.state = null;
-  return Z_OK;
-}
-
-function inflateGetHeader(strm, head) {
-  var state;
-
-  /* check state */
-  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-  state = strm.state;
-  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
-
-  /* save header structure */
-  state.head = head;
-  head.done = false;
-  return Z_OK;
-}
-
-function inflateSetDictionary(strm, dictionary) {
-  var dictLength = dictionary.length;
-
-  var state;
-  var dictid;
-  var ret;
-
-  /* check state */
-  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
-  state = strm.state;
-
-  if (state.wrap !== 0 && state.mode !== DICT) {
-    return Z_STREAM_ERROR;
-  }
-
-  /* check for correct dictionary identifier */
-  if (state.mode === DICT) {
-    dictid = 1; /* adler32(0, null, 0)*/
-    /* dictid = adler32(dictid, dictionary, dictLength); */
-    dictid = adler32(dictid, dictionary, dictLength, 0);
-    if (dictid !== state.check) {
-      return Z_DATA_ERROR;
-    }
-  }
-  /* copy dictionary to window using updatewindow(), which will amend the
-   existing dictionary if appropriate */
-  ret = updatewindow(strm, dictionary, dictLength, dictLength);
-  if (ret) {
-    state.mode = MEM;
-    return Z_MEM_ERROR;
-  }
-  state.havedict = 1;
-  // Tracev((stderr, "inflate:   dictionary set\n"));
-  return Z_OK;
-}
-
-exports.inflateReset = inflateReset;
-exports.inflateReset2 = inflateReset2;
-exports.inflateResetKeep = inflateResetKeep;
-exports.inflateInit = inflateInit;
-exports.inflateInit2 = inflateInit2;
-exports.inflate = inflate;
-exports.inflateEnd = inflateEnd;
-exports.inflateGetHeader = inflateGetHeader;
-exports.inflateSetDictionary = inflateSetDictionary;
-exports.inflateInfo = 'pako inflate (from Nodeca project)';
-
-/* Not implemented
-exports.inflateCopy = inflateCopy;
-exports.inflateGetDictionary = inflateGetDictionary;
-exports.inflateMark = inflateMark;
-exports.inflatePrime = inflatePrime;
-exports.inflateSync = inflateSync;
-exports.inflateSyncPoint = inflateSyncPoint;
-exports.inflateUndermine = inflateUndermine;
-*/
-
-},{"../utils/common":26,"./adler32":28,"./crc32":30,"./inffast":33,"./inftrees":35}],35:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-var utils = require('../utils/common');
-
-var MAXBITS = 15;
-var ENOUGH_LENS = 852;
-var ENOUGH_DISTS = 592;
-//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
-var CODES = 0;
-var LENS = 1;
-var DISTS = 2;
-
-var lbase = [ /* Length codes 257..285 base */
-  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
-  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
-];
-
-var lext = [ /* Length codes 257..285 extra */
-  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
-  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
-];
-
-var dbase = [ /* Distance codes 0..29 base */
-  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
-  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
-  8193, 12289, 16385, 24577, 0, 0
-];
-
-var dext = [ /* Distance codes 0..29 extra */
-  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
-  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
-  28, 28, 29, 29, 64, 64
-];
-
-module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
-{
-  var bits = opts.bits;
-      //here = opts.here; /* table entry for duplication */
-
-  var len = 0;               /* a code's length in bits */
-  var sym = 0;               /* index of code symbols */
-  var min = 0, max = 0;          /* minimum and maximum code lengths */
-  var root = 0;              /* number of index bits for root table */
-  var curr = 0;              /* number of index bits for current table */
-  var drop = 0;              /* code bits to drop for sub-table */
-  var left = 0;                   /* number of prefix codes available */
-  var used = 0;              /* code entries in table used */
-  var huff = 0;              /* Huffman code */
-  var incr;              /* for incrementing code, index */
-  var fill;              /* index for replicating entries */
-  var low;               /* low bits for current root entry */
-  var mask;              /* mask for low root bits */
-  var next;             /* next available space in table */
-  var base = null;     /* base value table to use */
-  var base_index = 0;
-//  var shoextra;    /* extra bits table to use */
-  var end;                    /* use base and extra for symbol > end */
-  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
-  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
-  var extra = null;
-  var extra_index = 0;
-
-  var here_bits, here_op, here_val;
-
-  /*
-   Process a set of code lengths to create a canonical Huffman code.  The
-   code lengths are lens[0..codes-1].  Each length corresponds to the
-   symbols 0..codes-1.  The Huffman code is generated by first sorting the
-   symbols by length from short to long, and retaining the symbol order
-   for codes with equal lengths.  Then the code starts with all zero bits
-   for the first code of the shortest length, and the codes are integer
-   increments for the same length, and zeros are appended as the length
-   increases.  For the deflate format, these bits are stored backwards
-   from their more natural integer increment ordering, and so when the
-   decoding tables are built in the large loop below, the integer codes
-   are incremented backwards.
-
-   This routine assumes, but does not check, that all of the entries in
-   lens[] are in the range 0..MAXBITS.  The caller must assure this.
-   1..MAXBITS is interpreted as that code length.  zero means that that
-   symbol does not occur in this code.
-
-   The codes are sorted by computing a count of codes for each length,
-   creating from that a table of starting indices for each length in the
-   sorted table, and then entering the symbols in order in the sorted
-   table.  The sorted table is work[], with that space being provided by
-   the caller.
-
-   The length counts are used for other purposes as well, i.e. finding
-   the minimum and maximum length codes, determining if there are any
-   codes at all, checking for a valid set of lengths, and looking ahead
-   at length counts to determine sub-table sizes when building the
-   decoding tables.
-   */
-
-  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
-  for (len = 0; len <= MAXBITS; len++) {
-    count[len] = 0;
-  }
-  for (sym = 0; sym < codes; sym++) {
-    count[lens[lens_index + sym]]++;
-  }
-
-  /* bound code lengths, force root to be within code lengths */
-  root = bits;
-  for (max = MAXBITS; max >= 1; max--) {
-    if (count[max] !== 0) { break; }
-  }
-  if (root > max) {
-    root = max;
-  }
-  if (max === 0) {                     /* no symbols to code at all */
-    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
-    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
-    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
-    table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-
-    //table.op[opts.table_index] = 64;
-    //table.bits[opts.table_index] = 1;
-    //table.val[opts.table_index++] = 0;
-    table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-    opts.bits = 1;
-    return 0;     /* no symbols, but wait for decoding to report error */
-  }
-  for (min = 1; min < max; min++) {
-    if (count[min] !== 0) { break; }
-  }
-  if (root < min) {
-    root = min;
-  }
-
-  /* check for an over-subscribed or incomplete set of lengths */
-  left = 1;
-  for (len = 1; len <= MAXBITS; len++) {
-    left <<= 1;
-    left -= count[len];
-    if (left < 0) {
-      return -1;
-    }        /* over-subscribed */
-  }
-  if (left > 0 && (type === CODES || max !== 1)) {
-    return -1;                      /* incomplete set */
-  }
-
-  /* generate offsets into symbol table for each length for sorting */
-  offs[1] = 0;
-  for (len = 1; len < MAXBITS; len++) {
-    offs[len + 1] = offs[len] + count[len];
-  }
-
-  /* sort symbols by length, by symbol order within each length */
-  for (sym = 0; sym < codes; sym++) {
-    if (lens[lens_index + sym] !== 0) {
-      work[offs[lens[lens_index + sym]]++] = sym;
-    }
-  }
-
-  /*
-   Create and fill in decoding tables.  In this loop, the table being
-   filled is at next and has curr index bits.  The code being used is huff
-   with length len.  That code is converted to an index by dropping drop
-   bits off of the bottom.  For codes where len is less than drop + curr,
-   those top drop + curr - len bits are incremented through all values to
-   fill the table with replicated entries.
-
-   root is the number of index bits for the root table.  When len exceeds
-   root, sub-tables are created pointed to by the root entry with an index
-   of the low root bits of huff.  This is saved in low to check for when a
-   new sub-table should be started.  drop is zero when the root table is
-   being filled, and drop is root when sub-tables are being filled.
-
-   When a new sub-table is needed, it is necessary to look ahead in the
-   code lengths to determine what size sub-table is needed.  The length
-   counts are used for this, and so count[] is decremented as codes are
-   entered in the tables.
-
-   used keeps track of how many table entries have been allocated from the
-   provided *table space.  It is checked for LENS and DIST tables against
-   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
-   the initial root table size constants.  See the comments in inftrees.h
-   for more information.
-
-   sym increments through all symbols, and the loop terminates when
-   all codes of length max, i.e. all codes, have been processed.  This
-   routine permits incomplete codes, so another loop after this one fills
-   in the rest of the decoding tables with invalid code markers.
-   */
-
-  /* set up for code type */
-  // poor man optimization - use if-else instead of switch,
-  // to avoid deopts in old v8
-  if (type === CODES) {
-    base = extra = work;    /* dummy value--not used */
-    end = 19;
-
-  } else if (type === LENS) {
-    base = lbase;
-    base_index -= 257;
-    extra = lext;
-    extra_index -= 257;
-    end = 256;
-
-  } else {                    /* DISTS */
-    base = dbase;
-    extra = dext;
-    end = -1;
-  }
-
-  /* initialize opts for loop */
-  huff = 0;                   /* starting code */
-  sym = 0;                    /* starting code symbol */
-  len = min;                  /* starting code length */
-  next = table_index;              /* current table to fill in */
-  curr = root;                /* current table index bits */
-  drop = 0;                   /* current bits to drop from code for index */
-  low = -1;                   /* trigger new sub-table when len > root */
-  used = 1 << root;          /* use root table entries */
-  mask = used - 1;            /* mask for comparing low */
-
-  /* check available table space */
-  if ((type === LENS && used > ENOUGH_LENS) ||
-    (type === DISTS && used > ENOUGH_DISTS)) {
-    return 1;
-  }
-
-  /* process all codes and make table entries */
-  for (;;) {
-    /* create table entry */
-    here_bits = len - drop;
-    if (work[sym] < end) {
-      here_op = 0;
-      here_val = work[sym];
-    }
-    else if (work[sym] > end) {
-      here_op = extra[extra_index + work[sym]];
-      here_val = base[base_index + work[sym]];
-    }
-    else {
-      here_op = 32 + 64;         /* end of block */
-      here_val = 0;
-    }
-
-    /* replicate for those indices with low len bits equal to huff */
-    incr = 1 << (len - drop);
-    fill = 1 << curr;
-    min = fill;                 /* save offset to next table */
-    do {
-      fill -= incr;
-      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
-    } while (fill !== 0);
-
-    /* backwards increment the len-bit code huff */
-    incr = 1 << (len - 1);
-    while (huff & incr) {
-      incr >>= 1;
-    }
-    if (incr !== 0) {
-      huff &= incr - 1;
-      huff += incr;
-    } else {
-      huff = 0;
-    }
-
-    /* go to next symbol, update count, len */
-    sym++;
-    if (--count[len] === 0) {
-      if (len === max) { break; }
-      len = lens[lens_index + work[sym]];
-    }
-
-    /* create new sub-table if needed */
-    if (len > root && (huff & mask) !== low) {
-      /* if first time, transition to sub-tables */
-      if (drop === 0) {
-        drop = root;
-      }
-
-      /* increment past last table */
-      next += min;            /* here min is 1 << curr */
-
-      /* determine length of next table */
-      curr = len - drop;
-      left = 1 << curr;
-      while (curr + drop < max) {
-        left -= count[curr + drop];
-        if (left <= 0) { break; }
-        curr++;
-        left <<= 1;
-      }
-
-      /* check for enough space */
-      used += 1 << curr;
-      if ((type === LENS && used > ENOUGH_LENS) ||
-        (type === DISTS && used > ENOUGH_DISTS)) {
-        return 1;
-      }
-
-      /* point entry in root table to sub-table */
-      low = huff & mask;
-      /*table.op[low] = curr;
-      table.bits[low] = root;
-      table.val[low] = next - opts.table_index;*/
-      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
-    }
-  }
-
-  /* fill in remaining table entry if code is incomplete (guaranteed to have
-   at most one remaining entry, since if the code is incomplete, the
-   maximum code length that was allowed to get this far is one bit) */
-  if (huff !== 0) {
-    //table.op[next + huff] = 64;            /* invalid code marker */
-    //table.bits[next + huff] = len - drop;
-    //table.val[next + huff] = 0;
-    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
-  }
-
-  /* set return parameters */
-  //opts.table_index += used;
-  opts.bits = root;
-  return 0;
-};
-
-},{"../utils/common":26}],36:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-module.exports = {
-  2:      'need dictionary',     /* Z_NEED_DICT       2  */
-  1:      'stream end',          /* Z_STREAM_END      1  */
-  0:      '',                    /* Z_OK              0  */
-  '-1':   'file error',          /* Z_ERRNO         (-1) */
-  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
-  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
-  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
-  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
-  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
-};
-
-},{}],37:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-/* eslint-disable space-unary-ops */
-
-var utils = require('../utils/common');
-
-/* Public constants ==========================================================*/
-/* ===========================================================================*/
-
-
-//var Z_FILTERED          = 1;
-//var Z_HUFFMAN_ONLY      = 2;
-//var Z_RLE               = 3;
-var Z_FIXED               = 4;
-//var Z_DEFAULT_STRATEGY  = 0;
-
-/* Possible values of the data_type field (though see inflate()) */
-var Z_BINARY              = 0;
-var Z_TEXT                = 1;
-//var Z_ASCII             = 1; // = Z_TEXT
-var Z_UNKNOWN             = 2;
-
-/*============================================================================*/
-
-
-function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
-
-// From zutil.h
-
-var STORED_BLOCK = 0;
-var STATIC_TREES = 1;
-var DYN_TREES    = 2;
-/* The three kinds of block type */
-
-var MIN_MATCH    = 3;
-var MAX_MATCH    = 258;
-/* The minimum and maximum match lengths */
-
-// From deflate.h
-/* ===========================================================================
- * Internal compression state.
- */
-
-var LENGTH_CODES  = 29;
-/* number of length codes, not counting the special END_BLOCK code */
-
-var LITERALS      = 256;
-/* number of literal bytes 0..255 */
-
-var L_CODES       = LITERALS + 1 + LENGTH_CODES;
-/* number of Literal or Length codes, including the END_BLOCK code */
-
-var D_CODES       = 30;
-/* number of distance codes */
-
-var BL_CODES      = 19;
-/* number of codes used to transfer the bit lengths */
-
-var HEAP_SIZE     = 2 * L_CODES + 1;
-/* maximum heap size */
-
-var MAX_BITS      = 15;
-/* All codes must not exceed MAX_BITS bits */
-
-var Buf_size      = 16;
-/* size of bit buffer in bi_buf */
-
-
-/* ===========================================================================
- * Constants
- */
-
-var MAX_BL_BITS = 7;
-/* Bit length codes must not exceed MAX_BL_BITS bits */
-
-var END_BLOCK   = 256;
-/* end of block literal code */
-
-var REP_3_6     = 16;
-/* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
-var REPZ_3_10   = 17;
-/* repeat a zero length 3-10 times  (3 bits of repeat count) */
-
-var REPZ_11_138 = 18;
-/* repeat a zero length 11-138 times  (7 bits of repeat count) */
-
-/* eslint-disable comma-spacing,array-bracket-spacing */
-var extra_lbits =   /* extra bits for each length code */
-  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
-
-var extra_dbits =   /* extra bits for each distance code */
-  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
-
-var extra_blbits =  /* extra bits for each bit length code */
-  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
-
-var bl_order =
-  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
-/* eslint-enable comma-spacing,array-bracket-spacing */
-
-/* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
-/* ===========================================================================
- * Local data. These are initialized only once.
- */
-
-// We pre-fill arrays with 0 to avoid uninitialized gaps
-
-var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
-
-// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
-var static_ltree  = new Array((L_CODES + 2) * 2);
-zero(static_ltree);
-/* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
-var static_dtree  = new Array(D_CODES * 2);
-zero(static_dtree);
-/* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
-var _dist_code    = new Array(DIST_CODE_LEN);
-zero(_dist_code);
-/* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
-var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
-zero(_length_code);
-/* length code for each normalized match length (0 == MIN_MATCH) */
-
-var base_length   = new Array(LENGTH_CODES);
-zero(base_length);
-/* First normalized length for each code (0 = MIN_MATCH) */
-
-var base_dist     = new Array(D_CODES);
-zero(base_dist);
-/* First normalized distance for each code (0 = distance of 1) */
-
-
-function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
-
-  this.static_tree  = static_tree;  /* static tree or NULL */
-  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
-  this.extra_base   = extra_base;   /* base index for extra_bits */
-  this.elems        = elems;        /* max number of elements in the tree */
-  this.max_length   = max_length;   /* max bit length for the codes */
-
-  // show if `static_tree` has data or dummy - needed for monomorphic objects
-  this.has_stree    = static_tree && static_tree.length;
-}
-
-
-var static_l_desc;
-var static_d_desc;
-var static_bl_desc;
-
-
-function TreeDesc(dyn_tree, stat_desc) {
-  this.dyn_tree = dyn_tree;     /* the dynamic tree */
-  this.max_code = 0;            /* largest code with non zero frequency */
-  this.stat_desc = stat_desc;   /* the corresponding static tree */
-}
-
-
-
-function d_code(dist) {
-  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
-}
-
-
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-function put_short(s, w) {
-//    put_byte(s, (uch)((w) & 0xff));
-//    put_byte(s, (uch)((ush)(w) >> 8));
-  s.pending_buf[s.pending++] = (w) & 0xff;
-  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
-}
-
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-function send_bits(s, value, length) {
-  if (s.bi_valid > (Buf_size - length)) {
-    s.bi_buf |= (value << s.bi_valid) & 0xffff;
-    put_short(s, s.bi_buf);
-    s.bi_buf = value >> (Buf_size - s.bi_valid);
-    s.bi_valid += length - Buf_size;
-  } else {
-    s.bi_buf |= (value << s.bi_valid) & 0xffff;
-    s.bi_valid += length;
-  }
-}
-
-
-function send_code(s, c, tree) {
-  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
-}
-
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-function bi_reverse(code, len) {
-  var res = 0;
-  do {
-    res |= code & 1;
-    code >>>= 1;
-    res <<= 1;
-  } while (--len > 0);
-  return res >>> 1;
-}
-
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-function bi_flush(s) {
-  if (s.bi_valid === 16) {
-    put_short(s, s.bi_buf);
-    s.bi_buf = 0;
-    s.bi_valid = 0;
-
-  } else if (s.bi_valid >= 8) {
-    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
-    s.bi_buf >>= 8;
-    s.bi_valid -= 8;
-  }
-}
-
-
-/* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- *    above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- *     array bl_count contains the frequencies for each bit length.
- *     The length opt_len is updated; static_len is also updated if stree is
- *     not null.
- */
-function gen_bitlen(s, desc)
-//    deflate_state *s;
-//    tree_desc *desc;    /* the tree descriptor */
-{
-  var tree            = desc.dyn_tree;
-  var max_code        = desc.max_code;
-  var stree           = desc.stat_desc.static_tree;
-  var has_stree       = desc.stat_desc.has_stree;
-  var extra           = desc.stat_desc.extra_bits;
-  var base            = desc.stat_desc.extra_base;
-  var max_length      = desc.stat_desc.max_length;
-  var h;              /* heap index */
-  var n, m;           /* iterate over the tree elements */
-  var bits;           /* bit length */
-  var xbits;          /* extra bits */
-  var f;              /* frequency */
-  var overflow = 0;   /* number of elements with bit length too large */
-
-  for (bits = 0; bits <= MAX_BITS; bits++) {
-    s.bl_count[bits] = 0;
-  }
-
-  /* In a first pass, compute the optimal bit lengths (which may
-   * overflow in the case of the bit length tree).
-   */
-  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
-
-  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
-    n = s.heap[h];
-    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
-    if (bits > max_length) {
-      bits = max_length;
-      overflow++;
-    }
-    tree[n * 2 + 1]/*.Len*/ = bits;
-    /* We overwrite tree[n].Dad which is no longer needed */
-
-    if (n > max_code) { continue; } /* not a leaf node */
-
-    s.bl_count[bits]++;
-    xbits = 0;
-    if (n >= base) {
-      xbits = extra[n - base];
-    }
-    f = tree[n * 2]/*.Freq*/;
-    s.opt_len += f * (bits + xbits);
-    if (has_stree) {
-      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
-    }
-  }
-  if (overflow === 0) { return; }
-
-  // Trace((stderr,"\nbit length overflow\n"));
-  /* This happens for example on obj2 and pic of the Calgary corpus */
-
-  /* Find the first bit length which could increase: */
-  do {
-    bits = max_length - 1;
-    while (s.bl_count[bits] === 0) { bits--; }
-    s.bl_count[bits]--;      /* move one leaf down the tree */
-    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
-    s.bl_count[max_length]--;
-    /* The brother of the overflow item also moves one step up,
-     * but this does not affect bl_count[max_length]
-     */
-    overflow -= 2;
-  } while (overflow > 0);
-
-  /* Now recompute all bit lengths, scanning in increasing frequency.
-   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
-   * lengths instead of fixing only the wrong ones. This idea is taken
-   * from 'ar' written by Haruhiko Okumura.)
-   */
-  for (bits = max_length; bits !== 0; bits--) {
-    n = s.bl_count[bits];
-    while (n !== 0) {
-      m = s.heap[--h];
-      if (m > max_code) { continue; }
-      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
-        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
-        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
-        tree[m * 2 + 1]/*.Len*/ = bits;
-      }
-      n--;
-    }
-  }
-}
-
-
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- *     zero code length.
- */
-function gen_codes(tree, max_code, bl_count)
-//    ct_data *tree;             /* the tree to decorate */
-//    int max_code;              /* largest code with non zero frequency */
-//    ushf *bl_count;            /* number of codes at each bit length */
-{
-  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
-  var code = 0;              /* running code value */
-  var bits;                  /* bit index */
-  var n;                     /* code index */
-
-  /* The distribution counts are first used to generate the code values
-   * without bit reversal.
-   */
-  for (bits = 1; bits <= MAX_BITS; bits++) {
-    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
-  }
-  /* Check that the bit counts in bl_count are consistent. The last code
-   * must be all ones.
-   */
-  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
-  //        "inconsistent bit counts");
-  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
-  for (n = 0;  n <= max_code; n++) {
-    var len = tree[n * 2 + 1]/*.Len*/;
-    if (len === 0) { continue; }
-    /* Now reverse the bits */
-    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
-
-    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
-    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
-  }
-}
-
-
-/* ===========================================================================
- * Initialize the various 'constant' tables.
- */
-function tr_static_init() {
-  var n;        /* iterates over tree elements */
-  var bits;     /* bit counter */
-  var length;   /* length value */
-  var code;     /* code value */
-  var dist;     /* distance index */
-  var bl_count = new Array(MAX_BITS + 1);
-  /* number of codes at each bit length for an optimal tree */
-
-  // do check in _tr_init()
-  //if (static_init_done) return;
-
-  /* For some embedded targets, global variables are not initialized: */
-/*#ifdef NO_INIT_GLOBAL_POINTERS
-  static_l_desc.static_tree = static_ltree;
-  static_l_desc.extra_bits = extra_lbits;
-  static_d_desc.static_tree = static_dtree;
-  static_d_desc.extra_bits = extra_dbits;
-  static_bl_desc.extra_bits = extra_blbits;
-#endif*/
-
-  /* Initialize the mapping length (0..255) -> length code (0..28) */
-  length = 0;
-  for (code = 0; code < LENGTH_CODES - 1; code++) {
-    base_length[code] = length;
-    for (n = 0; n < (1 << extra_lbits[code]); n++) {
-      _length_code[length++] = code;
-    }
-  }
-  //Assert (length == 256, "tr_static_init: length != 256");
-  /* Note that the length 255 (match length 258) can be represented
-   * in two different ways: code 284 + 5 bits or code 285, so we
-   * overwrite length_code[255] to use the best encoding:
-   */
-  _length_code[length - 1] = code;
-
-  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
-  dist = 0;
-  for (code = 0; code < 16; code++) {
-    base_dist[code] = dist;
-    for (n = 0; n < (1 << extra_dbits[code]); n++) {
-      _dist_code[dist++] = code;
-    }
-  }
-  //Assert (dist == 256, "tr_static_init: dist != 256");
-  dist >>= 7; /* from now on, all distances are divided by 128 */
-  for (; code < D_CODES; code++) {
-    base_dist[code] = dist << 7;
-    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
-      _dist_code[256 + dist++] = code;
-    }
-  }
-  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
-  /* Construct the codes of the static literal tree */
-  for (bits = 0; bits <= MAX_BITS; bits++) {
-    bl_count[bits] = 0;
-  }
-
-  n = 0;
-  while (n <= 143) {
-    static_ltree[n * 2 + 1]/*.Len*/ = 8;
-    n++;
-    bl_count[8]++;
-  }
-  while (n <= 255) {
-    static_ltree[n * 2 + 1]/*.Len*/ = 9;
-    n++;
-    bl_count[9]++;
-  }
-  while (n <= 279) {
-    static_ltree[n * 2 + 1]/*.Len*/ = 7;
-    n++;
-    bl_count[7]++;
-  }
-  while (n <= 287) {
-    static_ltree[n * 2 + 1]/*.Len*/ = 8;
-    n++;
-    bl_count[8]++;
-  }
-  /* Codes 286 and 287 do not exist, but we must include them in the
-   * tree construction to get a canonical Huffman tree (longest code
-   * all ones)
-   */
-  gen_codes(static_ltree, L_CODES + 1, bl_count);
-
-  /* The static distance tree is trivial: */
-  for (n = 0; n < D_CODES; n++) {
-    static_dtree[n * 2 + 1]/*.Len*/ = 5;
-    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
-  }
-
-  // Now data ready and we can init static trees
-  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
-  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
-  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
-
-  //static_init_done = true;
-}
-
-
-/* ===========================================================================
- * Initialize a new block.
- */
-function init_block(s) {
-  var n; /* iterates over tree elements */
-
-  /* Initialize the trees. */
-  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
-  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
-  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
-
-  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
-  s.opt_len = s.static_len = 0;
-  s.last_lit = s.matches = 0;
-}
-
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-function bi_windup(s)
-{
-  if (s.bi_valid > 8) {
-    put_short(s, s.bi_buf);
-  } else if (s.bi_valid > 0) {
-    //put_byte(s, (Byte)s->bi_buf);
-    s.pending_buf[s.pending++] = s.bi_buf;
-  }
-  s.bi_buf = 0;
-  s.bi_valid = 0;
-}
-
-/* ===========================================================================
- * Copy a stored block, storing first the length and its
- * one's complement if requested.
- */
-function copy_block(s, buf, len, header)
-//DeflateState *s;
-//charf    *buf;    /* the input data */
-//unsigned len;     /* its length */
-//int      header;  /* true if block header must be written */
-{
-  bi_windup(s);        /* align on byte boundary */
-
-  if (header) {
-    put_short(s, len);
-    put_short(s, ~len);
-  }
-//  while (len--) {
-//    put_byte(s, *buf++);
-//  }
-  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
-  s.pending += len;
-}
-
-/* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
-function smaller(tree, n, m, depth) {
-  var _n2 = n * 2;
-  var _m2 = m * 2;
-  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
-         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
-}
-
-/* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
-function pqdownheap(s, tree, k)
-//    deflate_state *s;
-//    ct_data *tree;  /* the tree to restore */
-//    int k;               /* node to move down */
-{
-  var v = s.heap[k];
-  var j = k << 1;  /* left son of k */
-  while (j <= s.heap_len) {
-    /* Set j to the smallest of the two sons: */
-    if (j < s.heap_len &&
-      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
-      j++;
-    }
-    /* Exit if v is smaller than both sons */
-    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
-
-    /* Exchange v with the smallest son */
-    s.heap[k] = s.heap[j];
-    k = j;
-
-    /* And continue down the tree, setting j to the left son of k */
-    j <<= 1;
-  }
-  s.heap[k] = v;
-}
-
-
-// inlined manually
-// var SMALLEST = 1;
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-function compress_block(s, ltree, dtree)
-//    deflate_state *s;
-//    const ct_data *ltree; /* literal tree */
-//    const ct_data *dtree; /* distance tree */
-{
-  var dist;           /* distance of matched string */
-  var lc;             /* match length or unmatched char (if dist == 0) */
-  var lx = 0;         /* running index in l_buf */
-  var code;           /* the code to send */
-  var extra;          /* number of extra bits to send */
-
-  if (s.last_lit !== 0) {
-    do {
-      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
-      lc = s.pending_buf[s.l_buf + lx];
-      lx++;
-
-      if (dist === 0) {
-        send_code(s, lc, ltree); /* send a literal byte */
-        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
-      } else {
-        /* Here, lc is the match length - MIN_MATCH */
-        code = _length_code[lc];
-        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
-        extra = extra_lbits[code];
-        if (extra !== 0) {
-          lc -= base_length[code];
-          send_bits(s, lc, extra);       /* send the extra length bits */
-        }
-        dist--; /* dist is now the match distance - 1 */
-        code = d_code(dist);
-        //Assert (code < D_CODES, "bad d_code");
-
-        send_code(s, code, dtree);       /* send the distance code */
-        extra = extra_dbits[code];
-        if (extra !== 0) {
-          dist -= base_dist[code];
-          send_bits(s, dist, extra);   /* send the extra distance bits */
-        }
-      } /* literal or match pair ? */
-
-      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
-      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
-      //       "pendingBuf overflow");
-
-    } while (lx < s.last_lit);
-  }
-
-  send_code(s, END_BLOCK, ltree);
-}
-
-
-/* ===========================================================================
- * Construct one Huffman tree and assigns the code bit strings and lengths.
- * Update the total bit length for the current block.
- * IN assertion: the field freq is set for all tree elements.
- * OUT assertions: the fields len and code are set to the optimal bit length
- *     and corresponding code. The length opt_len is updated; static_len is
- *     also updated if stree is not null. The field max_code is set.
- */
-function build_tree(s, desc)
-//    deflate_state *s;
-//    tree_desc *desc; /* the tree descriptor */
-{
-  var tree     = desc.dyn_tree;
-  var stree    = desc.stat_desc.static_tree;
-  var has_stree = desc.stat_desc.has_stree;
-  var elems    = desc.stat_desc.elems;
-  var n, m;          /* iterate over heap elements */
-  var max_code = -1; /* largest code with non zero frequency */
-  var node;          /* new node being created */
-
-  /* Construct the initial heap, with least frequent element in
-   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
-   * heap[0] is not used.
-   */
-  s.heap_len = 0;
-  s.heap_max = HEAP_SIZE;
-
-  for (n = 0; n < elems; n++) {
-    if (tree[n * 2]/*.Freq*/ !== 0) {
-      s.heap[++s.heap_len] = max_code = n;
-      s.depth[n] = 0;
-
-    } else {
-      tree[n * 2 + 1]/*.Len*/ = 0;
-    }
-  }
-
-  /* The pkzip format requires that at least one distance code exists,
-   * and that at least one bit should be sent even if there is only one
-   * possible code. So to avoid special checks later on we force at least
-   * two codes of non zero frequency.
-   */
-  while (s.heap_len < 2) {
-    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
-    tree[node * 2]/*.Freq*/ = 1;
-    s.depth[node] = 0;
-    s.opt_len--;
-
-    if (has_stree) {
-      s.static_len -= stree[node * 2 + 1]/*.Len*/;
-    }
-    /* node is 0 or 1 so it does not have extra bits */
-  }
-  desc.max_code = max_code;
-
-  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
-   * establish sub-heaps of increasing lengths:
-   */
-  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
-
-  /* Construct the Huffman tree by repeatedly combining the least two
-   * frequent nodes.
-   */
-  node = elems;              /* next internal node of the tree */
-  do {
-    //pqremove(s, tree, n);  /* n = node of least frequency */
-    /*** pqremove ***/
-    n = s.heap[1/*SMALLEST*/];
-    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
-    pqdownheap(s, tree, 1/*SMALLEST*/);
-    /***/
-
-    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
-
-    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
-    s.heap[--s.heap_max] = m;
-
-    /* Create a new node father of n and m */
-    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
-    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
-    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
-
-    /* and insert the new node in the heap */
-    s.heap[1/*SMALLEST*/] = node++;
-    pqdownheap(s, tree, 1/*SMALLEST*/);
-
-  } while (s.heap_len >= 2);
-
-  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
-
-  /* At this point, the fields freq and dad are set. We can now
-   * generate the bit lengths.
-   */
-  gen_bitlen(s, desc);
-
-  /* The field len is now set, we can generate the bit codes */
-  gen_codes(tree, max_code, s.bl_count);
-}
-
-
-/* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
-function scan_tree(s, tree, max_code)
-//    deflate_state *s;
-//    ct_data *tree;   /* the tree to be scanned */
-//    int max_code;    /* and its largest code of non zero frequency */
-{
-  var n;                     /* iterates over all tree elements */
-  var prevlen = -1;          /* last emitted length */
-  var curlen;                /* length of current code */
-
-  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
-
-  var count = 0;             /* repeat count of the current code */
-  var max_count = 7;         /* max repeat count */
-  var min_count = 4;         /* min repeat count */
-
-  if (nextlen === 0) {
-    max_count = 138;
-    min_count = 3;
-  }
-  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
-
-  for (n = 0; n <= max_code; n++) {
-    curlen = nextlen;
-    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
-
-    if (++count < max_count && curlen === nextlen) {
-      continue;
-
-    } else if (count < min_count) {
-      s.bl_tree[curlen * 2]/*.Freq*/ += count;
-
-    } else if (curlen !== 0) {
-
-      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
-      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
-
-    } else if (count <= 10) {
-      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
-
-    } else {
-      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
-    }
-
-    count = 0;
-    prevlen = curlen;
-
-    if (nextlen === 0) {
-      max_count = 138;
-      min_count = 3;
-
-    } else if (curlen === nextlen) {
-      max_count = 6;
-      min_count = 3;
-
-    } else {
-      max_count = 7;
-      min_count = 4;
-    }
-  }
-}
-
-
-/* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
-function send_tree(s, tree, max_code)
-//    deflate_state *s;
-//    ct_data *tree; /* the tree to be scanned */
-//    int max_code;       /* and its largest code of non zero frequency */
-{
-  var n;                     /* iterates over all tree elements */
-  var prevlen = -1;          /* last emitted length */
-  var curlen;                /* length of current code */
-
-  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
-
-  var count = 0;             /* repeat count of the current code */
-  var max_count = 7;         /* max repeat count */
-  var min_count = 4;         /* min repeat count */
-
-  /* tree[max_code+1].Len = -1; */  /* guard already set */
-  if (nextlen === 0) {
-    max_count = 138;
-    min_count = 3;
-  }
-
-  for (n = 0; n <= max_code; n++) {
-    curlen = nextlen;
-    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
-
-    if (++count < max_count && curlen === nextlen) {
-      continue;
-
-    } else if (count < min_count) {
-      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
-
-    } else if (curlen !== 0) {
-      if (curlen !== prevlen) {
-        send_code(s, curlen, s.bl_tree);
-        count--;
-      }
-      //Assert(count >= 3 && count <= 6, " 3_6?");
-      send_code(s, REP_3_6, s.bl_tree);
-      send_bits(s, count - 3, 2);
-
-    } else if (count <= 10) {
-      send_code(s, REPZ_3_10, s.bl_tree);
-      send_bits(s, count - 3, 3);
-
-    } else {
-      send_code(s, REPZ_11_138, s.bl_tree);
-      send_bits(s, count - 11, 7);
-    }
-
-    count = 0;
-    prevlen = curlen;
-    if (nextlen === 0) {
-      max_count = 138;
-      min_count = 3;
-
-    } else if (curlen === nextlen) {
-      max_count = 6;
-      min_count = 3;
-
-    } else {
-      max_count = 7;
-      min_count = 4;
-    }
-  }
-}
-
-
-/* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
-function build_bl_tree(s) {
-  var max_blindex;  /* index of last bit length code of non zero freq */
-
-  /* Determine the bit length frequencies for literal and distance trees */
-  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
-  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
-
-  /* Build the bit length tree: */
-  build_tree(s, s.bl_desc);
-  /* opt_len now includes the length of the tree representations, except
-   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
-   */
-
-  /* Determine the number of bit length codes to send. The pkzip format
-   * requires that at least 4 bit length codes be sent. (appnote.txt says
-   * 3 but the actual value used is 4.)
-   */
-  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
-    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
-      break;
-    }
-  }
-  /* Update opt_len to include the bit length tree and counts */
-  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
-  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
-  //        s->opt_len, s->static_len));
-
-  return max_blindex;
-}
-
-
-/* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
-function send_all_trees(s, lcodes, dcodes, blcodes)
-//    deflate_state *s;
-//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
-{
-  var rank;                    /* index in bl_order */
-
-  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
-  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
-  //        "too many codes");
-  //Tracev((stderr, "\nbl counts: "));
-  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
-  send_bits(s, dcodes - 1,   5);
-  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
-  for (rank = 0; rank < blcodes; rank++) {
-    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
-    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
-  }
-  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
-  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
-  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
-  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
-  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
-}
-
-
-/* ===========================================================================
- * Check if the data type is TEXT or BINARY, using the following algorithm:
- * - TEXT if the two conditions below are satisfied:
- *    a) There are no non-portable control characters belonging to the
- *       "black list" (0..6, 14..25, 28..31).
- *    b) There is at least one printable character belonging to the
- *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
- * - BINARY otherwise.
- * - The following partially-portable control characters form a
- *   "gray list" that is ignored in this detection algorithm:
- *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
- * IN assertion: the fields Freq of dyn_ltree are set.
- */
-function detect_data_type(s) {
-  /* black_mask is the bit mask of black-listed bytes
-   * set bits 0..6, 14..25, and 28..31
-   * 0xf3ffc07f = binary 11110011111111111100000001111111
-   */
-  var black_mask = 0xf3ffc07f;
-  var n;
-
-  /* Check for non-textual ("black-listed") bytes. */
-  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
-    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
-      return Z_BINARY;
-    }
-  }
-
-  /* Check for textual ("white-listed") bytes. */
-  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
-      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
-    return Z_TEXT;
-  }
-  for (n = 32; n < LITERALS; n++) {
-    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
-      return Z_TEXT;
-    }
-  }
-
-  /* There are no "black-listed" or "white-listed" bytes:
-   * this stream either is empty or has tolerated ("gray-listed") bytes only.
-   */
-  return Z_BINARY;
-}
-
-
-var static_init_done = false;
-
-/* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
-function _tr_init(s)
-{
-
-  if (!static_init_done) {
-    tr_static_init();
-    static_init_done = true;
-  }
-
-  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
-  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
-  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
-
-  s.bi_buf = 0;
-  s.bi_valid = 0;
-
-  /* Initialize the first block of the first file: */
-  init_block(s);
-}
-
-
-/* ===========================================================================
- * Send a stored block
- */
-function _tr_stored_block(s, buf, stored_len, last)
-//DeflateState *s;
-//charf *buf;       /* input block */
-//ulg stored_len;   /* length of input block */
-//int last;         /* one if this is the last block for a file */
-{
-  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
-  copy_block(s, buf, stored_len, true); /* with header */
-}
-
-
-/* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- */
-function _tr_align(s) {
-  send_bits(s, STATIC_TREES << 1, 3);
-  send_code(s, END_BLOCK, static_ltree);
-  bi_flush(s);
-}
-
-
-/* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
- */
-function _tr_flush_block(s, buf, stored_len, last)
-//DeflateState *s;
-//charf *buf;       /* input block, or NULL if too old */
-//ulg stored_len;   /* length of input block */
-//int last;         /* one if this is the last block for a file */
-{
-  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
-  var max_blindex = 0;        /* index of last bit length code of non zero freq */
-
-  /* Build the Huffman trees unless a stored block is forced */
-  if (s.level > 0) {
-
-    /* Check if the file is binary or text */
-    if (s.strm.data_type === Z_UNKNOWN) {
-      s.strm.data_type = detect_data_type(s);
-    }
-
-    /* Construct the literal and distance trees */
-    build_tree(s, s.l_desc);
-    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
-    //        s->static_len));
-
-    build_tree(s, s.d_desc);
-    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
-    //        s->static_len));
-    /* At this point, opt_len and static_len are the total bit lengths of
-     * the compressed block data, excluding the tree representations.
-     */
-
-    /* Build the bit length tree for the above two trees, and get the index
-     * in bl_order of the last bit length code to send.
-     */
-    max_blindex = build_bl_tree(s);
-
-    /* Determine the best encoding. Compute the block lengths in bytes. */
-    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
-    static_lenb = (s.static_len + 3 + 7) >>> 3;
-
-    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
-    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
-    //        s->last_lit));
-
-    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
-
-  } else {
-    // Assert(buf != (char*)0, "lost buf");
-    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
-  }
-
-  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
-    /* 4: two words for the lengths */
-
-    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
-     * Otherwise we can't have processed more than WSIZE input bytes since
-     * the last block flush, because compression would have been
-     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
-     * transform a block into a stored block.
-     */
-    _tr_stored_block(s, buf, stored_len, last);
-
-  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
-
-    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
-    compress_block(s, static_ltree, static_dtree);
-
-  } else {
-    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
-    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
-    compress_block(s, s.dyn_ltree, s.dyn_dtree);
-  }
-  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
-  /* The above check is made mod 2^32, for files larger than 512 MB
-   * and uLong implemented on 32 bits.
-   */
-  init_block(s);
-
-  if (last) {
-    bi_windup(s);
-  }
-  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
-  //       s->compressed_len-7*last));
-}
-
-/* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
-function _tr_tally(s, dist, lc)
-//    deflate_state *s;
-//    unsigned dist;  /* distance of matched string */
-//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
-{
-  //var out_length, in_length, dcode;
-
-  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
-  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
-
-  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
-  s.last_lit++;
-
-  if (dist === 0) {
-    /* lc is the unmatched char */
-    s.dyn_ltree[lc * 2]/*.Freq*/++;
-  } else {
-    s.matches++;
-    /* Here, lc is the match length - MIN_MATCH */
-    dist--;             /* dist = match distance - 1 */
-    //Assert((ush)dist < (ush)MAX_DIST(s) &&
-    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
-    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
-
-    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
-    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
-  }
-
-// (!) This block is disabled in zlib defaults,
-// don't enable it for binary compatibility
-
-//#ifdef TRUNCATE_BLOCK
-//  /* Try to guess if it is profitable to stop the current block here */
-//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
-//    /* Compute an upper bound for the compressed length */
-//    out_length = s.last_lit*8;
-//    in_length = s.strstart - s.block_start;
-//
-//    for (dcode = 0; dcode < D_CODES; dcode++) {
-//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
-//    }
-//    out_length >>>= 3;
-//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
-//    //       s->last_lit, in_length, out_length,
-//    //       100L - out_length*100L/in_length));
-//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
-//      return true;
-//    }
-//  }
-//#endif
-
-  return (s.last_lit === s.lit_bufsize - 1);
-  /* We avoid equality with lit_bufsize because of wraparound at 64K
-   * on 16 bit machines and because stored blocks are restricted to
-   * 64K-1 bytes.
-   */
-}
-
-exports._tr_init  = _tr_init;
-exports._tr_stored_block = _tr_stored_block;
-exports._tr_flush_block  = _tr_flush_block;
-exports._tr_tally = _tr_tally;
-exports._tr_align = _tr_align;
-
-},{"../utils/common":26}],38:[function(require,module,exports){
-'use strict';
-
-// (C) 1995-2013 Jean-loup Gailly and Mark Adler
-// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//   claim that you wrote the original software. If you use this software
-//   in a product, an acknowledgment in the product documentation would be
-//   appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//   misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-
-function ZStream() {
-  /* next input byte */
-  this.input = null; // JS specific, because we have no pointers
-  this.next_in = 0;
-  /* number of bytes available at input */
-  this.avail_in = 0;
-  /* total number of input bytes read so far */
-  this.total_in = 0;
-  /* next output byte should be put there */
-  this.output = null; // JS specific, because we have no pointers
-  this.next_out = 0;
-  /* remaining free space at output */
-  this.avail_out = 0;
-  /* total number of bytes output so far */
-  this.total_out = 0;
-  /* last error message, NULL if no error */
-  this.msg = ''/*Z_NULL*/;
-  /* not visible by applications */
-  this.state = null;
-  /* best guess about the data type: binary or text */
-  this.data_type = 2/*Z_UNKNOWN*/;
-  /* adler32 value of the uncompressed data */
-  this.adler = 0;
-}
-
-module.exports = ZStream;
-
-},{}],39:[function(require,module,exports){
-(function (process){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// resolves . and .. elements in a path array with directory names there
-// must be no slashes, empty elements, or device names (c:\) in the array
-// (so also no leading and trailing slashes - it does not distinguish
-// relative and absolute paths)
-function normalizeArray(parts, allowAboveRoot) {
-  // if the path tries to go above the root, `up` ends up > 0
-  var up = 0;
-  for (var i = parts.length - 1; i >= 0; i--) {
-    var last = parts[i];
-    if (last === '.') {
-      parts.splice(i, 1);
-    } else if (last === '..') {
-      parts.splice(i, 1);
-      up++;
-    } else if (up) {
-      parts.splice(i, 1);
-      up--;
-    }
-  }
-
-  // if the path is allowed to go above the root, restore leading ..s
-  if (allowAboveRoot) {
-    for (; up--; up) {
-      parts.unshift('..');
-    }
-  }
-
-  return parts;
-}
-
-// Split a filename into [root, dir, basename, ext], unix version
-// 'root' is just a slash, or nothing.
-var splitPathRe =
-    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-var splitPath = function(filename) {
-  return splitPathRe.exec(filename).slice(1);
-};
-
-// path.resolve([from ...], to)
-// posix version
-exports.resolve = function() {
-  var resolvedPath = '',
-      resolvedAbsolute = false;
-
-  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-    var path = (i >= 0) ? arguments[i] : process.cwd();
-
-    // Skip empty and invalid entries
-    if (typeof path !== 'string') {
-      throw new TypeError('Arguments to path.resolve must be strings');
-    } else if (!path) {
-      continue;
-    }
-
-    resolvedPath = path + '/' + resolvedPath;
-    resolvedAbsolute = path.charAt(0) === '/';
-  }
-
-  // At this point the path should be resolved to a full absolute path, but
-  // handle relative paths to be safe (might happen when process.cwd() fails)
-
-  // Normalize the path
-  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
-    return !!p;
-  }), !resolvedAbsolute).join('/');
-
-  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
-};
-
-// path.normalize(path)
-// posix version
-exports.normalize = function(path) {
-  var isAbsolute = exports.isAbsolute(path),
-      trailingSlash = substr(path, -1) === '/';
-
-  // Normalize the path
-  path = normalizeArray(filter(path.split('/'), function(p) {
-    return !!p;
-  }), !isAbsolute).join('/');
-
-  if (!path && !isAbsolute) {
-    path = '.';
-  }
-  if (path && trailingSlash) {
-    path += '/';
-  }
-
-  return (isAbsolute ? '/' : '') + path;
-};
-
-// posix version
-exports.isAbsolute = function(path) {
-  return path.charAt(0) === '/';
-};
-
-// posix version
-exports.join = function() {
-  var paths = Array.prototype.slice.call(arguments, 0);
-  return exports.normalize(filter(paths, function(p, index) {
-    if (typeof p !== 'string') {
-      throw new TypeError('Arguments to path.join must be strings');
-    }
-    return p;
-  }).join('/'));
-};
-
-
-// path.relative(from, to)
-// posix version
-exports.relative = function(from, to) {
-  from = exports.resolve(from).substr(1);
-  to = exports.resolve(to).substr(1);
-
-  function trim(arr) {
-    var start = 0;
-    for (; start < arr.length; start++) {
-      if (arr[start] !== '') break;
-    }
-
-    var end = arr.length - 1;
-    for (; end >= 0; end--) {
-      if (arr[end] !== '') break;
-    }
-
-    if (start > end) return [];
-    return arr.slice(start, end - start + 1);
-  }
-
-  var fromParts = trim(from.split('/'));
-  var toParts = trim(to.split('/'));
-
-  var length = Math.min(fromParts.length, toParts.length);
-  var samePartsLength = length;
-  for (var i = 0; i < length; i++) {
-    if (fromParts[i] !== toParts[i]) {
-      samePartsLength = i;
-      break;
-    }
-  }
-
-  var outputParts = [];
-  for (var i = samePartsLength; i < fromParts.length; i++) {
-    outputParts.push('..');
-  }
-
-  outputParts = outputParts.concat(toParts.slice(samePartsLength));
-
-  return outputParts.join('/');
-};
-
-exports.sep = '/';
-exports.delimiter = ':';
-
-exports.dirname = function(path) {
-  var result = splitPath(path),
-      root = result[0],
-      dir = result[1];
-
-  if (!root && !dir) {
-    // No dirname whatsoever
-    return '.';
-  }
-
-  if (dir) {
-    // It has a dirname, strip trailing slash
-    dir = dir.substr(0, dir.length - 1);
-  }
-
-  return root + dir;
-};
-
-
-exports.basename = function(path, ext) {
-  var f = splitPath(path)[2];
-  // TODO: make this comparison case-insensitive on windows?
-  if (ext && f.substr(-1 * ext.length) === ext) {
-    f = f.substr(0, f.length - ext.length);
-  }
-  return f;
-};
-
-
-exports.extname = function(path) {
-  return splitPath(path)[3];
-};
-
-function filter (xs, f) {
-    if (xs.filter) return xs.filter(f);
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        if (f(xs[i], i, xs)) res.push(xs[i]);
-    }
-    return res;
-}
-
-// String.prototype.substr - negative index don't work in IE8
-var substr = 'ab'.substr(-1) === 'b'
-    ? function (str, start, len) { return str.substr(start, len) }
-    : function (str, start, len) {
-        if (start < 0) start = str.length + start;
-        return str.substr(start, len);
-    }
-;
-
-}).call(this,require('_process'))
-
-},{"_process":7}],40:[function(require,module,exports){
-'use strict';
-
-module.exports = Pbf;
-
-var ieee754 = require('ieee754');
-
-function Pbf(buf) {
-    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
-    this.pos = 0;
-    this.type = 0;
-    this.length = this.buf.length;
-}
-
-Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
-Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
-Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
-Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
-
-var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
-    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
-
-// Threshold chosen based on both benchmarking and knowledge about browser string
-// data structures (which currently switch structure types at 12 bytes or more)
-var TEXT_DECODER_MIN_LENGTH = 12;
-var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
-
-Pbf.prototype = {
-
-    destroy: function() {
-        this.buf = null;
-    },
-
-    // === READING =================================================================
-
-    readFields: function(readField, result, end) {
-        end = end || this.length;
-
-        while (this.pos < end) {
-            var val = this.readVarint(),
-                tag = val >> 3,
-                startPos = this.pos;
-
-            this.type = val & 0x7;
-            readField(tag, result, this);
-
-            if (this.pos === startPos) this.skip(val);
-        }
-        return result;
-    },
-
-    readMessage: function(readField, result) {
-        return this.readFields(readField, result, this.readVarint() + this.pos);
-    },
-
-    readFixed32: function() {
-        var val = readUInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
-
-    readSFixed32: function() {
-        var val = readInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
-
-    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
-
-    readFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
-
-    readSFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
-
-    readFloat: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
-        this.pos += 4;
-        return val;
-    },
-
-    readDouble: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
-        this.pos += 8;
-        return val;
-    },
-
-    readVarint: function(isSigned) {
-        var buf = this.buf,
-            val, b;
-
-        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
-        b = buf[this.pos];   val |= (b & 0x0f) << 28;
-
-        return readVarintRemainder(val, isSigned, this);
-    },
-
-    readVarint64: function() { // for compatibility with v2.0.1
-        return this.readVarint(true);
-    },
-
-    readSVarint: function() {
-        var num = this.readVarint();
-        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
-    },
-
-    readBoolean: function() {
-        return Boolean(this.readVarint());
-    },
-
-    readString: function() {
-        var end = this.readVarint() + this.pos;
-        var pos = this.pos;
-        this.pos = end;
-
-        if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
-            // longer strings are fast with the built-in browser TextDecoder API
-            return readUtf8TextDecoder(this.buf, pos, end);
-        }
-        // short strings are fast with our custom implementation
-        return readUtf8(this.buf, pos, end);
-    },
-
-    readBytes: function() {
-        var end = this.readVarint() + this.pos,
-            buffer = this.buf.subarray(this.pos, end);
-        this.pos = end;
-        return buffer;
-    },
-
-    // verbose for performance reasons; doesn't affect gzipped size
-
-    readPackedVarint: function(arr, isSigned) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readVarint(isSigned));
-        return arr;
-    },
-    readPackedSVarint: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSVarint());
-        return arr;
-    },
-    readPackedBoolean: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readBoolean());
-        return arr;
-    },
-    readPackedFloat: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFloat());
-        return arr;
-    },
-    readPackedDouble: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readDouble());
-        return arr;
-    },
-    readPackedFixed32: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed32());
-        return arr;
-    },
-    readPackedSFixed32: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed32());
-        return arr;
-    },
-    readPackedFixed64: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed64());
-        return arr;
-    },
-    readPackedSFixed64: function(arr) {
-        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed64());
-        return arr;
-    },
-
-    skip: function(val) {
-        var type = val & 0x7;
-        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-        else if (type === Pbf.Fixed32) this.pos += 4;
-        else if (type === Pbf.Fixed64) this.pos += 8;
-        else throw new Error('Unimplemented type: ' + type);
-    },
-
-    // === WRITING =================================================================
-
-    writeTag: function(tag, type) {
-        this.writeVarint((tag << 3) | type);
-    },
-
-    realloc: function(min) {
-        var length = this.length || 16;
-
-        while (length < this.pos + min) length *= 2;
-
-        if (length !== this.length) {
-            var buf = new Uint8Array(length);
-            buf.set(this.buf);
-            this.buf = buf;
-            this.length = length;
-        }
-    },
-
-    finish: function() {
-        this.length = this.pos;
-        this.pos = 0;
-        return this.buf.subarray(0, this.length);
-    },
-
-    writeFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
-
-    writeSFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
-
-    writeFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
-
-    writeSFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
-
-    writeVarint: function(val) {
-        val = +val || 0;
-
-        if (val > 0xfffffff || val < 0) {
-            writeBigVarint(val, this);
-            return;
-        }
-
-        this.realloc(4);
-
-        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
-    },
-
-    writeSVarint: function(val) {
-        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
-    },
-
-    writeBoolean: function(val) {
-        this.writeVarint(Boolean(val));
-    },
-
-    writeString: function(str) {
-        str = String(str);
-        this.realloc(str.length * 4);
-
-        this.pos++; // reserve 1 byte for short string length
-
-        var startPos = this.pos;
-        // write the string directly to the buffer and see how much was written
-        this.pos = writeUtf8(this.buf, str, this.pos);
-        var len = this.pos - startPos;
-
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
-
-    writeFloat: function(val) {
-        this.realloc(4);
-        ieee754.write(this.buf, val, this.pos, true, 23, 4);
-        this.pos += 4;
-    },
-
-    writeDouble: function(val) {
-        this.realloc(8);
-        ieee754.write(this.buf, val, this.pos, true, 52, 8);
-        this.pos += 8;
-    },
-
-    writeBytes: function(buffer) {
-        var len = buffer.length;
-        this.writeVarint(len);
-        this.realloc(len);
-        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
-    },
-
-    writeRawMessage: function(fn, obj) {
-        this.pos++; // reserve 1 byte for short message length
-
-        // write the message directly to the buffer and see how much was written
-        var startPos = this.pos;
-        fn(obj, this);
-        var len = this.pos - startPos;
-
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
-
-    writeMessage: function(tag, fn, obj) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeRawMessage(fn, obj);
-    },
-
-    writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
-    writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
-    writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
-    writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
-    writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
-    writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
-    writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
-    writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
-    writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
-
-    writeBytesField: function(tag, buffer) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeBytes(buffer);
-    },
-    writeFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFixed32(val);
-    },
-    writeSFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeSFixed32(val);
-    },
-    writeFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeFixed64(val);
-    },
-    writeSFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeSFixed64(val);
-    },
-    writeVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeVarint(val);
-    },
-    writeSVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeSVarint(val);
-    },
-    writeStringField: function(tag, str) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeString(str);
-    },
-    writeFloatField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFloat(val);
-    },
-    writeDoubleField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeDouble(val);
-    },
-    writeBooleanField: function(tag, val) {
-        this.writeVarintField(tag, Boolean(val));
-    }
-};
-
-function readVarintRemainder(l, s, p) {
-    var buf = p.buf,
-        h, b;
-
-    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
-
-    throw new Error('Expected varint not more than 10 bytes');
-}
-
-function readPackedEnd(pbf) {
-    return pbf.type === Pbf.Bytes ?
-        pbf.readVarint() + pbf.pos : pbf.pos + 1;
-}
-
-function toNum(low, high, isSigned) {
-    if (isSigned) {
-        return high * 0x100000000 + (low >>> 0);
-    }
-
-    return ((high >>> 0) * 0x100000000) + (low >>> 0);
-}
-
-function writeBigVarint(val, pbf) {
-    var low, high;
-
-    if (val >= 0) {
-        low  = (val % 0x100000000) | 0;
-        high = (val / 0x100000000) | 0;
-    } else {
-        low  = ~(-val % 0x100000000);
-        high = ~(-val / 0x100000000);
-
-        if (low ^ 0xffffffff) {
-            low = (low + 1) | 0;
-        } else {
-            low = 0;
-            high = (high + 1) | 0;
-        }
-    }
-
-    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
-        throw new Error('Given varint doesn\'t fit into 10 bytes');
-    }
-
-    pbf.realloc(10);
-
-    writeBigVarintLow(low, high, pbf);
-    writeBigVarintHigh(high, pbf);
-}
-
-function writeBigVarintLow(low, high, pbf) {
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos]   = low & 0x7f;
-}
-
-function writeBigVarintHigh(high, pbf) {
-    var lsb = (high & 0x07) << 4;
-
-    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f;
-}
-
-function makeRoomForExtraLength(startPos, len, pbf) {
-    var extraLen =
-        len <= 0x3fff ? 1 :
-        len <= 0x1fffff ? 2 :
-        len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
-
-    // if 1 byte isn't enough for encoding message length, shift the data to the right
-    pbf.realloc(extraLen);
-    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
-}
-
-function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
-
-// Buffer code below from https://github.com/feross/buffer, MIT-licensed
-
-function readUInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] * 0x1000000);
-}
-
-function writeInt32(buf, val, pos) {
-    buf[pos] = val;
-    buf[pos + 1] = (val >>> 8);
-    buf[pos + 2] = (val >>> 16);
-    buf[pos + 3] = (val >>> 24);
-}
-
-function readInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] << 24);
-}
-
-function readUtf8(buf, pos, end) {
-    var str = '';
-    var i = pos;
-
-    while (i < end) {
-        var b0 = buf[i];
-        var c = null; // codepoint
-        var bytesPerSequence =
-            b0 > 0xEF ? 4 :
-            b0 > 0xDF ? 3 :
-            b0 > 0xBF ? 2 : 1;
-
-        if (i + bytesPerSequence > end) break;
-
-        var b1, b2, b3;
-
-        if (bytesPerSequence === 1) {
-            if (b0 < 0x80) {
-                c = b0;
-            }
-        } else if (bytesPerSequence === 2) {
-            b1 = buf[i + 1];
-            if ((b1 & 0xC0) === 0x80) {
-                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
-                if (c <= 0x7F) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 3) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
-                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 4) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            b3 = buf[i + 3];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
-                if (c <= 0xFFFF || c >= 0x110000) {
-                    c = null;
-                }
-            }
-        }
-
-        if (c === null) {
-            c = 0xFFFD;
-            bytesPerSequence = 1;
-
-        } else if (c > 0xFFFF) {
-            c -= 0x10000;
-            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
-            c = 0xDC00 | c & 0x3FF;
-        }
-
-        str += String.fromCharCode(c);
-        i += bytesPerSequence;
-    }
-
-    return str;
-}
-
-function readUtf8TextDecoder(buf, pos, end) {
-    return utf8TextDecoder.decode(buf.subarray(pos, end));
-}
-
-function writeUtf8(buf, str, pos) {
-    for (var i = 0, c, lead; i < str.length; i++) {
-        c = str.charCodeAt(i); // code point
-
-        if (c > 0xD7FF && c < 0xE000) {
-            if (lead) {
-                if (c < 0xDC00) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                    lead = c;
-                    continue;
-                } else {
-                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
-                    lead = null;
-                }
-            } else {
-                if (c > 0xDBFF || (i + 1 === str.length)) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                } else {
-                    lead = c;
-                }
-                continue;
-            }
-        } else if (lead) {
-            buf[pos++] = 0xEF;
-            buf[pos++] = 0xBF;
-            buf[pos++] = 0xBD;
-            lead = null;
-        }
-
-        if (c < 0x80) {
-            buf[pos++] = c;
-        } else {
-            if (c < 0x800) {
-                buf[pos++] = c >> 0x6 | 0xC0;
-            } else {
-                if (c < 0x10000) {
-                    buf[pos++] = c >> 0xC | 0xE0;
-                } else {
-                    buf[pos++] = c >> 0x12 | 0xF0;
-                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
-                }
-                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
-            }
-            buf[pos++] = c & 0x3F | 0x80;
-        }
-    }
-    return pos;
-}
-
-},{"ieee754":41}],41:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
-  var e, m
-  var eLen = (nBytes * 8) - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var nBits = -7
-  var i = isLE ? (nBytes - 1) : 0
-  var d = isLE ? -1 : 1
-  var s = buffer[offset + i]
-
-  i += d
-
-  e = s & ((1 << (-nBits)) - 1)
-  s >>= (-nBits)
-  nBits += eLen
-  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-
-  m = e & ((1 << (-nBits)) - 1)
-  e >>= (-nBits)
-  nBits += mLen
-  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-
-  if (e === 0) {
-    e = 1 - eBias
-  } else if (e === eMax) {
-    return m ? NaN : ((s ? -1 : 1) * Infinity)
-  } else {
-    m = m + Math.pow(2, mLen)
-    e = e - eBias
-  }
-  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
-  var e, m, c
-  var eLen = (nBytes * 8) - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
-  var i = isLE ? 0 : (nBytes - 1)
-  var d = isLE ? 1 : -1
-  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
-  value = Math.abs(value)
-
-  if (isNaN(value) || value === Infinity) {
-    m = isNaN(value) ? 1 : 0
-    e = eMax
-  } else {
-    e = Math.floor(Math.log(value) / Math.LN2)
-    if (value * (c = Math.pow(2, -e)) < 1) {
-      e--
-      c *= 2
-    }
-    if (e + eBias >= 1) {
-      value += rt / c
-    } else {
-      value += rt * Math.pow(2, 1 - eBias)
-    }
-    if (value * c >= 2) {
-      e++
-      c /= 2
-    }
-
-    if (e + eBias >= eMax) {
-      m = 0
-      e = eMax
-    } else if (e + eBias >= 1) {
-      m = ((value * c) - 1) * Math.pow(2, mLen)
-      e = e + eBias
-    } else {
-      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
-      e = 0
-    }
-  }
-
-  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-  e = (e << mLen) | m
-  eLen += mLen
-  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-  buffer[offset + i - d] |= s * 128
-}
-
-},{}],42:[function(require,module,exports){
-!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(t=t||self).RBush=i()}(this,function(){"use strict";function t(t,r,e,a,h){!function t(n,r,e,a,h){for(;a>e;){if(a-e>600){var o=a-e+1,s=r-e+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),m=Math.max(e,Math.floor(r-s*f/o+u)),c=Math.min(a,Math.floor(r+(o-s)*f/o+u));t(n,r,m,c,h)}var p=n[r],d=e,x=a;for(i(n,e,r),h(n[a],p)>0&&i(n,e,a);d<x;){for(i(n,d,x),d++,x--;h(n[d],p)<0;)d++;for(;h(n[x],p)>0;)x--}0===h(n[e],p)?i(n,e,x):i(n,++x,a),x<=r&&(e=x+1),r<=x&&(a=x-1)}}(t,r,e||0,a||t.length-1,h||n)}function i(t,i,n){var r=t[i];t[i]=t[n],t[n]=r}function n(t,i){return t<i?-1:t>i?1:0}var r=function(t){void 0===t&&(t=9),this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function e(t,i,n){if(!n)return i.indexOf(t);for(var r=0;r<i.length;r++)if(n(t,i[r]))return r;return-1}function a(t,i){h(t,0,t.children.length,i,t)}function h(t,i,n,r,e){e||(e=p(null)),e.minX=1/0,e.minY=1/0,e.maxX=-1/0,e.maxY=-1/0;for(var a=i;a<n;a++){var h=t.children[a];o(e,t.leaf?r(h):h)}return e}function o(t,i){return t.minX=Math.min(t.minX,i.minX),t.minY=Math.min(t.minY,i.minY),t.maxX=Math.max(t.maxX,i.maxX),t.maxY=Math.max(t.maxY,i.maxY),t}function s(t,i){return t.minX-i.minX}function l(t,i){return t.minY-i.minY}function f(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function u(t){return t.maxX-t.minX+(t.maxY-t.minY)}function m(t,i){return t.minX<=i.minX&&t.minY<=i.minY&&i.maxX<=t.maxX&&i.maxY<=t.maxY}function c(t,i){return i.minX<=t.maxX&&i.minY<=t.maxY&&i.maxX>=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(i,n,r,e,a){for(var h=[n,r];h.length;)if(!((r=h.pop())-(n=h.pop())<=e)){var o=n+Math.ceil((r-n)/e/2)*e;t(i,o,n,r,a),h.push(n,o,o,r)}}return r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(t){var i=this.data,n=[];if(!c(t,i))return n;for(var r=this.toBBox,e=[];i;){for(var a=0;a<i.children.length;a++){var h=i.children[a],o=i.leaf?r(h):h;c(t,o)&&(i.leaf?n.push(h):m(t,o)?this._all(h,n):e.push(h))}i=e.pop()}return n},r.prototype.collides=function(t){var i=this.data;if(!c(t,i))return!1;for(var n=[];i;){for(var r=0;r<i.children.length;r++){var e=i.children[r],a=i.leaf?this.toBBox(e):e;if(c(t,a)){if(i.leaf||m(t,a))return!0;n.push(e)}}i=n.pop()}return!1},r.prototype.load=function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0;i<t.length;i++)this.insert(t[i]);return this}var n=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var r=this.data;this.data=n,n=r}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},r.prototype.insert=function(t){return t&&this._insert(t,this.data.height-1),this},r.prototype.clear=function(){return this.data=p([]),this},r.prototype.remove=function(t,i){if(!t)return this;for(var n,r,a,h=this.data,o=this.toBBox(t),s=[],l=[];h||s.length;){if(h||(h=s.pop(),r=s[s.length-1],n=l.pop(),a=!0),h.leaf){var f=e(t,h.children,i);if(-1!==f)return h.children.splice(f,1),s.push(h),this._condense(s),this}a||h.leaf||!m(h,o)?r?(n++,h=r.children[n],a=!1):h=null:(s.push(h),l.push(n),n=0,r=h,h=h.children[0])}return this},r.prototype.toBBox=function(t){return t},r.prototype.compareMinX=function(t,i){return t.minX-i.minX},r.prototype.compareMinY=function(t,i){return t.minY-i.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(t){return this.data=t,this},r.prototype._all=function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},r.prototype._build=function(t,i,n,r){var e,h=n-i+1,o=this._maxEntries;if(h<=o)return a(e=p(t.slice(i,n+1)),this.toBBox),e;r||(r=Math.ceil(Math.log(h)/Math.log(o)),o=Math.ceil(h/Math.pow(o,r-1))),(e=p([])).leaf=!1,e.height=r;var s=Math.ceil(h/o),l=s*Math.ceil(Math.sqrt(o));d(t,i,n,l,this.compareMinX);for(var f=i;f<=n;f+=l){var u=Math.min(f+l-1,n);d(t,f,u,s,this.compareMinY);for(var m=f;m<=u;m+=s){var c=Math.min(m+s-1,u);e.children.push(this._build(t,m,c,r-1))}}return a(e,this.toBBox),e},r.prototype._chooseSubtree=function(t,i,n,r){for(;r.push(i),!i.leaf&&r.length-1!==n;){for(var e=1/0,a=1/0,h=void 0,o=0;o<i.children.length;o++){var s=i.children[o],l=f(s),u=(m=t,c=s,(Math.max(c.maxX,m.maxX)-Math.min(c.minX,m.minX))*(Math.max(c.maxY,m.maxY)-Math.min(c.minY,m.minY))-l);u<a?(a=u,e=l<e?l:e,h=s):u===a&&l<e&&(e=l,h=s)}i=h||i.children[0]}var m,c;return i},r.prototype._insert=function(t,i,n){var r=n?t:this.toBBox(t),e=[],a=this._chooseSubtree(r,this.data,i,e);for(a.children.push(t),o(a,r);i>=0&&e[i].children.length>this._maxEntries;)this._split(e,i),i--;this._adjustParentBBoxes(r,e,i)},r.prototype._split=function(t,i){var n=t[i],r=n.children.length,e=this._minEntries;this._chooseSplitAxis(n,e,r);var h=this._chooseSplitIndex(n,e,r),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},r.prototype._splitRoot=function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(t,i,n){for(var r,e,a,o,s,l,u,m=1/0,c=1/0,p=i;p<=n-i;p++){var d=h(t,0,p,this.toBBox),x=h(t,p,n,this.toBBox),v=(e=d,a=x,o=void 0,s=void 0,l=void 0,u=void 0,o=Math.max(e.minX,a.minX),s=Math.max(e.minY,a.minY),l=Math.min(e.maxX,a.maxX),u=Math.min(e.maxY,a.maxY),Math.max(0,l-o)*Math.max(0,u-s)),M=f(d)+f(x);v<m?(m=v,r=p,c=M<c?M:c):v===m&&M<c&&(c=M,r=p)}return r||n-i},r.prototype._chooseSplitAxis=function(t,i,n){var r=t.leaf?this.compareMinX:s,e=t.leaf?this.compareMinY:l;this._allDistMargin(t,i,n,r)<this._allDistMargin(t,i,n,e)&&t.children.sort(r)},r.prototype._allDistMargin=function(t,i,n,r){t.children.sort(r);for(var e=this.toBBox,a=h(t,0,i,e),s=h(t,n-i,n,e),l=u(a)+u(s),f=i;f<n-i;f++){var m=t.children[f];o(a,t.leaf?e(m):m),l+=u(a)}for(var c=n-i-1;c>=i;c--){var p=t.children[c];o(s,t.leaf?e(p):p),l+=u(s)}return l},r.prototype._adjustParentBBoxes=function(t,i,n){for(var r=n;r>=0;r--)o(i[r],t)},r.prototype._condense=function(t){for(var i=t.length-1,n=void 0;i>=0;i--)0===t[i].children.length?i>0?(n=t[i-1].children).splice(n.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},r});
-
-},{}],43:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./internal/Observable");
-exports.Observable = Observable_1.Observable;
-var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
-exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
-var groupBy_1 = require("./internal/operators/groupBy");
-exports.GroupedObservable = groupBy_1.GroupedObservable;
-var observable_1 = require("./internal/symbol/observable");
-exports.observable = observable_1.observable;
-var Subject_1 = require("./internal/Subject");
-exports.Subject = Subject_1.Subject;
-var BehaviorSubject_1 = require("./internal/BehaviorSubject");
-exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
-var ReplaySubject_1 = require("./internal/ReplaySubject");
-exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
-var AsyncSubject_1 = require("./internal/AsyncSubject");
-exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
-var asap_1 = require("./internal/scheduler/asap");
-exports.asapScheduler = asap_1.asap;
-var async_1 = require("./internal/scheduler/async");
-exports.asyncScheduler = async_1.async;
-var queue_1 = require("./internal/scheduler/queue");
-exports.queueScheduler = queue_1.queue;
-var animationFrame_1 = require("./internal/scheduler/animationFrame");
-exports.animationFrameScheduler = animationFrame_1.animationFrame;
-var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
-exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
-exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
-var Scheduler_1 = require("./internal/Scheduler");
-exports.Scheduler = Scheduler_1.Scheduler;
-var Subscription_1 = require("./internal/Subscription");
-exports.Subscription = Subscription_1.Subscription;
-var Subscriber_1 = require("./internal/Subscriber");
-exports.Subscriber = Subscriber_1.Subscriber;
-var Notification_1 = require("./internal/Notification");
-exports.Notification = Notification_1.Notification;
-exports.NotificationKind = Notification_1.NotificationKind;
-var pipe_1 = require("./internal/util/pipe");
-exports.pipe = pipe_1.pipe;
-var noop_1 = require("./internal/util/noop");
-exports.noop = noop_1.noop;
-var identity_1 = require("./internal/util/identity");
-exports.identity = identity_1.identity;
-var isObservable_1 = require("./internal/util/isObservable");
-exports.isObservable = isObservable_1.isObservable;
-var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-var EmptyError_1 = require("./internal/util/EmptyError");
-exports.EmptyError = EmptyError_1.EmptyError;
-var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
-var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
-exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
-var TimeoutError_1 = require("./internal/util/TimeoutError");
-exports.TimeoutError = TimeoutError_1.TimeoutError;
-var bindCallback_1 = require("./internal/observable/bindCallback");
-exports.bindCallback = bindCallback_1.bindCallback;
-var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
-exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
-var combineLatest_1 = require("./internal/observable/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("./internal/observable/concat");
-exports.concat = concat_1.concat;
-var defer_1 = require("./internal/observable/defer");
-exports.defer = defer_1.defer;
-var empty_1 = require("./internal/observable/empty");
-exports.empty = empty_1.empty;
-var forkJoin_1 = require("./internal/observable/forkJoin");
-exports.forkJoin = forkJoin_1.forkJoin;
-var from_1 = require("./internal/observable/from");
-exports.from = from_1.from;
-var fromEvent_1 = require("./internal/observable/fromEvent");
-exports.fromEvent = fromEvent_1.fromEvent;
-var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
-exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
-var generate_1 = require("./internal/observable/generate");
-exports.generate = generate_1.generate;
-var iif_1 = require("./internal/observable/iif");
-exports.iif = iif_1.iif;
-var interval_1 = require("./internal/observable/interval");
-exports.interval = interval_1.interval;
-var merge_1 = require("./internal/observable/merge");
-exports.merge = merge_1.merge;
-var never_1 = require("./internal/observable/never");
-exports.never = never_1.never;
-var of_1 = require("./internal/observable/of");
-exports.of = of_1.of;
-var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairs_1 = require("./internal/observable/pairs");
-exports.pairs = pairs_1.pairs;
-var partition_1 = require("./internal/observable/partition");
-exports.partition = partition_1.partition;
-var race_1 = require("./internal/observable/race");
-exports.race = race_1.race;
-var range_1 = require("./internal/observable/range");
-exports.range = range_1.range;
-var throwError_1 = require("./internal/observable/throwError");
-exports.throwError = throwError_1.throwError;
-var timer_1 = require("./internal/observable/timer");
-exports.timer = timer_1.timer;
-var using_1 = require("./internal/observable/using");
-exports.using = using_1.using;
-var zip_1 = require("./internal/observable/zip");
-exports.zip = zip_1.zip;
-var scheduled_1 = require("./internal/scheduled/scheduled");
-exports.scheduled = scheduled_1.scheduled;
-var empty_2 = require("./internal/observable/empty");
-exports.EMPTY = empty_2.EMPTY;
-var never_2 = require("./internal/observable/never");
-exports.NEVER = never_2.NEVER;
-var config_1 = require("./internal/config");
-exports.config = config_1.config;
-
-},{"./internal/AsyncSubject":44,"./internal/BehaviorSubject":45,"./internal/Notification":47,"./internal/Observable":48,"./internal/ReplaySubject":51,"./internal/Scheduler":52,"./internal/Subject":53,"./internal/Subscriber":55,"./internal/Subscription":56,"./internal/config":57,"./internal/observable/ConnectableObservable":58,"./internal/observable/bindCallback":60,"./internal/observable/bindNodeCallback":61,"./internal/observable/combineLatest":62,"./internal/observable/concat":63,"./internal/observable/defer":64,"./internal/observable/empty":65,"./internal/observable/forkJoin":66,"./internal/observable/from":67,"./internal/observable/fromEvent":69,"./internal/observable/fromEventPattern":70,"./internal/observable/generate":71,"./internal/observable/iif":72,"./internal/observable/interval":73,"./internal/observable/merge":74,"./internal/observable/never":75,"./internal/observable/of":76,"./internal/observable/onErrorResumeNext":77,"./internal/observable/pairs":78,"./internal/observable/partition":79,"./internal/observable/race":80,"./internal/observable/range":81,"./internal/observable/throwError":82,"./internal/observable/timer":83,"./internal/observable/using":84,"./internal/observable/zip":85,"./internal/operators/groupBy":121,"./internal/scheduled/scheduled":193,"./internal/scheduler/VirtualTimeScheduler":203,"./internal/scheduler/animationFrame":204,"./internal/scheduler/asap":205,"./internal/scheduler/async":206,"./internal/scheduler/queue":207,"./internal/symbol/observable":209,"./internal/util/ArgumentOutOfRangeError":211,"./internal/util/EmptyError":212,"./internal/util/ObjectUnsubscribedError":214,"./internal/util/TimeoutError":215,"./internal/util/UnsubscriptionError":216,"./internal/util/identity":219,"./internal/util/isObservable":228,"./internal/util/noop":231,"./internal/util/pipe":233}],44:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var Subscription_1 = require("./Subscription");
-var AsyncSubject = (function (_super) {
-    __extends(AsyncSubject, _super);
-    function AsyncSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.value = null;
-        _this.hasNext = false;
-        _this.hasCompleted = false;
-        return _this;
-    }
-    AsyncSubject.prototype._subscribe = function (subscriber) {
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.hasCompleted && this.hasNext) {
-            subscriber.next(this.value);
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        return _super.prototype._subscribe.call(this, subscriber);
-    };
-    AsyncSubject.prototype.next = function (value) {
-        if (!this.hasCompleted) {
-            this.value = value;
-            this.hasNext = true;
-        }
-    };
-    AsyncSubject.prototype.error = function (error) {
-        if (!this.hasCompleted) {
-            _super.prototype.error.call(this, error);
-        }
-    };
-    AsyncSubject.prototype.complete = function () {
-        this.hasCompleted = true;
-        if (this.hasNext) {
-            _super.prototype.next.call(this, this.value);
-        }
-        _super.prototype.complete.call(this);
-    };
-    return AsyncSubject;
-}(Subject_1.Subject));
-exports.AsyncSubject = AsyncSubject;
-
-},{"./Subject":53,"./Subscription":56}],45:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        var _this = _super.call(this) || this;
-        _this._value = _value;
-        return _this;
-    }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject_1.Subject));
-exports.BehaviorSubject = BehaviorSubject;
-
-},{"./Subject":53,"./util/ObjectUnsubscribedError":214}],46:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.outerValue = outerValue;
-        _this.outerIndex = outerIndex;
-        _this.index = 0;
-        return _this;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber_1.Subscriber));
-exports.InnerSubscriber = InnerSubscriber;
-
-},{"./Subscriber":55}],47:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var empty_1 = require("./observable/empty");
-var of_1 = require("./observable/of");
-var throwError_1 = require("./observable/throwError");
-var NotificationKind;
-(function (NotificationKind) {
-    NotificationKind["NEXT"] = "N";
-    NotificationKind["ERROR"] = "E";
-    NotificationKind["COMPLETE"] = "C";
-})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
-var Notification = (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return of_1.of(this.value);
-            case 'E':
-                return throwError_1.throwError(this.error);
-            case 'C':
-                return empty_1.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    };
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    Notification.createComplete = function () {
-        return Notification.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
-
-},{"./observable/empty":65,"./observable/of":76,"./observable/throwError":82}],48:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var canReportError_1 = require("./util/canReportError");
-var toSubscriber_1 = require("./util/toSubscriber");
-var observable_1 = require("./symbol/observable");
-var pipe_1 = require("./util/pipe");
-var config_1 = require("./config");
-var Observable = (function () {
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            sink.add(operator.call(sink, this.source));
-        }
-        else {
-            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                this._subscribe(sink) :
-                this._trySubscribe(sink));
-        }
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            if (sink.syncErrorThrowable) {
-                sink.syncErrorThrowable = false;
-                if (sink.syncErrorThrown) {
-                    throw sink.syncErrorValue;
-                }
-            }
-        }
-        return sink;
-    };
-    Observable.prototype._trySubscribe = function (sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                sink.syncErrorThrown = true;
-                sink.syncErrorValue = err;
-            }
-            if (canReportError_1.canReportError(sink)) {
-                sink.error(err);
-            }
-            else {
-                console.warn(err);
-            }
-        }
-    };
-    Observable.prototype.forEach = function (next, promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var subscription;
-            subscription = _this.subscribe(function (value) {
-                try {
-                    next(value);
-                }
-                catch (err) {
-                    reject(err);
-                    if (subscription) {
-                        subscription.unsubscribe();
-                    }
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        return source && source.subscribe(subscriber);
-    };
-    Observable.prototype[observable_1.observable] = function () {
-        return this;
-    };
-    Observable.prototype.pipe = function () {
-        var operations = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            operations[_i] = arguments[_i];
-        }
-        if (operations.length === 0) {
-            return this;
-        }
-        return pipe_1.pipeFromArray(operations)(this);
-    };
-    Observable.prototype.toPromise = function (promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var value;
-            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
-        });
-    };
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
-function getPromiseCtor(promiseCtor) {
-    if (!promiseCtor) {
-        promiseCtor = config_1.config.Promise || Promise;
-    }
-    if (!promiseCtor) {
-        throw new Error('no Promise impl found');
-    }
-    return promiseCtor;
-}
-
-},{"./config":57,"./symbol/observable":209,"./util/canReportError":217,"./util/pipe":233,"./util/toSubscriber":240}],49:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) {
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw err;
-        }
-        else {
-            hostReportError_1.hostReportError(err);
-        }
-    },
-    complete: function () { }
-};
-
-},{"./config":57,"./util/hostReportError":218}],50:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber_1.Subscriber));
-exports.OuterSubscriber = OuterSubscriber;
-
-},{"./Subscriber":55}],51:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var queue_1 = require("./scheduler/queue");
-var Subscription_1 = require("./Subscription");
-var observeOn_1 = require("./operators/observeOn");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var ReplaySubject = (function (_super) {
-    __extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this) || this;
-        _this.scheduler = scheduler;
-        _this._events = [];
-        _this._infiniteTimeWindow = false;
-        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        _this._windowTime = windowTime < 1 ? 1 : windowTime;
-        if (windowTime === Number.POSITIVE_INFINITY) {
-            _this._infiniteTimeWindow = true;
-            _this.next = _this.nextInfiniteTimeWindow;
-        }
-        else {
-            _this.next = _this.nextTimeWindow;
-        }
-        return _this;
-    }
-    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
-        var _events = this._events;
-        _events.push(value);
-        if (_events.length > this._bufferSize) {
-            _events.shift();
-        }
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype.nextTimeWindow = function (value) {
-        this._events.push(new ReplayEvent(this._getNow(), value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _infiniteTimeWindow = this._infiniteTimeWindow;
-        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var len = _events.length;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.isStopped || this.hasError) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
-        }
-        if (_infiniteTimeWindow) {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i]);
-            }
-        }
-        else {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i].value);
-            }
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue_1.queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject_1.Subject));
-exports.ReplaySubject = ReplaySubject;
-var ReplayEvent = (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-    return ReplayEvent;
-}());
-
-},{"./Subject":53,"./SubjectSubscription":54,"./Subscription":56,"./operators/observeOn":136,"./scheduler/queue":207,"./util/ObjectUnsubscribedError":214}],52:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = function () { return Date.now(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
-
-},{}],53:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./Observable");
-var Subscriber_1 = require("./Subscriber");
-var Subscription_1 = require("./Subscription");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        return _this;
-    }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        var _this = _super.call(this) || this;
-        _this.observers = [];
-        _this.closed = false;
-        _this.isStopped = false;
-        _this.hasError = false;
-        _this.thrownError = null;
-        return _this;
-    }
-    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._trySubscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return _super.prototype._trySubscribe.call(this, subscriber);
-        }
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable_1.Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable_1.Observable));
-exports.Subject = Subject;
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        var _this = _super.call(this) || this;
-        _this.destination = destination;
-        _this.source = source;
-        return _this;
-    }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription_1.Subscription.EMPTY;
-        }
-    };
-    return AnonymousSubject;
-}(Subject));
-exports.AnonymousSubject = AnonymousSubject;
-
-},{"../internal/symbol/rxSubscriber":210,"./Observable":48,"./SubjectSubscription":54,"./Subscriber":55,"./Subscription":56,"./util/ObjectUnsubscribedError":214}],54:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("./Subscription");
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        var _this = _super.call(this) || this;
-        _this.subject = subject;
-        _this.subscriber = subscriber;
-        _this.closed = false;
-        return _this;
-    }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription_1.Subscription));
-exports.SubjectSubscription = SubjectSubscription;
-
-},{"./Subscription":56}],55:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isFunction_1 = require("./util/isFunction");
-var Observer_1 = require("./Observer");
-var Subscription_1 = require("./Subscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    function Subscriber(destinationOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this.syncErrorValue = null;
-        _this.syncErrorThrown = false;
-        _this.syncErrorThrowable = false;
-        _this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                _this.destination = Observer_1.empty;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    _this.destination = Observer_1.empty;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                        _this.destination = destinationOrNext;
-                        destinationOrNext.add(_this);
-                    }
-                    else {
-                        _this.syncErrorThrowable = true;
-                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                _this.syncErrorThrowable = true;
-                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
-                break;
-        }
-        return _this;
-    }
-    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    Subscriber.prototype._unsubscribeAndRecycle = function () {
-        var _parentOrParents = this._parentOrParents;
-        this._parentOrParents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parentOrParents = _parentOrParents;
-        return this;
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this._parentSubscriber = _parentSubscriber;
-        var next;
-        var context = _this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== Observer_1.empty) {
-                context = Object.create(observerOrNext);
-                if (isFunction_1.isFunction(context.unsubscribe)) {
-                    _this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = _this.unsubscribe.bind(_this);
-            }
-        }
-        _this._context = context;
-        _this._next = next;
-        _this._error = error;
-        _this._complete = complete;
-        return _this;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
-            if (this._error) {
-                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                if (useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                hostReportError_1.hostReportError(err);
-            }
-            else {
-                if (useDeprecatedSynchronousErrorHandling) {
-                    _parentSubscriber.syncErrorValue = err;
-                    _parentSubscriber.syncErrorThrown = true;
-                }
-                else {
-                    hostReportError_1.hostReportError(err);
-                }
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        var _this = this;
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._complete) {
-                var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw new Error('bad call');
-        }
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                parent.syncErrorValue = err;
-                parent.syncErrorThrown = true;
-                return true;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-                return true;
-            }
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parentSubscriber = this._parentSubscriber;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-exports.SafeSubscriber = SafeSubscriber;
-
-},{"../internal/symbol/rxSubscriber":210,"./Observer":49,"./Subscription":56,"./config":57,"./util/hostReportError":218,"./util/isFunction":223}],56:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./util/isArray");
-var isObject_1 = require("./util/isObject");
-var isFunction_1 = require("./util/isFunction");
-var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
-var Subscription = (function () {
-    function Subscription(unsubscribe) {
-        this.closed = false;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    Subscription.prototype.unsubscribe = function () {
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this.closed = true;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (_parentOrParents instanceof Subscription) {
-            _parentOrParents.remove(this);
-        }
-        else if (_parentOrParents !== null) {
-            for (var index = 0; index < _parentOrParents.length; ++index) {
-                var parent_1 = _parentOrParents[index];
-                parent_1.remove(this);
-            }
-        }
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            try {
-                _unsubscribe.call(this);
-            }
-            catch (e) {
-                errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-            }
-        }
-        if (isArray_1.isArray(_subscriptions)) {
-            var index = -1;
-            var len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject_1.isObject(sub)) {
-                    try {
-                        sub.unsubscribe();
-                    }
-                    catch (e) {
-                        errors = errors || [];
-                        if (e instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-                        }
-                        else {
-                            errors.push(e);
-                        }
-                    }
-                }
-            }
-        }
-        if (errors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    Subscription.prototype.add = function (teardown) {
-        var subscription = teardown;
-        if (!teardown) {
-            return Subscription.EMPTY;
-        }
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (!(subscription instanceof Subscription)) {
-                    var tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default: {
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-            }
-        }
-        var _parentOrParents = subscription._parentOrParents;
-        if (_parentOrParents === null) {
-            subscription._parentOrParents = this;
-        }
-        else if (_parentOrParents instanceof Subscription) {
-            if (_parentOrParents === this) {
-                return subscription;
-            }
-            subscription._parentOrParents = [_parentOrParents, this];
-        }
-        else if (_parentOrParents.indexOf(this) === -1) {
-            _parentOrParents.push(this);
-        }
-        else {
-            return subscription;
-        }
-        var subscriptions = this._subscriptions;
-        if (subscriptions === null) {
-            this._subscriptions = [subscription];
-        }
-        else {
-            subscriptions.push(subscription);
-        }
-        return subscription;
-    };
-    Subscription.prototype.remove = function (subscription) {
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-exports.Subscription = Subscription;
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
-}
-
-},{"./util/UnsubscriptionError":216,"./util/isArray":220,"./util/isFunction":223,"./util/isObject":227}],57:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var _enable_super_gross_mode_that_will_cause_bad_things = false;
-exports.config = {
-    Promise: undefined,
-    set useDeprecatedSynchronousErrorHandling(value) {
-        if (value) {
-            var error = new Error();
-            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-        }
-        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-            console.log('RxJS: Back to a better error behavior. Thank you. <3');
-        }
-        _enable_super_gross_mode_that_will_cause_bad_things = value;
-    },
-    get useDeprecatedSynchronousErrorHandling() {
-        return _enable_super_gross_mode_that_will_cause_bad_things;
-    },
-};
-
-},{}],58:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Observable_1 = require("../Observable");
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var refCount_1 = require("../operators/refCount");
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subjectFactory = subjectFactory;
-        _this._refCount = 0;
-        _this._isComplete = false;
-        return _this;
-    }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription_1.Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription_1.Subscription.EMPTY;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return refCount_1.refCount()(this);
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-exports.connectableObservableDescriptor = (function () {
-    var connectableProto = ConnectableObservable.prototype;
-    return {
-        operator: { value: null },
-        _refCount: { value: 0, writable: true },
-        _subject: { value: null, writable: true },
-        _connection: { value: null, writable: true },
-        _subscribe: { value: connectableProto._subscribe },
-        _isComplete: { value: connectableProto._isComplete, writable: true },
-        getSubject: { value: connectableProto.getSubject },
-        connect: { value: connectableProto.connect },
-        refCount: { value: connectableProto.refCount }
-    };
-})();
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(Subject_1.SubjectSubscriber));
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56,"../operators/refCount":147}],59:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var asap_1 = require("../scheduler/asap");
-var isNumeric_1 = require("../util/isNumeric");
-var SubscribeOnObservable = (function (_super) {
-    __extends(SubscribeOnObservable, _super);
-    function SubscribeOnObservable(source, delayTime, scheduler) {
-        if (delayTime === void 0) { delayTime = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.delayTime = delayTime;
-        _this.scheduler = scheduler;
-        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
-            _this.delayTime = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            _this.scheduler = asap_1.asap;
-        }
-        return _this;
-    }
-    SubscribeOnObservable.create = function (source, delay, scheduler) {
-        if (delay === void 0) { delay = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        return new SubscribeOnObservable(source, delay, scheduler);
-    };
-    SubscribeOnObservable.dispatch = function (arg) {
-        var source = arg.source, subscriber = arg.subscriber;
-        return this.add(source.subscribe(subscriber));
-    };
-    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
-        var delay = this.delayTime;
-        var source = this.source;
-        var scheduler = this.scheduler;
-        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-            source: source, subscriber: subscriber
-        });
-    };
-    return SubscribeOnObservable;
-}(Observable_1.Observable));
-exports.SubscribeOnObservable = SubscribeOnObservable;
-
-},{"../Observable":48,"../scheduler/asap":205,"../util/isNumeric":226}],60:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isArray_1 = require("../util/isArray");
-var isScheduler_1 = require("../util/isScheduler");
-function bindCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var context = this;
-        var subject;
-        var params = {
-            context: context,
-            subject: subject,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            if (!scheduler) {
-                if (!subject) {
-                    subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                var state = {
-                    args: args, subscriber: subscriber, params: params,
-                };
-                return scheduler.schedule(dispatch, 0, state);
-            }
-        });
-    };
-}
-exports.bindCallback = bindCallback;
-function dispatch(state) {
-    var _this = this;
-    var self = this;
-    var args = state.args, subscriber = state.subscriber, params = state.params;
-    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            subject.error(err);
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(state) {
-    var value = state.value, subject = state.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(state) {
-    var err = state.err, subject = state.subject;
-    subject.error(err);
-}
-
-},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],61:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var params = {
-            subject: undefined,
-            args: args,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-            context: this,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            var context = params.context;
-            var subject = params.subject;
-            if (!scheduler) {
-                if (!subject) {
-                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        var err = innerArgs.shift();
-                        if (err) {
-                            subject.error(err);
-                            return;
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
-            }
-        });
-    };
-}
-exports.bindNodeCallback = bindNodeCallback;
-function dispatch(state) {
-    var _this = this;
-    var params = state.params, subscriber = state.subscriber, context = state.context;
-    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var err = innerArgs.shift();
-            if (err) {
-                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-            }
-            else {
-                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-            }
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(arg) {
-    var value = arg.value, subject = arg.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(arg) {
-    var err = arg.err, subject = arg.subject;
-    subject.error(err);
-}
-
-},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],62:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var fromArray_1 = require("./fromArray");
-var NONE = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        resultSelector = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-}
-exports.combineLatest = combineLatest;
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, resultSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.resultSelector = resultSelector;
-        _this.active = 0;
-        _this.values = [];
-        _this.observables = [];
-        return _this;
-    }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(NONE);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === NONE ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.resultSelector) {
-                this._tryResultSelector(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
-
-},{"../OuterSubscriber":50,"../util/isArray":220,"../util/isScheduler":230,"../util/subscribeToResult":239,"./fromArray":68}],63:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var of_1 = require("./of");
-var concatAll_1 = require("../operators/concatAll");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
-}
-exports.concat = concat;
-
-},{"../operators/concatAll":97,"./of":76}],64:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function defer(observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var input;
-        try {
-            input = observableFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = input ? from_1.from(input) : empty_1.empty();
-        return source.subscribe(subscriber);
-    });
-}
-exports.defer = defer;
-
-},{"../Observable":48,"./empty":65,"./from":67}],65:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
-function empty(scheduler) {
-    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
-}
-exports.empty = empty;
-function emptyScheduled(scheduler) {
-    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
-}
-
-},{"../Observable":48}],66:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var map_1 = require("../operators/map");
-var isObject_1 = require("../util/isObject");
-var from_1 = require("./from");
-function forkJoin() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 1) {
-        var first_1 = sources[0];
-        if (isArray_1.isArray(first_1)) {
-            return forkJoinInternal(first_1, null);
-        }
-        if (isObject_1.isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
-            var keys = Object.keys(first_1);
-            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
-        }
-    }
-    if (typeof sources[sources.length - 1] === 'function') {
-        var resultSelector_1 = sources.pop();
-        sources = (sources.length === 1 && isArray_1.isArray(sources[0])) ? sources[0] : sources;
-        return forkJoinInternal(sources, null).pipe(map_1.map(function (args) { return resultSelector_1.apply(void 0, args); }));
-    }
-    return forkJoinInternal(sources, null);
-}
-exports.forkJoin = forkJoin;
-function forkJoinInternal(sources, keys) {
-    return new Observable_1.Observable(function (subscriber) {
-        var len = sources.length;
-        if (len === 0) {
-            subscriber.complete();
-            return;
-        }
-        var values = new Array(len);
-        var completed = 0;
-        var emitted = 0;
-        var _loop_1 = function (i) {
-            var source = from_1.from(sources[i]);
-            var hasValue = false;
-            subscriber.add(source.subscribe({
-                next: function (value) {
-                    if (!hasValue) {
-                        hasValue = true;
-                        emitted++;
-                    }
-                    values[i] = value;
-                },
-                error: function (err) { return subscriber.error(err); },
-                complete: function () {
-                    completed++;
-                    if (completed === len || !hasValue) {
-                        if (emitted === len) {
-                            subscriber.next(keys ?
-                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
-                                values);
-                        }
-                        subscriber.complete();
-                    }
-                }
-            }));
-        };
-        for (var i = 0; i < len; i++) {
-            _loop_1(i);
-        }
-    });
-}
-
-},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isObject":227,"./from":67}],67:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeTo_1 = require("../util/subscribeTo");
-var scheduled_1 = require("../scheduled/scheduled");
-function from(input, scheduler) {
-    if (!scheduler) {
-        if (input instanceof Observable_1.Observable) {
-            return input;
-        }
-        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
-    }
-    else {
-        return scheduled_1.scheduled(input, scheduler);
-    }
-}
-exports.from = from;
-
-},{"../Observable":48,"../scheduled/scheduled":193,"../util/subscribeTo":234}],68:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeToArray_1 = require("../util/subscribeToArray");
-var scheduleArray_1 = require("../scheduled/scheduleArray");
-function fromArray(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
-    }
-    else {
-        return scheduleArray_1.scheduleArray(input, scheduler);
-    }
-}
-exports.fromArray = fromArray;
-
-},{"../Observable":48,"../scheduled/scheduleArray":189,"../util/subscribeToArray":235}],69:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-var toString = (function () { return Object.prototype.toString; })();
-function fromEvent(target, eventName, options, resultSelector) {
-    if (isFunction_1.isFunction(options)) {
-        resultSelector = options;
-        options = undefined;
-    }
-    if (resultSelector) {
-        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        function handler(e) {
-            if (arguments.length > 1) {
-                subscriber.next(Array.prototype.slice.call(arguments));
-            }
-            else {
-                subscriber.next(e);
-            }
-        }
-        setupSubscription(target, eventName, handler, subscriber, options);
-    });
-}
-exports.fromEvent = fromEvent;
-function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-    var unsubscribe;
-    if (isEventTarget(sourceObj)) {
-        var source_1 = sourceObj;
-        sourceObj.addEventListener(eventName, handler, options);
-        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
-    }
-    else if (isJQueryStyleEventEmitter(sourceObj)) {
-        var source_2 = sourceObj;
-        sourceObj.on(eventName, handler);
-        unsubscribe = function () { return source_2.off(eventName, handler); };
-    }
-    else if (isNodeStyleEventEmitter(sourceObj)) {
-        var source_3 = sourceObj;
-        sourceObj.addListener(eventName, handler);
-        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-    }
-    else if (sourceObj && sourceObj.length) {
-        for (var i = 0, len = sourceObj.length; i < len; i++) {
-            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-        }
-    }
-    else {
-        throw new TypeError('Invalid event target');
-    }
-    subscriber.add(unsubscribe);
-}
-function isNodeStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isEventTarget(sourceObj) {
-    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-
-},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],70:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-function fromEventPattern(addHandler, removeHandler, resultSelector) {
-    if (resultSelector) {
-        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var handler = function () {
-            var e = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                e[_i] = arguments[_i];
-            }
-            return subscriber.next(e.length === 1 ? e[0] : e);
-        };
-        var retValue;
-        try {
-            retValue = addHandler(handler);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!isFunction_1.isFunction(removeHandler)) {
-            return undefined;
-        }
-        return function () { return removeHandler(handler, retValue); };
-    });
-}
-exports.fromEventPattern = fromEventPattern;
-
-},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],71:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var identity_1 = require("../util/identity");
-var isScheduler_1 = require("../util/isScheduler");
-function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-    var resultSelector;
-    var initialState;
-    if (arguments.length == 1) {
-        var options = initialStateOrOptions;
-        initialState = options.initialState;
-        condition = options.condition;
-        iterate = options.iterate;
-        resultSelector = options.resultSelector || identity_1.identity;
-        scheduler = options.scheduler;
-    }
-    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
-        initialState = initialStateOrOptions;
-        resultSelector = identity_1.identity;
-        scheduler = resultSelectorOrObservable;
-    }
-    else {
-        initialState = initialStateOrOptions;
-        resultSelector = resultSelectorOrObservable;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var state = initialState;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                subscriber: subscriber,
-                iterate: iterate,
-                condition: condition,
-                resultSelector: resultSelector,
-                state: state
-            });
-        }
-        do {
-            if (condition) {
-                var conditionResult = void 0;
-                try {
-                    conditionResult = condition(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                if (!conditionResult) {
-                    subscriber.complete();
-                    break;
-                }
-            }
-            var value = void 0;
-            try {
-                value = resultSelector(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            subscriber.next(value);
-            if (subscriber.closed) {
-                break;
-            }
-            try {
-                state = iterate(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        } while (true);
-        return undefined;
-    });
-}
-exports.generate = generate;
-function dispatch(state) {
-    var subscriber = state.subscriber, condition = state.condition;
-    if (subscriber.closed) {
-        return undefined;
-    }
-    if (state.needIterate) {
-        try {
-            state.state = state.iterate(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-    }
-    else {
-        state.needIterate = true;
-    }
-    if (condition) {
-        var conditionResult = void 0;
-        try {
-            conditionResult = condition(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!conditionResult) {
-            subscriber.complete();
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-    }
-    var value;
-    try {
-        value = state.resultSelector(state.state);
-    }
-    catch (err) {
-        subscriber.error(err);
-        return undefined;
-    }
-    if (subscriber.closed) {
-        return undefined;
-    }
-    subscriber.next(value);
-    if (subscriber.closed) {
-        return undefined;
-    }
-    return this.schedule(state);
-}
-
-},{"../Observable":48,"../util/identity":219,"../util/isScheduler":230}],72:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var defer_1 = require("./defer");
-var empty_1 = require("./empty");
-function iif(condition, trueResult, falseResult) {
-    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
-    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
-    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
-}
-exports.iif = iif;
-
-},{"./defer":64,"./empty":65}],73:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-function interval(period, scheduler) {
-    if (period === void 0) { period = 0; }
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (!isNumeric_1.isNumeric(period) || period < 0) {
-        period = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
-        return subscriber;
-    });
-}
-exports.interval = interval;
-function dispatch(state) {
-    var subscriber = state.subscriber, counter = state.counter, period = state.period;
-    subscriber.next(counter);
-    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
-}
-
-},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226}],74:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isScheduler_1 = require("../util/isScheduler");
-var mergeAll_1 = require("../operators/mergeAll");
-var fromArray_1 = require("./fromArray");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler_1.isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
-    }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
-    }
-    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
-}
-exports.merge = merge;
-
-},{"../Observable":48,"../operators/mergeAll":130,"../util/isScheduler":230,"./fromArray":68}],75:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var noop_1 = require("../util/noop");
-exports.NEVER = new Observable_1.Observable(noop_1.noop);
-function never() {
-    return exports.NEVER;
-}
-exports.never = never;
-
-},{"../Observable":48,"../util/noop":231}],76:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var fromArray_1 = require("./fromArray");
-var scheduleArray_1 = require("../scheduled/scheduleArray");
-function of() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var scheduler = args[args.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        args.pop();
-        return scheduleArray_1.scheduleArray(args, scheduler);
-    }
-    else {
-        return fromArray_1.fromArray(args);
-    }
-}
-exports.of = of;
-
-},{"../scheduled/scheduleArray":189,"../util/isScheduler":230,"./fromArray":68}],77:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var isArray_1 = require("../util/isArray");
-var empty_1 = require("./empty");
-function onErrorResumeNext() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 0) {
-        return empty_1.EMPTY;
-    }
-    var first = sources[0], remainder = sources.slice(1);
-    if (sources.length === 1 && isArray_1.isArray(first)) {
-        return onErrorResumeNext.apply(void 0, first);
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
-        return from_1.from(first).subscribe({
-            next: function (value) { subscriber.next(value); },
-            error: subNext,
-            complete: subNext,
-        });
-    });
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-
-},{"../Observable":48,"../util/isArray":220,"./empty":65,"./from":67}],78:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function pairs(obj, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
-                var key = keys[i];
-                if (obj.hasOwnProperty(key)) {
-                    subscriber.next([key, obj[key]]);
-                }
-            }
-            subscriber.complete();
-        });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            var subscription = new Subscription_1.Subscription();
-            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
-            return subscription;
-        });
-    }
-}
-exports.pairs = pairs;
-function dispatch(state) {
-    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
-    if (!subscriber.closed) {
-        if (index < keys.length) {
-            var key = keys[index];
-            subscriber.next([key, obj[key]]);
-            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
-        }
-        else {
-            subscriber.complete();
-        }
-    }
-}
-exports.dispatch = dispatch;
-
-},{"../Observable":48,"../Subscription":56}],79:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var not_1 = require("../util/not");
-var subscribeTo_1 = require("../util/subscribeTo");
-var filter_1 = require("../operators/filter");
-var Observable_1 = require("../Observable");
-function partition(source, predicate, thisArg) {
-    return [
-        filter_1.filter(predicate, thisArg)(new Observable_1.Observable(subscribeTo_1.subscribeTo(source))),
-        filter_1.filter(not_1.not(predicate, thisArg))(new Observable_1.Observable(subscribeTo_1.subscribeTo(source)))
-    ];
-}
-exports.partition = partition;
-
-},{"../Observable":48,"../operators/filter":116,"../util/not":232,"../util/subscribeTo":234}],80:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var fromArray_1 = require("./fromArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    if (observables.length === 1) {
-        if (isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        else {
-            return observables[0];
-        }
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
-}
-exports.race = race;
-var RaceOperator = (function () {
-    function RaceOperator() {
-    }
-    RaceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RaceSubscriber(subscriber));
-    };
-    return RaceOperator;
-}());
-exports.RaceOperator = RaceOperator;
-var RaceSubscriber = (function (_super) {
-    __extends(RaceSubscriber, _super);
-    function RaceSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasFirst = false;
-        _this.observables = [];
-        _this.subscriptions = [];
-        return _this;
-    }
-    RaceSubscriber.prototype._next = function (observable) {
-        this.observables.push(observable);
-    };
-    RaceSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            for (var i = 0; i < len && !this.hasFirst; i++) {
-                var observable = observables[i];
-                var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
-                if (this.subscriptions) {
-                    this.subscriptions.push(subscription);
-                }
-                this.add(subscription);
-            }
-            this.observables = null;
-        }
-    };
-    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (!this.hasFirst) {
-            this.hasFirst = true;
-            for (var i = 0; i < this.subscriptions.length; i++) {
-                if (i !== outerIndex) {
-                    var subscription = this.subscriptions[i];
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-            }
-            this.subscriptions = null;
-        }
-        this.destination.next(innerValue);
-    };
-    return RaceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.RaceSubscriber = RaceSubscriber;
-
-},{"../OuterSubscriber":50,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],81:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function range(start, count, scheduler) {
-    if (start === void 0) { start = 0; }
-    return new Observable_1.Observable(function (subscriber) {
-        if (count === undefined) {
-            count = start;
-            start = 0;
-        }
-        var index = 0;
-        var current = start;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                index: index, count: count, start: start, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                if (index++ >= count) {
-                    subscriber.complete();
-                    break;
-                }
-                subscriber.next(current++);
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-        return undefined;
-    });
-}
-exports.range = range;
-function dispatch(state) {
-    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
-    if (index >= count) {
-        subscriber.complete();
-        return;
-    }
-    subscriber.next(start);
-    if (subscriber.closed) {
-        return;
-    }
-    state.index = index + 1;
-    state.start = start + 1;
-    this.schedule(state);
-}
-exports.dispatch = dispatch;
-
-},{"../Observable":48}],82:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function throwError(error, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
-    }
-}
-exports.throwError = throwError;
-function dispatch(_a) {
-    var error = _a.error, subscriber = _a.subscriber;
-    subscriber.error(error);
-}
-
-},{"../Observable":48}],83:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function timer(dueTime, periodOrScheduler, scheduler) {
-    if (dueTime === void 0) { dueTime = 0; }
-    var period = -1;
-    if (isNumeric_1.isNumeric(periodOrScheduler)) {
-        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-    }
-    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
-        scheduler = periodOrScheduler;
-    }
-    if (!isScheduler_1.isScheduler(scheduler)) {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var due = isNumeric_1.isNumeric(dueTime)
-            ? dueTime
-            : (+dueTime - scheduler.now());
-        return scheduler.schedule(dispatch, due, {
-            index: 0, period: period, subscriber: subscriber
-        });
-    });
-}
-exports.timer = timer;
-function dispatch(state) {
-    var index = state.index, period = state.period, subscriber = state.subscriber;
-    subscriber.next(index);
-    if (subscriber.closed) {
-        return;
-    }
-    else if (period === -1) {
-        return subscriber.complete();
-    }
-    state.index = index + 1;
-    this.schedule(state, period);
-}
-
-},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],84:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function using(resourceFactory, observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var resource;
-        try {
-            resource = resourceFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var result;
-        try {
-            result = observableFactory(resource);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = result ? from_1.from(result) : empty_1.EMPTY;
-        var subscription = source.subscribe(subscriber);
-        return function () {
-            subscription.unsubscribe();
-            if (resource) {
-                resource.unsubscribe();
-            }
-        };
-    });
-}
-exports.using = using;
-
-},{"../Observable":48,"./empty":65,"./from":67}],85:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var fromArray_1 = require("./fromArray");
-var isArray_1 = require("../util/isArray");
-var Subscriber_1 = require("../Subscriber");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var iterator_1 = require("../../internal/symbol/iterator");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = observables[observables.length - 1];
-    if (typeof resultSelector === 'function') {
-        observables.pop();
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-exports.zip = zip;
-var ZipOperator = (function () {
-    function ZipOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, resultSelector, values) {
-        if (values === void 0) { values = Object.create(null); }
-        var _this = _super.call(this, destination) || this;
-        _this.iterators = [];
-        _this.active = 0;
-        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-        _this.values = values;
-        return _this;
-    }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        if (isArray_1.isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[iterator_1.iterator] === 'function') {
-            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        this.unsubscribe();
-        if (len === 0) {
-            this.destination.complete();
-            return;
-        }
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                var destination = this.destination;
-                destination.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--;
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.resultSelector) {
-            this._tryresultSelector(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryresultSelector = function (args) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ZipSubscriber = ZipSubscriber;
-var StaticIterator = (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        _this.observable = observable;
-        _this.stillUnsubscribed = true;
-        _this.buffer = [];
-        _this.isComplete = false;
-        return _this;
-    }
-    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../../internal/symbol/iterator":208,"../OuterSubscriber":50,"../Subscriber":55,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],86:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function audit(durationSelector) {
-    return function auditOperatorFunction(source) {
-        return source.lift(new AuditOperator(durationSelector));
-    };
-}
-exports.audit = audit;
-var AuditOperator = (function () {
-    function AuditOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    AuditOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-    };
-    return AuditOperator;
-}());
-var AuditSubscriber = (function (_super) {
-    __extends(AuditSubscriber, _super);
-    function AuditSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        return _this;
-    }
-    AuditSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-        if (!this.throttled) {
-            var duration = void 0;
-            try {
-                var durationSelector = this.durationSelector;
-                duration = durationSelector(value);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration);
-            if (!innerSubscription || innerSubscription.closed) {
-                this.clearThrottle();
-            }
-            else {
-                this.add(this.throttled = innerSubscription);
-            }
-        }
-    };
-    AuditSubscriber.prototype.clearThrottle = function () {
-        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-        if (hasValue) {
-            this.value = null;
-            this.hasValue = false;
-            this.destination.next(value);
-        }
-    };
-    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        this.clearThrottle();
-    };
-    AuditSubscriber.prototype.notifyComplete = function () {
-        this.clearThrottle();
-    };
-    return AuditSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],87:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var audit_1 = require("./audit");
-var timer_1 = require("../observable/timer");
-function auditTime(duration, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
-}
-exports.auditTime = auditTime;
-
-},{"../observable/timer":83,"../scheduler/async":206,"./audit":86}],88:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function buffer(closingNotifier) {
-    return function bufferOperatorFunction(source) {
-        return source.lift(new BufferOperator(closingNotifier));
-    };
-}
-exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.buffer = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, closingNotifier));
-        return _this;
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],89:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return function bufferCountOperatorFunction(source) {
-        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-    };
-}
-exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.buffer = [];
-        return _this;
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-var BufferSkipCountSubscriber = (function (_super) {
-    __extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.startBufferEvery = startBufferEvery;
-        _this.buffers = [];
-        _this.count = 0;
-        return _this;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],90:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isScheduler_1 = require("../util/isScheduler");
-function bufferTime(bufferTimeSpan) {
-    var length = arguments.length;
-    var scheduler = async_1.async;
-    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
-        scheduler = arguments[arguments.length - 1];
-        length--;
-    }
-    var bufferCreationInterval = null;
-    if (length >= 2) {
-        bufferCreationInterval = arguments[1];
-    }
-    var maxBufferSize = Number.POSITIVE_INFINITY;
-    if (length >= 3) {
-        maxBufferSize = arguments[2];
-    }
-    return function bufferTimeOperatorFunction(source) {
-        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-    };
-}
-exports.bufferTime = bufferTime;
-var BufferTimeOperator = (function () {
-    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-    }
-    BufferTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-    };
-    return BufferTimeOperator;
-}());
-var Context = (function () {
-    function Context() {
-        this.buffer = [];
-    }
-    return Context;
-}());
-var BufferTimeSubscriber = (function (_super) {
-    __extends(BufferTimeSubscriber, _super);
-    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferTimeSpan = bufferTimeSpan;
-        _this.bufferCreationInterval = bufferCreationInterval;
-        _this.maxBufferSize = maxBufferSize;
-        _this.scheduler = scheduler;
-        _this.contexts = [];
-        var context = _this.openContext();
-        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-        if (_this.timespanOnly) {
-            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-        else {
-            var closeState = { subscriber: _this, context: context };
-            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-        }
-        return _this;
-    }
-    BufferTimeSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        var filledBufferContext;
-        for (var i = 0; i < len; i++) {
-            var context_1 = contexts[i];
-            var buffer = context_1.buffer;
-            buffer.push(value);
-            if (buffer.length == this.maxBufferSize) {
-                filledBufferContext = context_1;
-            }
-        }
-        if (filledBufferContext) {
-            this.onBufferFull(filledBufferContext);
-        }
-    };
-    BufferTimeSubscriber.prototype._error = function (err) {
-        this.contexts.length = 0;
-        _super.prototype._error.call(this, err);
-    };
-    BufferTimeSubscriber.prototype._complete = function () {
-        var _a = this, contexts = _a.contexts, destination = _a.destination;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            destination.next(context_2.buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferTimeSubscriber.prototype._unsubscribe = function () {
-        this.contexts = null;
-    };
-    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
-        this.closeContext(context);
-        var closeAction = context.closeAction;
-        closeAction.unsubscribe();
-        this.remove(closeAction);
-        if (!this.closed && this.timespanOnly) {
-            context = this.openContext();
-            var bufferTimeSpan = this.bufferTimeSpan;
-            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
-            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-    };
-    BufferTimeSubscriber.prototype.openContext = function () {
-        var context = new Context();
-        this.contexts.push(context);
-        return context;
-    };
-    BufferTimeSubscriber.prototype.closeContext = function (context) {
-        this.destination.next(context.buffer);
-        var contexts = this.contexts;
-        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
-        if (spliceIndex >= 0) {
-            contexts.splice(contexts.indexOf(context), 1);
-        }
-    };
-    return BufferTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchBufferTimeSpanOnly(state) {
-    var subscriber = state.subscriber;
-    var prevContext = state.context;
-    if (prevContext) {
-        subscriber.closeContext(prevContext);
-    }
-    if (!subscriber.closed) {
-        state.context = subscriber.openContext();
-        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-    }
-}
-function dispatchBufferCreation(state) {
-    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
-    var context = subscriber.openContext();
-    var action = this;
-    if (!subscriber.closed) {
-        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
-        action.schedule(state, bufferCreationInterval);
-    }
-}
-function dispatchBufferClose(arg) {
-    var subscriber = arg.subscriber, context = arg.context;
-    subscriber.closeContext(context);
-}
-
-},{"../Subscriber":55,"../scheduler/async":206,"../util/isScheduler":230}],91:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-function bufferToggle(openings, closingSelector) {
-    return function bufferToggleOperatorFunction(source) {
-        return source.lift(new BufferToggleOperator(openings, closingSelector));
-    };
-}
-exports.bufferToggle = bufferToggle;
-var BufferToggleOperator = (function () {
-    function BufferToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    BufferToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return BufferToggleOperator;
-}());
-var BufferToggleSubscriber = (function (_super) {
-    __extends(BufferToggleSubscriber, _super);
-    function BufferToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
-        return _this;
-    }
-    BufferToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        for (var i = 0; i < len; i++) {
-            contexts[i].buffer.push(value);
-        }
-    };
-    BufferToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_1 = contexts.shift();
-            context_1.subscription.unsubscribe();
-            context_1.buffer = null;
-            context_1.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._error.call(this, err);
-    };
-    BufferToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            this.destination.next(context_2.buffer);
-            context_2.subscription.unsubscribe();
-            context_2.buffer = null;
-            context_2.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._complete.call(this);
-    };
-    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-    };
-    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.closeBuffer(innerSub.context);
-    };
-    BufferToggleSubscriber.prototype.openBuffer = function (value) {
-        try {
-            var closingSelector = this.closingSelector;
-            var closingNotifier = closingSelector.call(this, value);
-            if (closingNotifier) {
-                this.trySubscribe(closingNotifier);
-            }
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
-        var contexts = this.contexts;
-        if (contexts && context) {
-            var buffer = context.buffer, subscription = context.subscription;
-            this.destination.next(buffer);
-            contexts.splice(contexts.indexOf(context), 1);
-            this.remove(subscription);
-            subscription.unsubscribe();
-        }
-    };
-    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
-        var contexts = this.contexts;
-        var buffer = [];
-        var subscription = new Subscription_1.Subscription();
-        var context = { buffer: buffer, subscription: subscription };
-        contexts.push(context);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
-        if (!innerSubscription || innerSubscription.closed) {
-            this.closeBuffer(context);
-        }
-        else {
-            innerSubscription.context = context;
-            this.add(innerSubscription);
-            subscription.add(innerSubscription);
-        }
-    };
-    return BufferToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],92:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function bufferWhen(closingSelector) {
-    return function (source) {
-        return source.lift(new BufferWhenOperator(closingSelector));
-    };
-}
-exports.bufferWhen = bufferWhen;
-var BufferWhenOperator = (function () {
-    function BufferWhenOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    BufferWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    };
-    return BufferWhenOperator;
-}());
-var BufferWhenSubscriber = (function (_super) {
-    __extends(BufferWhenSubscriber, _super);
-    function BufferWhenSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.closingSelector = closingSelector;
-        _this.subscribing = false;
-        _this.openBuffer();
-        return _this;
-    }
-    BufferWhenSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferWhenSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferWhenSubscriber.prototype._unsubscribe = function () {
-        this.buffer = null;
-        this.subscribing = false;
-    };
-    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    };
-    BufferWhenSubscriber.prototype.notifyComplete = function () {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    };
-    BufferWhenSubscriber.prototype.openBuffer = function () {
-        var closingSubscription = this.closingSubscription;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        var buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
-        }
-        this.buffer = [];
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (err) {
-            return this.error(err);
-        }
-        closingSubscription = new Subscription_1.Subscription();
-        this.closingSubscription = closingSubscription;
-        this.add(closingSubscription);
-        this.subscribing = true;
-        closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-        this.subscribing = false;
-    };
-    return BufferWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],93:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function catchError(selector) {
-    return function catchErrorOperatorFunction(source) {
-        var operator = new CatchOperator(selector);
-        var caught = source.lift(operator);
-        return (operator.caught = caught);
-    };
-}
-exports.catchError = catchError;
-var CatchOperator = (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
-    }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        var _this = _super.call(this, destination) || this;
-        _this.selector = selector;
-        _this.caught = caught;
-        return _this;
-    }
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                _super.prototype.error.call(this, err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            this.add(innerSubscriber);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                this.add(innerSubscription);
-            }
-        }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],94:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var combineLatest_1 = require("../observable/combineLatest");
-function combineAll(project) {
-    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineAll = combineAll;
-
-},{"../observable/combineLatest":62}],95:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var combineLatest_1 = require("../observable/combineLatest");
-var from_1 = require("../observable/from");
-var none = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0].slice();
-    }
-    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineLatest = combineLatest;
-
-},{"../observable/combineLatest":62,"../observable/from":67,"../util/isArray":220}],96:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
-}
-exports.concat = concat;
-
-},{"../observable/concat":63}],97:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeAll_1 = require("./mergeAll");
-function concatAll() {
-    return mergeAll_1.mergeAll(1);
-}
-exports.concatAll = concatAll;
-
-},{"./mergeAll":130}],98:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function concatMap(project, resultSelector) {
-    return mergeMap_1.mergeMap(project, resultSelector, 1);
-}
-exports.concatMap = concatMap;
-
-},{"./mergeMap":131}],99:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concatMap_1 = require("./concatMap");
-function concatMapTo(innerObservable, resultSelector) {
-    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
-}
-exports.concatMapTo = concatMapTo;
-
-},{"./concatMap":98}],100:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function count(predicate) {
-    return function (source) { return source.lift(new CountOperator(predicate, source)); };
-}
-exports.count = count;
-var CountOperator = (function () {
-    function CountOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    CountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-    };
-    return CountOperator;
-}());
-var CountSubscriber = (function (_super) {
-    __extends(CountSubscriber, _super);
-    function CountSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.count = 0;
-        _this.index = 0;
-        return _this;
-    }
-    CountSubscriber.prototype._next = function (value) {
-        if (this.predicate) {
-            this._tryPredicate(value);
-        }
-        else {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._tryPredicate = function (value) {
-        var result;
-        try {
-            result = this.predicate(value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._complete = function () {
-        this.destination.next(this.count);
-        this.destination.complete();
-    };
-    return CountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],101:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function debounce(durationSelector) {
-    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
-}
-exports.debounce = debounce;
-var DebounceOperator = (function () {
-    function DebounceOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    DebounceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-    };
-    return DebounceOperator;
-}());
-var DebounceSubscriber = (function (_super) {
-    __extends(DebounceSubscriber, _super);
-    function DebounceSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        _this.durationSubscription = null;
-        return _this;
-    }
-    DebounceSubscriber.prototype._next = function (value) {
-        try {
-            var result = this.durationSelector.call(this, value);
-            if (result) {
-                this._tryNext(value, result);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DebounceSubscriber.prototype._complete = function () {
-        this.emitValue();
-        this.destination.complete();
-    };
-    DebounceSubscriber.prototype._tryNext = function (value, duration) {
-        var subscription = this.durationSubscription;
-        this.value = value;
-        this.hasValue = true;
-        if (subscription) {
-            subscription.unsubscribe();
-            this.remove(subscription);
-        }
-        subscription = subscribeToResult_1.subscribeToResult(this, duration);
-        if (subscription && !subscription.closed) {
-            this.add(this.durationSubscription = subscription);
-        }
-    };
-    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            var value = this.value;
-            var subscription = this.durationSubscription;
-            if (subscription) {
-                this.durationSubscription = null;
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            this.value = null;
-            this.hasValue = false;
-            _super.prototype._next.call(this, value);
-        }
-    };
-    return DebounceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],102:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
-}
-exports.debounceTime = debounceTime;
-var DebounceTimeOperator = (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.dueTime = dueTime;
-        _this.scheduler = scheduler;
-        _this.debouncedSubscription = null;
-        _this.lastValue = null;
-        _this.hasValue = false;
-        return _this;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            var lastValue = this.lastValue;
-            this.lastValue = null;
-            this.hasValue = false;
-            this.destination.next(lastValue);
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
-}
-
-},{"../Subscriber":55,"../scheduler/async":206}],103:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function defaultIfEmpty(defaultValue) {
-    if (defaultValue === void 0) { defaultValue = null; }
-    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
-}
-exports.defaultIfEmpty = defaultIfEmpty;
-var DefaultIfEmptyOperator = (function () {
-    function DefaultIfEmptyOperator(defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-    };
-    return DefaultIfEmptyOperator;
-}());
-var DefaultIfEmptySubscriber = (function (_super) {
-    __extends(DefaultIfEmptySubscriber, _super);
-    function DefaultIfEmptySubscriber(destination, defaultValue) {
-        var _this = _super.call(this, destination) || this;
-        _this.defaultValue = defaultValue;
-        _this.isEmpty = true;
-        return _this;
-    }
-    DefaultIfEmptySubscriber.prototype._next = function (value) {
-        this.isEmpty = false;
-        this.destination.next(value);
-    };
-    DefaultIfEmptySubscriber.prototype._complete = function () {
-        if (this.isEmpty) {
-            this.destination.next(this.defaultValue);
-        }
-        this.destination.complete();
-    };
-    return DefaultIfEmptySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],104:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function delay(delay, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    var absoluteDelay = isDate_1.isDate(delay);
-    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
-}
-exports.delay = delay;
-var DelayOperator = (function () {
-    function DelayOperator(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    DelayOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    };
-    return DelayOperator;
-}());
-var DelaySubscriber = (function (_super) {
-    __extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.delay = delay;
-        _this.scheduler = scheduler;
-        _this.queue = [];
-        _this.active = false;
-        _this.errored = false;
-        return _this;
-    }
-    DelaySubscriber.dispatch = function (state) {
-        var source = state.source;
-        var queue = source.queue;
-        var scheduler = state.scheduler;
-        var destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay_1);
-        }
-        else {
-            this.unsubscribe();
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        var destination = this.destination;
-        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    };
-    DelaySubscriber.prototype.scheduleNotification = function (notification) {
-        if (this.errored === true) {
-            return;
-        }
-        var scheduler = this.scheduler;
-        var message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    };
-    DelaySubscriber.prototype._next = function (value) {
-        this.scheduleNotification(Notification_1.Notification.createNext(value));
-    };
-    DelaySubscriber.prototype._error = function (err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return DelaySubscriber;
-}(Subscriber_1.Subscriber));
-var DelayMessage = (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
-
-},{"../Notification":47,"../Subscriber":55,"../scheduler/async":206,"../util/isDate":222}],105:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Observable_1 = require("../Observable");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function delayWhen(delayDurationSelector, subscriptionDelay) {
-    if (subscriptionDelay) {
-        return function (source) {
-            return new SubscriptionDelayObservable(source, subscriptionDelay)
-                .lift(new DelayWhenOperator(delayDurationSelector));
-        };
-    }
-    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
-}
-exports.delayWhen = delayWhen;
-var DelayWhenOperator = (function () {
-    function DelayWhenOperator(delayDurationSelector) {
-        this.delayDurationSelector = delayDurationSelector;
-    }
-    DelayWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-    };
-    return DelayWhenOperator;
-}());
-var DelayWhenSubscriber = (function (_super) {
-    __extends(DelayWhenSubscriber, _super);
-    function DelayWhenSubscriber(destination, delayDurationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.delayDurationSelector = delayDurationSelector;
-        _this.completed = false;
-        _this.delayNotifierSubscriptions = [];
-        _this.index = 0;
-        return _this;
-    }
-    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(outerValue);
-        this.removeSubscription(innerSub);
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        var value = this.removeSubscription(innerSub);
-        if (value) {
-            this.destination.next(value);
-        }
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        try {
-            var delayNotifier = this.delayDurationSelector(value, index);
-            if (delayNotifier) {
-                this.tryDelay(delayNotifier, value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DelayWhenSubscriber.prototype._complete = function () {
-        this.completed = true;
-        this.tryComplete();
-        this.unsubscribe();
-    };
-    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
-        subscription.unsubscribe();
-        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-        if (subscriptionIdx !== -1) {
-            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-        }
-        return subscription.outerValue;
-    };
-    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
-        if (notifierSubscription && !notifierSubscription.closed) {
-            var destination = this.destination;
-            destination.add(notifierSubscription);
-            this.delayNotifierSubscriptions.push(notifierSubscription);
-        }
-    };
-    DelayWhenSubscriber.prototype.tryComplete = function () {
-        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-            this.destination.complete();
-        }
-    };
-    return DelayWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-var SubscriptionDelayObservable = (function (_super) {
-    __extends(SubscriptionDelayObservable, _super);
-    function SubscriptionDelayObservable(source, subscriptionDelay) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subscriptionDelay = subscriptionDelay;
-        return _this;
-    }
-    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
-        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-    };
-    return SubscriptionDelayObservable;
-}(Observable_1.Observable));
-var SubscriptionDelaySubscriber = (function (_super) {
-    __extends(SubscriptionDelaySubscriber, _super);
-    function SubscriptionDelaySubscriber(parent, source) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.source = source;
-        _this.sourceSubscribed = false;
-        return _this;
-    }
-    SubscriptionDelaySubscriber.prototype._next = function (unused) {
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype._error = function (err) {
-        this.unsubscribe();
-        this.parent.error(err);
-    };
-    SubscriptionDelaySubscriber.prototype._complete = function () {
-        this.unsubscribe();
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
-        if (!this.sourceSubscribed) {
-            this.sourceSubscribed = true;
-            this.unsubscribe();
-            this.source.subscribe(this.parent);
-        }
-    };
-    return SubscriptionDelaySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":48,"../OuterSubscriber":50,"../Subscriber":55,"../util/subscribeToResult":239}],106:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function dematerialize() {
-    return function dematerializeOperatorFunction(source) {
-        return source.lift(new DeMaterializeOperator());
-    };
-}
-exports.dematerialize = dematerialize;
-var DeMaterializeOperator = (function () {
-    function DeMaterializeOperator() {
-    }
-    DeMaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DeMaterializeSubscriber(subscriber));
-    };
-    return DeMaterializeOperator;
-}());
-var DeMaterializeSubscriber = (function (_super) {
-    __extends(DeMaterializeSubscriber, _super);
-    function DeMaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    DeMaterializeSubscriber.prototype._next = function (value) {
-        value.observe(this.destination);
-    };
-    return DeMaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],107:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function distinct(keySelector, flushes) {
-    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
-}
-exports.distinct = distinct;
-var DistinctOperator = (function () {
-    function DistinctOperator(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
-    }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    };
-    return DistinctOperator;
-}());
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.values = new Set();
-        if (flushes) {
-            _this.add(subscribeToResult_1.subscribeToResult(_this, flushes));
-        }
-        return _this;
-    }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    };
-    DistinctSubscriber.prototype._useKeySelector = function (value) {
-        var key;
-        var destination = this.destination;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    };
-    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-        var values = this.values;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.DistinctSubscriber = DistinctSubscriber;
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],108:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function distinctUntilChanged(compare, keySelector) {
-    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
-}
-exports.distinctUntilChanged = distinctUntilChanged;
-var DistinctUntilChangedOperator = (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.hasKey = false;
-        if (typeof compare === 'function') {
-            _this.compare = compare;
-        }
-        return _this;
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            var keySelector = this.keySelector;
-            key = keySelector ? keySelector(value) : value;
-        }
-        catch (err) {
-            return this.destination.error(err);
-        }
-        var result = false;
-        if (this.hasKey) {
-            try {
-                var compare = this.compare;
-                result = compare(this.key, key);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (!result) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],109:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var distinctUntilChanged_1 = require("./distinctUntilChanged");
-function distinctUntilKeyChanged(key, compare) {
-    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
-}
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
-
-},{"./distinctUntilChanged":108}],110:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var filter_1 = require("./filter");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var take_1 = require("./take");
-function elementAt(index, defaultValue) {
-    if (index < 0) {
-        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
-    }
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
-        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
-        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
-}
-exports.elementAt = elementAt;
-
-},{"../util/ArgumentOutOfRangeError":211,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],111:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-var of_1 = require("../observable/of");
-function endWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, array)); };
-}
-exports.endWith = endWith;
-
-},{"../observable/concat":63,"../observable/of":76}],112:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function every(predicate, thisArg) {
-    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
-}
-exports.every = every;
-var EveryOperator = (function () {
-    function EveryOperator(predicate, thisArg, source) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-    }
-    EveryOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-    };
-    return EveryOperator;
-}());
-var EverySubscriber = (function (_super) {
-    __extends(EverySubscriber, _super);
-    function EverySubscriber(destination, predicate, thisArg, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.source = source;
-        _this.index = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
-        this.destination.next(everyValueMatch);
-        this.destination.complete();
-    };
-    EverySubscriber.prototype._next = function (value) {
-        var result = false;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (!result) {
-            this.notifyComplete(false);
-        }
-    };
-    EverySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return EverySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],113:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function exhaust() {
-    return function (source) { return source.lift(new SwitchFirstOperator()); };
-}
-exports.exhaust = exhaust;
-var SwitchFirstOperator = (function () {
-    function SwitchFirstOperator() {
-    }
-    SwitchFirstOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchFirstSubscriber(subscriber));
-    };
-    return SwitchFirstOperator;
-}());
-var SwitchFirstSubscriber = (function (_super) {
-    __extends(SwitchFirstSubscriber, _super);
-    function SwitchFirstSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasCompleted = false;
-        _this.hasSubscription = false;
-        return _this;
-    }
-    SwitchFirstSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.hasSubscription = true;
-            this.add(subscribeToResult_1.subscribeToResult(this, value));
-        }
-    };
-    SwitchFirstSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-    };
-    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return SwitchFirstSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],114:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function exhaustMap(project, resultSelector) {
-    if (resultSelector) {
-        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) {
-        return source.lift(new ExhaustMapOperator(project));
-    };
-}
-exports.exhaustMap = exhaustMap;
-var ExhaustMapOperator = (function () {
-    function ExhaustMapOperator(project) {
-        this.project = project;
-    }
-    ExhaustMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-    };
-    return ExhaustMapOperator;
-}());
-var ExhaustMapSubscriber = (function (_super) {
-    __extends(ExhaustMapSubscriber, _super);
-    function ExhaustMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.hasSubscription = false;
-        _this.hasCompleted = false;
-        _this.index = 0;
-        return _this;
-    }
-    ExhaustMapSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.tryNext(value);
-        }
-    };
-    ExhaustMapSubscriber.prototype.tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.hasSubscription = true;
-        this._innerSub(result, value, index);
-    };
-    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    ExhaustMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    ExhaustMapSubscriber.prototype.notifyError = function (err) {
-        this.destination.error(err);
-    };
-    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return ExhaustMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],115:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (scheduler === void 0) { scheduler = undefined; }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
-}
-exports.expand = expand;
-var ExpandOperator = (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-exports.ExpandOperator = ExpandOperator;
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.scheduler = scheduler;
-        _this.index = 0;
-        _this.active = 0;
-        _this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            _this.buffer = [];
-        }
-        return _this;
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
-        }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            try {
-                var project = this.project;
-                var result = project(value, index);
-                if (!this.scheduler) {
-                    this.subscribeToProjection(result, value, index);
-                }
-                else {
-                    var state = { subscriber: this, result: result, value: value, index: index };
-                    var destination_1 = this.destination;
-                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-                }
-            }
-            catch (e) {
-                destination.error(e);
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        var destination = this.destination;
-        destination.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.ExpandSubscriber = ExpandSubscriber;
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],116:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function filter(predicate, thisArg) {
-    return function filterOperatorFunction(source) {
-        return source.lift(new FilterOperator(predicate, thisArg));
-    };
-}
-exports.filter = filter;
-var FilterOperator = (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.count = 0;
-        return _this;
-    }
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
-        }
-    };
-    return FilterSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],117:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-function finalize(callback) {
-    return function (source) { return source.lift(new FinallyOperator(callback)); };
-}
-exports.finalize = finalize;
-var FinallyOperator = (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        var _this = _super.call(this, destination) || this;
-        _this.add(new Subscription_1.Subscription(callback));
-        return _this;
-    }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../Subscription":56}],118:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function find(predicate, thisArg) {
-    if (typeof predicate !== 'function') {
-        throw new TypeError('predicate is not a function');
-    }
-    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
-}
-exports.find = find;
-var FindValueOperator = (function () {
-    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-    }
-    FindValueOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-    };
-    return FindValueOperator;
-}());
-exports.FindValueOperator = FindValueOperator;
-var FindValueSubscriber = (function (_super) {
-    __extends(FindValueSubscriber, _super);
-    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.yieldIndex = yieldIndex;
-        _this.thisArg = thisArg;
-        _this.index = 0;
-        return _this;
-    }
-    FindValueSubscriber.prototype.notifyComplete = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.unsubscribe();
-    };
-    FindValueSubscriber.prototype._next = function (value) {
-        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
-        var index = this.index++;
-        try {
-            var result = predicate.call(thisArg || this, value, index, this.source);
-            if (result) {
-                this.notifyComplete(this.yieldIndex ? index : value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    FindValueSubscriber.prototype._complete = function () {
-        this.notifyComplete(this.yieldIndex ? -1 : undefined);
-    };
-    return FindValueSubscriber;
-}(Subscriber_1.Subscriber));
-exports.FindValueSubscriber = FindValueSubscriber;
-
-},{"../Subscriber":55}],119:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var find_1 = require("../operators/find");
-function findIndex(predicate, thisArg) {
-    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
-}
-exports.findIndex = findIndex;
-
-},{"../operators/find":118}],120:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var take_1 = require("./take");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var identity_1 = require("../util/identity");
-function first(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.first = first;
-
-},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],121:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var Observable_1 = require("../Observable");
-var Subject_1 = require("../Subject");
-function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-    return function (source) {
-        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-    };
-}
-exports.groupBy = groupBy;
-var GroupByOperator = (function () {
-    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-    }
-    GroupByOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-    };
-    return GroupByOperator;
-}());
-var GroupBySubscriber = (function (_super) {
-    __extends(GroupBySubscriber, _super);
-    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.elementSelector = elementSelector;
-        _this.durationSelector = durationSelector;
-        _this.subjectSelector = subjectSelector;
-        _this.groups = null;
-        _this.attemptedToUnsubscribe = false;
-        _this.count = 0;
-        return _this;
-    }
-    GroupBySubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            this.error(err);
-            return;
-        }
-        this._group(value, key);
-    };
-    GroupBySubscriber.prototype._group = function (value, key) {
-        var groups = this.groups;
-        if (!groups) {
-            groups = this.groups = new Map();
-        }
-        var group = groups.get(key);
-        var element;
-        if (this.elementSelector) {
-            try {
-                element = this.elementSelector(value);
-            }
-            catch (err) {
-                this.error(err);
-            }
-        }
-        else {
-            element = value;
-        }
-        if (!group) {
-            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
-            groups.set(key, group);
-            var groupedObservable = new GroupedObservable(key, group, this);
-            this.destination.next(groupedObservable);
-            if (this.durationSelector) {
-                var duration = void 0;
-                try {
-                    duration = this.durationSelector(new GroupedObservable(key, group));
-                }
-                catch (err) {
-                    this.error(err);
-                    return;
-                }
-                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-            }
-        }
-        if (!group.closed) {
-            group.next(element);
-        }
-    };
-    GroupBySubscriber.prototype._error = function (err) {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.error(err);
-            });
-            groups.clear();
-        }
-        this.destination.error(err);
-    };
-    GroupBySubscriber.prototype._complete = function () {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.complete();
-            });
-            groups.clear();
-        }
-        this.destination.complete();
-    };
-    GroupBySubscriber.prototype.removeGroup = function (key) {
-        this.groups.delete(key);
-    };
-    GroupBySubscriber.prototype.unsubscribe = function () {
-        if (!this.closed) {
-            this.attemptedToUnsubscribe = true;
-            if (this.count === 0) {
-                _super.prototype.unsubscribe.call(this);
-            }
-        }
-    };
-    return GroupBySubscriber;
-}(Subscriber_1.Subscriber));
-var GroupDurationSubscriber = (function (_super) {
-    __extends(GroupDurationSubscriber, _super);
-    function GroupDurationSubscriber(key, group, parent) {
-        var _this = _super.call(this, group) || this;
-        _this.key = key;
-        _this.group = group;
-        _this.parent = parent;
-        return _this;
-    }
-    GroupDurationSubscriber.prototype._next = function (value) {
-        this.complete();
-    };
-    GroupDurationSubscriber.prototype._unsubscribe = function () {
-        var _a = this, parent = _a.parent, key = _a.key;
-        this.key = this.parent = null;
-        if (parent) {
-            parent.removeGroup(key);
-        }
-    };
-    return GroupDurationSubscriber;
-}(Subscriber_1.Subscriber));
-var GroupedObservable = (function (_super) {
-    __extends(GroupedObservable, _super);
-    function GroupedObservable(key, groupSubject, refCountSubscription) {
-        var _this = _super.call(this) || this;
-        _this.key = key;
-        _this.groupSubject = groupSubject;
-        _this.refCountSubscription = refCountSubscription;
-        return _this;
-    }
-    GroupedObservable.prototype._subscribe = function (subscriber) {
-        var subscription = new Subscription_1.Subscription();
-        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
-        if (refCountSubscription && !refCountSubscription.closed) {
-            subscription.add(new InnerRefCountSubscription(refCountSubscription));
-        }
-        subscription.add(groupSubject.subscribe(subscriber));
-        return subscription;
-    };
-    return GroupedObservable;
-}(Observable_1.Observable));
-exports.GroupedObservable = GroupedObservable;
-var InnerRefCountSubscription = (function (_super) {
-    __extends(InnerRefCountSubscription, _super);
-    function InnerRefCountSubscription(parent) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        parent.count++;
-        return _this;
-    }
-    InnerRefCountSubscription.prototype.unsubscribe = function () {
-        var parent = this.parent;
-        if (!parent.closed && !this.closed) {
-            _super.prototype.unsubscribe.call(this);
-            parent.count -= 1;
-            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                parent.unsubscribe();
-            }
-        }
-    };
-    return InnerRefCountSubscription;
-}(Subscription_1.Subscription));
-
-},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56}],122:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function ignoreElements() {
-    return function ignoreElementsOperatorFunction(source) {
-        return source.lift(new IgnoreElementsOperator());
-    };
-}
-exports.ignoreElements = ignoreElements;
-var IgnoreElementsOperator = (function () {
-    function IgnoreElementsOperator() {
-    }
-    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-    };
-    return IgnoreElementsOperator;
-}());
-var IgnoreElementsSubscriber = (function (_super) {
-    __extends(IgnoreElementsSubscriber, _super);
-    function IgnoreElementsSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    IgnoreElementsSubscriber.prototype._next = function (unused) {
-    };
-    return IgnoreElementsSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],123:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function isEmpty() {
-    return function (source) { return source.lift(new IsEmptyOperator()); };
-}
-exports.isEmpty = isEmpty;
-var IsEmptyOperator = (function () {
-    function IsEmptyOperator() {
-    }
-    IsEmptyOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new IsEmptySubscriber(observer));
-    };
-    return IsEmptyOperator;
-}());
-var IsEmptySubscriber = (function (_super) {
-    __extends(IsEmptySubscriber, _super);
-    function IsEmptySubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
-        var destination = this.destination;
-        destination.next(isEmpty);
-        destination.complete();
-    };
-    IsEmptySubscriber.prototype._next = function (value) {
-        this.notifyComplete(false);
-    };
-    IsEmptySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return IsEmptySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],124:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var takeLast_1 = require("./takeLast");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var identity_1 = require("../util/identity");
-function last(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.last = last;
-
-},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./takeLast":169,"./throwIfEmpty":175}],125:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function map(project, thisArg) {
-    return function mapOperation(source) {
-        if (typeof project !== 'function') {
-            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-        }
-        return source.lift(new MapOperator(project, thisArg));
-    };
-}
-exports.map = map;
-var MapOperator = (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-exports.MapOperator = MapOperator;
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.count = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],126:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function mapTo(value) {
-    return function (source) { return source.lift(new MapToOperator(value)); };
-}
-exports.mapTo = mapTo;
-var MapToOperator = (function () {
-    function MapToOperator(value) {
-        this.value = value;
-    }
-    MapToOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapToSubscriber(subscriber, this.value));
-    };
-    return MapToOperator;
-}());
-var MapToSubscriber = (function (_super) {
-    __extends(MapToSubscriber, _super);
-    function MapToSubscriber(destination, value) {
-        var _this = _super.call(this, destination) || this;
-        _this.value = value;
-        return _this;
-    }
-    MapToSubscriber.prototype._next = function (x) {
-        this.destination.next(this.value);
-    };
-    return MapToSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],127:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function materialize() {
-    return function materializeOperatorFunction(source) {
-        return source.lift(new MaterializeOperator());
-    };
-}
-exports.materialize = materialize;
-var MaterializeOperator = (function () {
-    function MaterializeOperator() {
-    }
-    MaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MaterializeSubscriber(subscriber));
-    };
-    return MaterializeOperator;
-}());
-var MaterializeSubscriber = (function (_super) {
-    __extends(MaterializeSubscriber, _super);
-    function MaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    MaterializeSubscriber.prototype._next = function (value) {
-        this.destination.next(Notification_1.Notification.createNext(value));
-    };
-    MaterializeSubscriber.prototype._error = function (err) {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createError(err));
-        destination.complete();
-    };
-    MaterializeSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createComplete());
-        destination.complete();
-    };
-    return MaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Notification":47,"../Subscriber":55}],128:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function max(comparer) {
-    var max = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
-        : function (x, y) { return x > y ? x : y; };
-    return reduce_1.reduce(max);
-}
-exports.max = max;
-
-},{"./reduce":146}],129:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var merge_1 = require("../observable/merge");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
-}
-exports.merge = merge;
-
-},{"../observable/merge":74}],130:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-var identity_1 = require("../util/identity");
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
-}
-exports.mergeAll = mergeAll;
-
-},{"../util/identity":219,"./mergeMap":131}],131:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
-    }
-    else if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
-}
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeMapSubscriber = MergeMapSubscriber;
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],132:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function mergeMapTo(innerObservable, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
-    }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
-}
-exports.mergeMapTo = mergeMapTo;
-
-},{"./mergeMap":131}],133:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-function mergeScan(accumulator, seed, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
-}
-exports.mergeScan = mergeScan;
-var MergeScanOperator = (function () {
-    function MergeScanOperator(accumulator, seed, concurrent) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.concurrent = concurrent;
-    }
-    MergeScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-    };
-    return MergeScanOperator;
-}());
-exports.MergeScanOperator = MergeScanOperator;
-var MergeScanSubscriber = (function (_super) {
-    __extends(MergeScanSubscriber, _super);
-    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this.acc = acc;
-        _this.concurrent = concurrent;
-        _this.hasValue = false;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeScanSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            var index = this.index++;
-            var destination = this.destination;
-            var ish = void 0;
-            try {
-                var accumulator = this.accumulator;
-                ish = accumulator(this.acc, value, index);
-            }
-            catch (e) {
-                return destination.error(e);
-            }
-            this.active++;
-            this._innerSub(ish, value, index);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeScanSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var destination = this.destination;
-        this.acc = innerValue;
-        this.hasValue = true;
-        destination.next(innerValue);
-    };
-    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-    };
-    return MergeScanSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeScanSubscriber = MergeScanSubscriber;
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],134:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function min(comparer) {
-    var min = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
-        : function (x, y) { return x < y ? x : y; };
-    return reduce_1.reduce(min);
-}
-exports.min = min;
-
-},{"./reduce":146}],135:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ConnectableObservable_1 = require("../observable/ConnectableObservable");
-function multicast(subjectOrSubjectFactory, selector) {
-    return function multicastOperatorFunction(source) {
-        var subjectFactory;
-        if (typeof subjectOrSubjectFactory === 'function') {
-            subjectFactory = subjectOrSubjectFactory;
-        }
-        else {
-            subjectFactory = function subjectFactory() {
-                return subjectOrSubjectFactory;
-            };
-        }
-        if (typeof selector === 'function') {
-            return source.lift(new MulticastOperator(subjectFactory, selector));
-        }
-        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
-        connectable.source = source;
-        connectable.subjectFactory = subjectFactory;
-        return connectable;
-    };
-}
-exports.multicast = multicast;
-var MulticastOperator = (function () {
-    function MulticastOperator(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    MulticastOperator.prototype.call = function (subscriber, source) {
-        var selector = this.selector;
-        var subject = this.subjectFactory();
-        var subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    };
-    return MulticastOperator;
-}());
-exports.MulticastOperator = MulticastOperator;
-
-},{"../observable/ConnectableObservable":58}],136:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function observeOnOperatorFunction(source) {
-        return source.lift(new ObserveOnOperator(scheduler, delay));
-    };
-}
-exports.observeOn = observeOn;
-var ObserveOnOperator = (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-exports.ObserveOnOperator = ObserveOnOperator;
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        var _this = _super.call(this, destination) || this;
-        _this.scheduler = scheduler;
-        _this.delay = delay;
-        return _this;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        var destination = this.destination;
-        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return ObserveOnSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ObserveOnSubscriber = ObserveOnSubscriber;
-var ObserveOnMessage = (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-exports.ObserveOnMessage = ObserveOnMessage;
-
-},{"../Notification":47,"../Subscriber":55}],137:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var from_1 = require("../observable/from");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function onErrorResumeNext() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-function onErrorResumeNextStatic() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    var source = null;
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    source = nextSources.shift();
-    return from_1.from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
-}
-exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
-var OnErrorResumeNextOperator = (function () {
-    function OnErrorResumeNextOperator(nextSources) {
-        this.nextSources = nextSources;
-    }
-    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-    };
-    return OnErrorResumeNextOperator;
-}());
-var OnErrorResumeNextSubscriber = (function (_super) {
-    __extends(OnErrorResumeNextSubscriber, _super);
-    function OnErrorResumeNextSubscriber(destination, nextSources) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.nextSources = nextSources;
-        return _this;
-    }
-    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype._error = function (err) {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype._complete = function () {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
-        var next = this.nextSources.shift();
-        if (!!next) {
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return OnErrorResumeNextSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/isArray":220,"../util/subscribeToResult":239}],138:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function pairwise() {
-    return function (source) { return source.lift(new PairwiseOperator()); };
-}
-exports.pairwise = pairwise;
-var PairwiseOperator = (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasPrev = false;
-        return _this;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        var pair;
-        if (this.hasPrev) {
-            pair = [this.prev, value];
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-        if (pair) {
-            this.destination.next(pair);
-        }
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],139:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var not_1 = require("../util/not");
-var filter_1 = require("./filter");
-function partition(predicate, thisArg) {
-    return function (source) { return [
-        filter_1.filter(predicate, thisArg)(source),
-        filter_1.filter(not_1.not(predicate, thisArg))(source)
-    ]; };
-}
-exports.partition = partition;
-
-},{"../util/not":232,"./filter":116}],140:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var map_1 = require("./map");
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return function (source) { return map_1.map(plucker(properties, length))(source); };
-}
-exports.pluck = pluck;
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
-}
-
-},{"./map":125}],141:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var multicast_1 = require("./multicast");
-function publish(selector) {
-    return selector ?
-        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast(new Subject_1.Subject());
-}
-exports.publish = publish;
-
-},{"../Subject":53,"./multicast":135}],142:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("../BehaviorSubject");
-var multicast_1 = require("./multicast");
-function publishBehavior(value) {
-    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
-}
-exports.publishBehavior = publishBehavior;
-
-},{"../BehaviorSubject":45,"./multicast":135}],143:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncSubject_1 = require("../AsyncSubject");
-var multicast_1 = require("./multicast");
-function publishLast() {
-    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
-}
-exports.publishLast = publishLast;
-
-},{"../AsyncSubject":44,"./multicast":135}],144:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-var multicast_1 = require("./multicast");
-function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-        scheduler = selectorOrScheduler;
-    }
-    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
-}
-exports.publishReplay = publishReplay;
-
-},{"../ReplaySubject":51,"./multicast":135}],145:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var race_1 = require("../observable/race");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function raceOperatorFunction(source) {
-        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.race = race;
-
-},{"../observable/race":80,"../util/isArray":220}],146:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var scan_1 = require("./scan");
-var takeLast_1 = require("./takeLast");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var pipe_1 = require("../util/pipe");
-function reduce(accumulator, seed) {
-    if (arguments.length >= 2) {
-        return function reduceOperatorFunctionWithSeed(source) {
-            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
-        };
-    }
-    return function reduceOperatorFunction(source) {
-        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
-    };
-}
-exports.reduce = reduce;
-
-},{"../util/pipe":233,"./defaultIfEmpty":103,"./scan":154,"./takeLast":169}],147:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function refCount() {
-    return function refCountOperatorFunction(source) {
-        return source.lift(new RefCountOperator(source));
-    };
-}
-exports.refCount = refCount;
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],148:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var empty_1 = require("../observable/empty");
-function repeat(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else if (count < 0) {
-            return source.lift(new RepeatOperator(-1, source));
-        }
-        else {
-            return source.lift(new RepeatOperator(count - 1, source));
-        }
-    };
-}
-exports.repeat = repeat;
-var RepeatOperator = (function () {
-    function RepeatOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RepeatOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-    };
-    return RepeatOperator;
-}());
-var RepeatSubscriber = (function (_super) {
-    __extends(RepeatSubscriber, _super);
-    function RepeatSubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RepeatSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.complete.call(this);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RepeatSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../observable/empty":65}],149:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function repeatWhen(notifier) {
-    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
-}
-exports.repeatWhen = repeatWhen;
-var RepeatWhenOperator = (function () {
-    function RepeatWhenOperator(notifier) {
-        this.notifier = notifier;
-    }
-    RepeatWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-    };
-    return RepeatWhenOperator;
-}());
-var RepeatWhenSubscriber = (function (_super) {
-    __extends(RepeatWhenSubscriber, _super);
-    function RepeatWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        _this.sourceIsBeingSubscribedTo = true;
-        return _this;
-    }
-    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.sourceIsBeingSubscribedTo = true;
-        this.source.subscribe(this);
-    };
-    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        if (this.sourceIsBeingSubscribedTo === false) {
-            return _super.prototype.complete.call(this);
-        }
-    };
-    RepeatWhenSubscriber.prototype.complete = function () {
-        this.sourceIsBeingSubscribedTo = false;
-        if (!this.isStopped) {
-            if (!this.retries) {
-                this.subscribeToRetries();
-            }
-            if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                return _super.prototype.complete.call(this);
-            }
-            this._unsubscribeAndRecycle();
-            this.notifications.next();
-        }
-    };
-    RepeatWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
-        if (notifications) {
-            notifications.unsubscribe();
-            this.notifications = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        _super.prototype._unsubscribeAndRecycle.call(this);
-        this._unsubscribe = _unsubscribe;
-        return this;
-    };
-    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
-        this.notifications = new Subject_1.Subject();
-        var retries;
-        try {
-            var notifier = this.notifier;
-            retries = notifier(this.notifications);
-        }
-        catch (e) {
-            return _super.prototype.complete.call(this);
-        }
-        this.retries = retries;
-        this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-    };
-    return RepeatWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],150:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function retry(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) { return source.lift(new RetryOperator(count, source)); };
-}
-exports.retry = retry;
-var RetryOperator = (function () {
-    function RetryOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RetryOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-    };
-    return RetryOperator;
-}());
-var RetrySubscriber = (function (_super) {
-    __extends(RetrySubscriber, _super);
-    function RetrySubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RetrySubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.error.call(this, err);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RetrySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],151:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function retryWhen(notifier) {
-    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
-}
-exports.retryWhen = retryWhen;
-var RetryWhenOperator = (function () {
-    function RetryWhenOperator(notifier, source) {
-        this.notifier = notifier;
-        this.source = source;
-    }
-    RetryWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-    };
-    return RetryWhenOperator;
-}());
-var RetryWhenSubscriber = (function (_super) {
-    __extends(RetryWhenSubscriber, _super);
-    function RetryWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        return _this;
-    }
-    RetryWhenSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var errors = this.errors;
-            var retries = this.retries;
-            var retriesSubscription = this.retriesSubscription;
-            if (!retries) {
-                errors = new Subject_1.Subject();
-                try {
-                    var notifier = this.notifier;
-                    retries = notifier(errors);
-                }
-                catch (e) {
-                    return _super.prototype.error.call(this, e);
-                }
-                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-            }
-            else {
-                this.errors = null;
-                this.retriesSubscription = null;
-            }
-            this._unsubscribeAndRecycle();
-            this.errors = errors;
-            this.retries = retries;
-            this.retriesSubscription = retriesSubscription;
-            errors.next(err);
-        }
-    };
-    RetryWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
-        if (errors) {
-            errors.unsubscribe();
-            this.errors = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        this._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        this.source.subscribe(this);
-    };
-    return RetryWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],152:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function sample(notifier) {
-    return function (source) { return source.lift(new SampleOperator(notifier)); };
-}
-exports.sample = sample;
-var SampleOperator = (function () {
-    function SampleOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SampleOperator.prototype.call = function (subscriber, source) {
-        var sampleSubscriber = new SampleSubscriber(subscriber);
-        var subscription = source.subscribe(sampleSubscriber);
-        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));
-        return subscription;
-    };
-    return SampleOperator;
-}());
-var SampleSubscriber = (function (_super) {
-    __extends(SampleSubscriber, _super);
-    function SampleSubscriber() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.hasValue = false;
-        return _this;
-    }
-    SampleSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-    };
-    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.value);
-        }
-    };
-    return SampleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],153:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function sampleTime(period, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
-}
-exports.sampleTime = sampleTime;
-var SampleTimeOperator = (function () {
-    function SampleTimeOperator(period, scheduler) {
-        this.period = period;
-        this.scheduler = scheduler;
-    }
-    SampleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-    };
-    return SampleTimeOperator;
-}());
-var SampleTimeSubscriber = (function (_super) {
-    __extends(SampleTimeSubscriber, _super);
-    function SampleTimeSubscriber(destination, period, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.period = period;
-        _this.scheduler = scheduler;
-        _this.hasValue = false;
-        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
-        return _this;
-    }
-    SampleTimeSubscriber.prototype._next = function (value) {
-        this.lastValue = value;
-        this.hasValue = true;
-    };
-    SampleTimeSubscriber.prototype.notifyNext = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.lastValue);
-        }
-    };
-    return SampleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNotification(state) {
-    var subscriber = state.subscriber, period = state.period;
-    subscriber.notifyNext();
-    this.schedule(state, period);
-}
-
-},{"../Subscriber":55,"../scheduler/async":206}],154:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function scan(accumulator, seed) {
-    var hasSeed = false;
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return function scanOperatorFunction(source) {
-        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-    };
-}
-exports.scan = scan;
-var ScanOperator = (function () {
-    function ScanOperator(accumulator, seed, hasSeed) {
-        if (hasSeed === void 0) { hasSeed = false; }
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    };
-    return ScanOperator;
-}());
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this._seed = _seed;
-        _this.hasSeed = hasSeed;
-        _this.index = 0;
-        return _this;
-    }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.hasSeed = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],155:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function sequenceEqual(compareTo, comparator) {
-    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
-}
-exports.sequenceEqual = sequenceEqual;
-var SequenceEqualOperator = (function () {
-    function SequenceEqualOperator(compareTo, comparator) {
-        this.compareTo = compareTo;
-        this.comparator = comparator;
-    }
-    SequenceEqualOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-    };
-    return SequenceEqualOperator;
-}());
-exports.SequenceEqualOperator = SequenceEqualOperator;
-var SequenceEqualSubscriber = (function (_super) {
-    __extends(SequenceEqualSubscriber, _super);
-    function SequenceEqualSubscriber(destination, compareTo, comparator) {
-        var _this = _super.call(this, destination) || this;
-        _this.compareTo = compareTo;
-        _this.comparator = comparator;
-        _this._a = [];
-        _this._b = [];
-        _this._oneComplete = false;
-        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
-        return _this;
-    }
-    SequenceEqualSubscriber.prototype._next = function (value) {
-        if (this._oneComplete && this._b.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._a.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype._complete = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-        this.unsubscribe();
-    };
-    SequenceEqualSubscriber.prototype.checkValues = function () {
-        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
-        while (_a.length > 0 && _b.length > 0) {
-            var a = _a.shift();
-            var b = _b.shift();
-            var areEqual = false;
-            try {
-                areEqual = comparator ? comparator(a, b) : a === b;
-            }
-            catch (e) {
-                this.destination.error(e);
-            }
-            if (!areEqual) {
-                this.emit(false);
-            }
-        }
-    };
-    SequenceEqualSubscriber.prototype.emit = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-    };
-    SequenceEqualSubscriber.prototype.nextB = function (value) {
-        if (this._oneComplete && this._a.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._b.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype.completeB = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-    };
-    return SequenceEqualSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
-var SequenceEqualCompareToSubscriber = (function (_super) {
-    __extends(SequenceEqualCompareToSubscriber, _super);
-    function SequenceEqualCompareToSubscriber(destination, parent) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        return _this;
-    }
-    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
-        this.parent.nextB(value);
-    };
-    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
-        this.parent.error(err);
-        this.unsubscribe();
-    };
-    SequenceEqualCompareToSubscriber.prototype._complete = function () {
-        this.parent.completeB();
-        this.unsubscribe();
-    };
-    return SequenceEqualCompareToSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],156:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var multicast_1 = require("./multicast");
-var refCount_1 = require("./refCount");
-var Subject_1 = require("../Subject");
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
-}
-function share() {
-    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
-}
-exports.share = share;
-
-},{"../Subject":53,"./multicast":135,"./refCount":147}],157:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-function shareReplay(configOrBufferSize, windowTime, scheduler) {
-    var config;
-    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-        config = configOrBufferSize;
-    }
-    else {
-        config = {
-            bufferSize: configOrBufferSize,
-            windowTime: windowTime,
-            refCount: false,
-            scheduler: scheduler
-        };
-    }
-    return function (source) { return source.lift(shareReplayOperator(config)); };
-}
-exports.shareReplay = shareReplay;
-function shareReplayOperator(_a) {
-    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
-    var subject;
-    var refCount = 0;
-    var subscription;
-    var hasError = false;
-    var isComplete = false;
-    return function shareReplayOperation(source) {
-        refCount++;
-        if (!subject || hasError) {
-            hasError = false;
-            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-            subscription = source.subscribe({
-                next: function (value) { subject.next(value); },
-                error: function (err) {
-                    hasError = true;
-                    subject.error(err);
-                },
-                complete: function () {
-                    isComplete = true;
-                    subscription = undefined;
-                    subject.complete();
-                },
-            });
-        }
-        var innerSub = subject.subscribe(this);
-        this.add(function () {
-            refCount--;
-            innerSub.unsubscribe();
-            if (subscription && !isComplete && useRefCount && refCount === 0) {
-                subscription.unsubscribe();
-                subscription = undefined;
-                subject = undefined;
-            }
-        });
-    };
-}
-
-},{"../ReplaySubject":51}],158:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var EmptyError_1 = require("../util/EmptyError");
-function single(predicate) {
-    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
-}
-exports.single = single;
-var SingleOperator = (function () {
-    function SingleOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    SingleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-    };
-    return SingleOperator;
-}());
-var SingleSubscriber = (function (_super) {
-    __extends(SingleSubscriber, _super);
-    function SingleSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.seenValue = false;
-        _this.index = 0;
-        return _this;
-    }
-    SingleSubscriber.prototype.applySingleValue = function (value) {
-        if (this.seenValue) {
-            this.destination.error('Sequence contains more than one element');
-        }
-        else {
-            this.seenValue = true;
-            this.singleValue = value;
-        }
-    };
-    SingleSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this.tryNext(value, index);
-        }
-        else {
-            this.applySingleValue(value);
-        }
-    };
-    SingleSubscriber.prototype.tryNext = function (value, index) {
-        try {
-            if (this.predicate(value, index, this.source)) {
-                this.applySingleValue(value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    SingleSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.index > 0) {
-            destination.next(this.seenValue ? this.singleValue : undefined);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return SingleSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../util/EmptyError":212}],159:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skip(count) {
-    return function (source) { return source.lift(new SkipOperator(count)); };
-}
-exports.skip = skip;
-var SkipOperator = (function () {
-    function SkipOperator(total) {
-        this.total = total;
-    }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],160:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-function skipLast(count) {
-    return function (source) { return source.lift(new SkipLastOperator(count)); };
-}
-exports.skipLast = skipLast;
-var SkipLastOperator = (function () {
-    function SkipLastOperator(_skipCount) {
-        this._skipCount = _skipCount;
-        if (this._skipCount < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    SkipLastOperator.prototype.call = function (subscriber, source) {
-        if (this._skipCount === 0) {
-            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
-        }
-        else {
-            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-        }
-    };
-    return SkipLastOperator;
-}());
-var SkipLastSubscriber = (function (_super) {
-    __extends(SkipLastSubscriber, _super);
-    function SkipLastSubscriber(destination, _skipCount) {
-        var _this = _super.call(this, destination) || this;
-        _this._skipCount = _skipCount;
-        _this._count = 0;
-        _this._ring = new Array(_skipCount);
-        return _this;
-    }
-    SkipLastSubscriber.prototype._next = function (value) {
-        var skipCount = this._skipCount;
-        var count = this._count++;
-        if (count < skipCount) {
-            this._ring[count] = value;
-        }
-        else {
-            var currentIndex = count % skipCount;
-            var ring = this._ring;
-            var oldValue = ring[currentIndex];
-            ring[currentIndex] = value;
-            this.destination.next(oldValue);
-        }
-    };
-    return SkipLastSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../util/ArgumentOutOfRangeError":211}],161:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function skipUntil(notifier) {
-    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
-}
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (destination, source) {
-        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasValue = false;
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(_this, undefined, undefined);
-        _this.add(innerSubscriber);
-        _this.innerSubscription = innerSubscriber;
-        var innerSubscription = subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            _this.add(innerSubscription);
-            _this.innerSubscription = innerSubscription;
-        }
-        return _this;
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-        if (this.innerSubscription) {
-            this.innerSubscription.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],162:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skipWhile(predicate) {
-    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
-}
-exports.skipWhile = skipWhile;
-var SkipWhileOperator = (function () {
-    function SkipWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    SkipWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    };
-    return SkipWhileOperator;
-}());
-var SkipWhileSubscriber = (function (_super) {
-    __extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.skipping = true;
-        _this.index = 0;
-        return _this;
-    }
-    SkipWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    };
-    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-        try {
-            var result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    return SkipWhileSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],163:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-var isScheduler_1 = require("../util/isScheduler");
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
-        return function (source) { return concat_1.concat(array, source, scheduler); };
-    }
-    else {
-        return function (source) { return concat_1.concat(array, source); };
-    }
-}
-exports.startWith = startWith;
-
-},{"../observable/concat":63,"../util/isScheduler":230}],164:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
-function subscribeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function subscribeOnOperatorFunction(source) {
-        return source.lift(new SubscribeOnOperator(scheduler, delay));
-    };
-}
-exports.subscribeOn = subscribeOn;
-var SubscribeOnOperator = (function () {
-    function SubscribeOnOperator(scheduler, delay) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    SubscribeOnOperator.prototype.call = function (subscriber, source) {
-        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-    };
-    return SubscribeOnOperator;
-}());
-
-},{"../observable/SubscribeOnObservable":59}],165:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-var identity_1 = require("../util/identity");
-function switchAll() {
-    return switchMap_1.switchMap(identity_1.identity);
-}
-exports.switchAll = switchAll;
-
-},{"../util/identity":219,"./switchMap":166}],166:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function switchMap(project, resultSelector) {
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) { return source.lift(new SwitchMapOperator(project)); };
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project) {
-        this.project = project;
-    }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-    };
-    return SwitchMapOperator;
-}());
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.index = 0;
-        return _this;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (this.innerSubscription !== innerSubscriber) {
-            destination.add(this.innerSubscription);
-        }
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-        this.unsubscribe();
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],167:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-function switchMapTo(innerObservable, resultSelector) {
-    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
-}
-exports.switchMapTo = switchMapTo;
-
-},{"./switchMap":166}],168:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function take(count) {
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeOperator(count));
-        }
-    };
-}
-exports.take = take;
-var TakeOperator = (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        var count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],169:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function takeLast(count) {
-    return function takeLastOperatorFunction(source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeLastOperator(count));
-        }
-    };
-}
-exports.takeLast = takeLast;
-var TakeLastOperator = (function () {
-    function TakeLastOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeLastOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-    };
-    return TakeLastOperator;
-}());
-var TakeLastSubscriber = (function (_super) {
-    __extends(TakeLastSubscriber, _super);
-    function TakeLastSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.ring = new Array();
-        _this.count = 0;
-        return _this;
-    }
-    TakeLastSubscriber.prototype._next = function (value) {
-        var ring = this.ring;
-        var total = this.total;
-        var count = this.count++;
-        if (ring.length < total) {
-            ring.push(value);
-        }
-        else {
-            var index = count % total;
-            ring[index] = value;
-        }
-    };
-    TakeLastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        var count = this.count;
-        if (count > 0) {
-            var total = this.count >= this.total ? this.total : this.count;
-            var ring = this.ring;
-            for (var i = 0; i < total; i++) {
-                var idx = (count++) % total;
-                destination.next(ring[idx]);
-            }
-        }
-        destination.complete();
-    };
-    return TakeLastSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],170:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function takeUntil(notifier) {
-    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
-}
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(takeUntilSubscriber, this.notifier);
-        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-            takeUntilSubscriber.add(notifierSubscription);
-            return source.subscribe(takeUntilSubscriber);
-        }
-        return takeUntilSubscriber;
-    };
-    return TakeUntilOperator;
-}());
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.seenValue = false;
-        return _this;
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.seenValue = true;
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],171:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function takeWhile(predicate, inclusive) {
-    if (inclusive === void 0) { inclusive = false; }
-    return function (source) {
-        return source.lift(new TakeWhileOperator(predicate, inclusive));
-    };
-}
-exports.takeWhile = takeWhile;
-var TakeWhileOperator = (function () {
-    function TakeWhileOperator(predicate, inclusive) {
-        this.predicate = predicate;
-        this.inclusive = inclusive;
-    }
-    TakeWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-    };
-    return TakeWhileOperator;
-}());
-var TakeWhileSubscriber = (function (_super) {
-    __extends(TakeWhileSubscriber, _super);
-    function TakeWhileSubscriber(destination, predicate, inclusive) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.inclusive = inclusive;
-        _this.index = 0;
-        return _this;
-    }
-    TakeWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        var result;
-        try {
-            result = this.predicate(value, this.index++);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this.nextOrComplete(value, result);
-    };
-    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
-        var destination = this.destination;
-        if (Boolean(predicateResult)) {
-            destination.next(value);
-        }
-        else {
-            if (this.inclusive) {
-                destination.next(value);
-            }
-            destination.complete();
-        }
-    };
-    return TakeWhileSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55}],172:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var noop_1 = require("../util/noop");
-var isFunction_1 = require("../util/isFunction");
-function tap(nextOrObserver, error, complete) {
-    return function tapOperatorFunction(source) {
-        return source.lift(new DoOperator(nextOrObserver, error, complete));
-    };
-}
-exports.tap = tap;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-var TapSubscriber = (function (_super) {
-    __extends(TapSubscriber, _super);
-    function TapSubscriber(destination, observerOrNext, error, complete) {
-        var _this = _super.call(this, destination) || this;
-        _this._tapNext = noop_1.noop;
-        _this._tapError = noop_1.noop;
-        _this._tapComplete = noop_1.noop;
-        _this._tapError = error || noop_1.noop;
-        _this._tapComplete = complete || noop_1.noop;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            _this._context = _this;
-            _this._tapNext = observerOrNext;
-        }
-        else if (observerOrNext) {
-            _this._context = observerOrNext;
-            _this._tapNext = observerOrNext.next || noop_1.noop;
-            _this._tapError = observerOrNext.error || noop_1.noop;
-            _this._tapComplete = observerOrNext.complete || noop_1.noop;
-        }
-        return _this;
-    }
-    TapSubscriber.prototype._next = function (value) {
-        try {
-            this._tapNext.call(this._context, value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(value);
-    };
-    TapSubscriber.prototype._error = function (err) {
-        try {
-            this._tapError.call(this._context, err);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.error(err);
-    };
-    TapSubscriber.prototype._complete = function () {
-        try {
-            this._tapComplete.call(this._context);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        return this.destination.complete();
-    };
-    return TapSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":55,"../util/isFunction":223,"../util/noop":231}],173:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-exports.defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-function throttle(durationSelector, config) {
-    if (config === void 0) { config = exports.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
-}
-exports.throttle = throttle;
-var ThrottleOperator = (function () {
-    function ThrottleOperator(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    };
-    return ThrottleOperator;
-}());
-var ThrottleSubscriber = (function (_super) {
-    __extends(ThrottleSubscriber, _super);
-    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.durationSelector = durationSelector;
-        _this._leading = _leading;
-        _this._trailing = _trailing;
-        _this._hasValue = false;
-        return _this;
-    }
-    ThrottleSubscriber.prototype._next = function (value) {
-        this._hasValue = true;
-        this._sendValue = value;
-        if (!this._throttled) {
-            if (this._leading) {
-                this.send();
-            }
-            else {
-                this.throttle(value);
-            }
-        }
-    };
-    ThrottleSubscriber.prototype.send = function () {
-        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
-        if (_hasValue) {
-            this.destination.next(_sendValue);
-            this.throttle(_sendValue);
-        }
-        this._hasValue = false;
-        this._sendValue = null;
-    };
-    ThrottleSubscriber.prototype.throttle = function (value) {
-        var duration = this.tryDurationSelector(value);
-        if (!!duration) {
-            this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration));
-        }
-    };
-    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    };
-    ThrottleSubscriber.prototype.throttlingDone = function () {
-        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
-        if (_throttled) {
-            _throttled.unsubscribe();
-        }
-        this._throttled = null;
-        if (_trailing) {
-            this.send();
-        }
-    };
-    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.throttlingDone();
-    };
-    ThrottleSubscriber.prototype.notifyComplete = function () {
-        this.throttlingDone();
-    };
-    return ThrottleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],174:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-var throttle_1 = require("./throttle");
-function throttleTime(duration, scheduler, config) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
-}
-exports.throttleTime = throttleTime;
-var ThrottleTimeOperator = (function () {
-    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    };
-    return ThrottleTimeOperator;
-}());
-var ThrottleTimeSubscriber = (function (_super) {
-    __extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.duration = duration;
-        _this.scheduler = scheduler;
-        _this.leading = leading;
-        _this.trailing = trailing;
-        _this._hasTrailingValue = false;
-        _this._trailingValue = null;
-        return _this;
-    }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-            else if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-    };
-    ThrottleTimeSubscriber.prototype._complete = function () {
-        if (this._hasTrailingValue) {
-            this.destination.next(this._trailingValue);
-            this.destination.complete();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
-}
-
-},{"../Subscriber":55,"../scheduler/async":206,"./throttle":173}],175:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var Subscriber_1 = require("../Subscriber");
-function throwIfEmpty(errorFactory) {
-    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
-    return function (source) {
-        return source.lift(new ThrowIfEmptyOperator(errorFactory));
-    };
-}
-exports.throwIfEmpty = throwIfEmpty;
-var ThrowIfEmptyOperator = (function () {
-    function ThrowIfEmptyOperator(errorFactory) {
-        this.errorFactory = errorFactory;
-    }
-    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-    };
-    return ThrowIfEmptyOperator;
-}());
-var ThrowIfEmptySubscriber = (function (_super) {
-    __extends(ThrowIfEmptySubscriber, _super);
-    function ThrowIfEmptySubscriber(destination, errorFactory) {
-        var _this = _super.call(this, destination) || this;
-        _this.errorFactory = errorFactory;
-        _this.hasValue = false;
-        return _this;
-    }
-    ThrowIfEmptySubscriber.prototype._next = function (value) {
-        this.hasValue = true;
-        this.destination.next(value);
-    };
-    ThrowIfEmptySubscriber.prototype._complete = function () {
-        if (!this.hasValue) {
-            var err = void 0;
-            try {
-                err = this.errorFactory();
-            }
-            catch (e) {
-                err = e;
-            }
-            this.destination.error(err);
-        }
-        else {
-            return this.destination.complete();
-        }
-    };
-    return ThrowIfEmptySubscriber;
-}(Subscriber_1.Subscriber));
-function defaultErrorFactory() {
-    return new EmptyError_1.EmptyError();
-}
-
-},{"../Subscriber":55,"../util/EmptyError":212}],176:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var scan_1 = require("./scan");
-var defer_1 = require("../observable/defer");
-var map_1 = require("./map");
-function timeInterval(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return defer_1.defer(function () {
-        return source.pipe(scan_1.scan(function (_a, value) {
-            var current = _a.current;
-            return ({ value: value, current: scheduler.now(), last: current });
-        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
-            var current = _a.current, last = _a.last, value = _a.value;
-            return new TimeInterval(value, current - last);
-        }));
-    }); };
-}
-exports.timeInterval = timeInterval;
-var TimeInterval = (function () {
-    function TimeInterval(value, interval) {
-        this.value = value;
-        this.interval = interval;
-    }
-    return TimeInterval;
-}());
-exports.TimeInterval = TimeInterval;
-
-},{"../observable/defer":64,"../scheduler/async":206,"./map":125,"./scan":154}],177:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var TimeoutError_1 = require("../util/TimeoutError");
-var timeoutWith_1 = require("./timeoutWith");
-var throwError_1 = require("../observable/throwError");
-function timeout(due, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
-}
-exports.timeout = timeout;
-
-},{"../observable/throwError":82,"../scheduler/async":206,"../util/TimeoutError":215,"./timeoutWith":178}],178:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function timeoutWith(due, withObservable, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) {
-        var absoluteTimeout = isDate_1.isDate(due);
-        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-    };
-}
-exports.timeoutWith = timeoutWith;
-var TimeoutWithOperator = (function () {
-    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
-        this.waitFor = waitFor;
-        this.absoluteTimeout = absoluteTimeout;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-    }
-    TimeoutWithOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-    };
-    return TimeoutWithOperator;
-}());
-var TimeoutWithSubscriber = (function (_super) {
-    __extends(TimeoutWithSubscriber, _super);
-    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.absoluteTimeout = absoluteTimeout;
-        _this.waitFor = waitFor;
-        _this.withObservable = withObservable;
-        _this.scheduler = scheduler;
-        _this.action = null;
-        _this.scheduleTimeout();
-        return _this;
-    }
-    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
-        var withObservable = subscriber.withObservable;
-        subscriber._unsubscribeAndRecycle();
-        subscriber.add(subscribeToResult_1.subscribeToResult(subscriber, withObservable));
-    };
-    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
-        var action = this.action;
-        if (action) {
-            this.action = action.schedule(this, this.waitFor);
-        }
-        else {
-            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-        }
-    };
-    TimeoutWithSubscriber.prototype._next = function (value) {
-        if (!this.absoluteTimeout) {
-            this.scheduleTimeout();
-        }
-        _super.prototype._next.call(this, value);
-    };
-    TimeoutWithSubscriber.prototype._unsubscribe = function () {
-        this.action = null;
-        this.scheduler = null;
-        this.withObservable = null;
-    };
-    return TimeoutWithSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../scheduler/async":206,"../util/isDate":222,"../util/subscribeToResult":239}],179:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var map_1 = require("./map");
-function timestamp(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
-}
-exports.timestamp = timestamp;
-var Timestamp = (function () {
-    function Timestamp(value, timestamp) {
-        this.value = value;
-        this.timestamp = timestamp;
-    }
-    return Timestamp;
-}());
-exports.Timestamp = Timestamp;
-
-},{"../scheduler/async":206,"./map":125}],180:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function toArrayReducer(arr, item, index) {
-    if (index === 0) {
-        return [item];
-    }
-    arr.push(item);
-    return arr;
-}
-function toArray() {
-    return reduce_1.reduce(toArrayReducer, []);
-}
-exports.toArray = toArray;
-
-},{"./reduce":146}],181:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function window(windowBoundaries) {
-    return function windowOperatorFunction(source) {
-        return source.lift(new WindowOperator(windowBoundaries));
-    };
-}
-exports.window = window;
-var WindowOperator = (function () {
-    function WindowOperator(windowBoundaries) {
-        this.windowBoundaries = windowBoundaries;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        var windowSubscriber = new WindowSubscriber(subscriber);
-        var sourceSubscription = source.subscribe(windowSubscriber);
-        if (!sourceSubscription.closed) {
-            windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));
-        }
-        return sourceSubscription;
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.window = new Subject_1.Subject();
-        destination.next(_this.window);
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow();
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this._complete();
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-    };
-    WindowSubscriber.prototype._unsubscribe = function () {
-        this.window = null;
-    };
-    WindowSubscriber.prototype.openWindow = function () {
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var destination = this.destination;
-        var newWindow = this.window = new Subject_1.Subject();
-        destination.next(newWindow);
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],182:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subject_1 = require("../Subject");
-function windowCount(windowSize, startWindowEvery) {
-    if (startWindowEvery === void 0) { startWindowEvery = 0; }
-    return function windowCountOperatorFunction(source) {
-        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-    };
-}
-exports.windowCount = windowCount;
-var WindowCountOperator = (function () {
-    function WindowCountOperator(windowSize, startWindowEvery) {
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-    }
-    WindowCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-    };
-    return WindowCountOperator;
-}());
-var WindowCountSubscriber = (function (_super) {
-    __extends(WindowCountSubscriber, _super);
-    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowSize = windowSize;
-        _this.startWindowEvery = startWindowEvery;
-        _this.windows = [new Subject_1.Subject()];
-        _this.count = 0;
-        destination.next(_this.windows[0]);
-        return _this;
-    }
-    WindowCountSubscriber.prototype._next = function (value) {
-        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-        var destination = this.destination;
-        var windowSize = this.windowSize;
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len && !this.closed; i++) {
-            windows[i].next(value);
-        }
-        var c = this.count - windowSize + 1;
-        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-            windows.shift().complete();
-        }
-        if (++this.count % startWindowEvery === 0 && !this.closed) {
-            var window_1 = new Subject_1.Subject();
-            windows.push(window_1);
-            destination.next(window_1);
-        }
-    };
-    WindowCountSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().error(err);
-            }
-        }
-        this.destination.error(err);
-    };
-    WindowCountSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowCountSubscriber.prototype._unsubscribe = function () {
-        this.count = 0;
-        this.windows = null;
-    };
-    return WindowCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subject":53,"../Subscriber":55}],183:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function windowTime(windowTimeSpan) {
-    var scheduler = async_1.async;
-    var windowCreationInterval = null;
-    var maxWindowSize = Number.POSITIVE_INFINITY;
-    if (isScheduler_1.isScheduler(arguments[3])) {
-        scheduler = arguments[3];
-    }
-    if (isScheduler_1.isScheduler(arguments[2])) {
-        scheduler = arguments[2];
-    }
-    else if (isNumeric_1.isNumeric(arguments[2])) {
-        maxWindowSize = arguments[2];
-    }
-    if (isScheduler_1.isScheduler(arguments[1])) {
-        scheduler = arguments[1];
-    }
-    else if (isNumeric_1.isNumeric(arguments[1])) {
-        windowCreationInterval = arguments[1];
-    }
-    return function windowTimeOperatorFunction(source) {
-        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-    };
-}
-exports.windowTime = windowTime;
-var WindowTimeOperator = (function () {
-    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-    }
-    WindowTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-    };
-    return WindowTimeOperator;
-}());
-var CountedSubject = (function (_super) {
-    __extends(CountedSubject, _super);
-    function CountedSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._numberOfNextedValues = 0;
-        return _this;
-    }
-    CountedSubject.prototype.next = function (value) {
-        this._numberOfNextedValues++;
-        _super.prototype.next.call(this, value);
-    };
-    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
-        get: function () {
-            return this._numberOfNextedValues;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return CountedSubject;
-}(Subject_1.Subject));
-var WindowTimeSubscriber = (function (_super) {
-    __extends(WindowTimeSubscriber, _super);
-    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowTimeSpan = windowTimeSpan;
-        _this.windowCreationInterval = windowCreationInterval;
-        _this.maxWindowSize = maxWindowSize;
-        _this.scheduler = scheduler;
-        _this.windows = [];
-        var window = _this.openWindow();
-        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-            var closeState = { subscriber: _this, window: window, context: null };
-            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-        }
-        else {
-            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
-            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-        }
-        return _this;
-    }
-    WindowTimeSubscriber.prototype._next = function (value) {
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len; i++) {
-            var window_1 = windows[i];
-            if (!window_1.closed) {
-                window_1.next(value);
-                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
-                    this.closeWindow(window_1);
-                }
-            }
-        }
-    };
-    WindowTimeSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            windows.shift().error(err);
-        }
-        this.destination.error(err);
-    };
-    WindowTimeSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            var window_2 = windows.shift();
-            if (!window_2.closed) {
-                window_2.complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowTimeSubscriber.prototype.openWindow = function () {
-        var window = new CountedSubject();
-        this.windows.push(window);
-        var destination = this.destination;
-        destination.next(window);
-        return window;
-    };
-    WindowTimeSubscriber.prototype.closeWindow = function (window) {
-        window.complete();
-        var windows = this.windows;
-        windows.splice(windows.indexOf(window), 1);
-    };
-    return WindowTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchWindowTimeSpanOnly(state) {
-    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
-    if (window) {
-        subscriber.closeWindow(window);
-    }
-    state.window = subscriber.openWindow();
-    this.schedule(state, windowTimeSpan);
-}
-function dispatchWindowCreation(state) {
-    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
-    var window = subscriber.openWindow();
-    var action = this;
-    var context = { action: action, subscription: null };
-    var timeSpanState = { subscriber: subscriber, window: window, context: context };
-    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-    action.add(context.subscription);
-    action.schedule(state, windowCreationInterval);
-}
-function dispatchWindowClose(state) {
-    var subscriber = state.subscriber, window = state.window, context = state.context;
-    if (context && context.action && context.subscription) {
-        context.action.remove(context.subscription);
-    }
-    subscriber.closeWindow(window);
-}
-
-},{"../Subject":53,"../Subscriber":55,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],184:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Subscription_1 = require("../Subscription");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowToggle(openings, closingSelector) {
-    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
-}
-exports.windowToggle = windowToggle;
-var WindowToggleOperator = (function () {
-    function WindowToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    WindowToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return WindowToggleOperator;
-}());
-var WindowToggleSubscriber = (function (_super) {
-    __extends(WindowToggleSubscriber, _super);
-    function WindowToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
-        return _this;
-    }
-    WindowToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        if (contexts) {
-            var len = contexts.length;
-            for (var i = 0; i < len; i++) {
-                contexts[i].window.next(value);
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_1 = contexts[index];
-                context_1.window.error(err);
-                context_1.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._error.call(this, err);
-    };
-    WindowToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_2 = contexts[index];
-                context_2.window.complete();
-                context_2.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    WindowToggleSubscriber.prototype._unsubscribe = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_3 = contexts[index];
-                context_3.window.unsubscribe();
-                context_3.subscription.unsubscribe();
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (outerValue === this.openings) {
-            var closingNotifier = void 0;
-            try {
-                var closingSelector = this.closingSelector;
-                closingNotifier = closingSelector(innerValue);
-            }
-            catch (e) {
-                return this.error(e);
-            }
-            var window_1 = new Subject_1.Subject();
-            var subscription = new Subscription_1.Subscription();
-            var context_4 = { window: window_1, subscription: subscription };
-            this.contexts.push(context_4);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
-            if (innerSubscription.closed) {
-                this.closeWindow(this.contexts.length - 1);
-            }
-            else {
-                innerSubscription.context = context_4;
-                subscription.add(innerSubscription);
-            }
-            this.destination.next(window_1);
-        }
-        else {
-            this.closeWindow(this.contexts.indexOf(outerValue));
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyError = function (err) {
-        this.error(err);
-    };
-    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
-        if (inner !== this.openSubscription) {
-            this.closeWindow(this.contexts.indexOf(inner.context));
-        }
-    };
-    WindowToggleSubscriber.prototype.closeWindow = function (index) {
-        if (index === -1) {
-            return;
-        }
-        var contexts = this.contexts;
-        var context = contexts[index];
-        var window = context.window, subscription = context.subscription;
-        contexts.splice(index, 1);
-        window.complete();
-        subscription.unsubscribe();
-    };
-    return WindowToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subject":53,"../Subscription":56,"../util/subscribeToResult":239}],185:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowWhen(closingSelector) {
-    return function windowWhenOperatorFunction(source) {
-        return source.lift(new WindowOperator(closingSelector));
-    };
-}
-exports.windowWhen = windowWhen;
-var WindowOperator = (function () {
-    function WindowOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.closingSelector = closingSelector;
-        _this.openWindow();
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
-        if (this.closingNotification) {
-            this.closingNotification.unsubscribe();
-        }
-    };
-    WindowSubscriber.prototype.openWindow = function (innerSub) {
-        if (innerSub === void 0) { innerSub = null; }
-        if (innerSub) {
-            this.remove(innerSub);
-            innerSub.unsubscribe();
-        }
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var window = this.window = new Subject_1.Subject();
-        this.destination.next(window);
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (e) {
-            this.destination.error(e);
-            this.window.error(e);
-            return;
-        }
-        this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],186:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    return function (source) {
-        var project;
-        if (typeof args[args.length - 1] === 'function') {
-            project = args.pop();
-        }
-        var observables = args;
-        return source.lift(new WithLatestFromOperator(observables, project));
-    };
-}
-exports.withLatestFrom = withLatestFrom;
-var WithLatestFromOperator = (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.observables = observables;
-        _this.project = project;
-        _this.toRespond = [];
-        var len = observables.length;
-        _this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            _this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i));
-        }
-        return _this;
-    }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],187:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function zipOperatorFunction(source) {
-        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.zip = zip;
-
-},{"../observable/zip":85}],188:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zipAll(project) {
-    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
-}
-exports.zipAll = zipAll;
-
-},{"../observable/zip":85}],189:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function scheduleArray(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        var i = 0;
-        sub.add(scheduler.schedule(function () {
-            if (i === input.length) {
-                subscriber.complete();
-                return;
-            }
-            subscriber.next(input[i++]);
-            if (!subscriber.closed) {
-                sub.add(this.schedule());
-            }
-        }));
-        return sub;
-    });
-}
-exports.scheduleArray = scheduleArray;
-
-},{"../Observable":48,"../Subscription":56}],190:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var iterator_1 = require("../symbol/iterator");
-function scheduleIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        var iterator;
-        sub.add(function () {
-            if (iterator && typeof iterator.return === 'function') {
-                iterator.return();
-            }
-        });
-        sub.add(scheduler.schedule(function () {
-            iterator = input[iterator_1.iterator]();
-            sub.add(scheduler.schedule(function () {
-                if (subscriber.closed) {
-                    return;
-                }
-                var value;
-                var done;
-                try {
-                    var result = iterator.next();
-                    value = result.value;
-                    done = result.done;
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return;
-                }
-                if (done) {
-                    subscriber.complete();
-                }
-                else {
-                    subscriber.next(value);
-                    this.schedule();
-                }
-            }));
-        }));
-        return sub;
-    });
-}
-exports.scheduleIterable = scheduleIterable;
-
-},{"../Observable":48,"../Subscription":56,"../symbol/iterator":208}],191:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var observable_1 = require("../symbol/observable");
-function scheduleObservable(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        sub.add(scheduler.schedule(function () {
-            var observable = input[observable_1.observable]();
-            sub.add(observable.subscribe({
-                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
-                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
-                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
-            }));
-        }));
-        return sub;
-    });
-}
-exports.scheduleObservable = scheduleObservable;
-
-},{"../Observable":48,"../Subscription":56,"../symbol/observable":209}],192:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function schedulePromise(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        sub.add(scheduler.schedule(function () { return input.then(function (value) {
-            sub.add(scheduler.schedule(function () {
-                subscriber.next(value);
-                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
-            }));
-        }, function (err) {
-            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
-        }); }));
-        return sub;
-    });
-}
-exports.schedulePromise = schedulePromise;
-
-},{"../Observable":48,"../Subscription":56}],193:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var scheduleObservable_1 = require("./scheduleObservable");
-var schedulePromise_1 = require("./schedulePromise");
-var scheduleArray_1 = require("./scheduleArray");
-var scheduleIterable_1 = require("./scheduleIterable");
-var isInteropObservable_1 = require("../util/isInteropObservable");
-var isPromise_1 = require("../util/isPromise");
-var isArrayLike_1 = require("../util/isArrayLike");
-var isIterable_1 = require("../util/isIterable");
-function scheduled(input, scheduler) {
-    if (input != null) {
-        if (isInteropObservable_1.isInteropObservable(input)) {
-            return scheduleObservable_1.scheduleObservable(input, scheduler);
-        }
-        else if (isPromise_1.isPromise(input)) {
-            return schedulePromise_1.schedulePromise(input, scheduler);
-        }
-        else if (isArrayLike_1.isArrayLike(input)) {
-            return scheduleArray_1.scheduleArray(input, scheduler);
-        }
-        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
-            return scheduleIterable_1.scheduleIterable(input, scheduler);
-        }
-    }
-    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
-exports.scheduled = scheduled;
-
-},{"../util/isArrayLike":221,"../util/isInteropObservable":224,"../util/isIterable":225,"../util/isPromise":229,"./scheduleArray":189,"./scheduleIterable":190,"./scheduleObservable":191,"./schedulePromise":192}],194:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        return _super.call(this) || this;
-    }
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
-
-},{"../Subscription":56}],195:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AnimationFrameAction = (function (_super) {
-    __extends(AnimationFrameAction, _super);
-    function AnimationFrameAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
-    };
-    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            cancelAnimationFrame(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AnimationFrameAction;
-}(AsyncAction_1.AsyncAction));
-exports.AnimationFrameAction = AnimationFrameAction;
-
-},{"./AsyncAction":199}],196:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AnimationFrameScheduler = (function (_super) {
-    __extends(AnimationFrameScheduler, _super);
-    function AnimationFrameScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AnimationFrameScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AnimationFrameScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AnimationFrameScheduler = AnimationFrameScheduler;
-
-},{"./AsyncScheduler":200}],197:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Immediate_1 = require("../util/Immediate");
-var AsyncAction_1 = require("./AsyncAction");
-var AsapAction = (function (_super) {
-    __extends(AsapAction, _super);
-    function AsapAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-    };
-    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            Immediate_1.Immediate.clearImmediate(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AsapAction;
-}(AsyncAction_1.AsyncAction));
-exports.AsapAction = AsapAction;
-
-},{"../util/Immediate":213,"./AsyncAction":199}],198:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AsapScheduler = (function (_super) {
-    __extends(AsapScheduler, _super);
-    function AsapScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AsapScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsapScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AsapScheduler = AsapScheduler;
-
-},{"./AsyncScheduler":200}],199:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Action_1 = require("./Action");
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.pending = false;
-        return _this;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        this.state = state;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.pending = true;
-        this.delay = delay;
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        clearInterval(id);
-        return undefined;
-    };
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
-
-},{"./Action":194}],200:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler_1 = require("../Scheduler");
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
-        var _this = _super.call(this, SchedulerAction, function () {
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
-                return AsyncScheduler.delegate.now();
-            }
-            else {
-                return now();
-            }
-        }) || this;
-        _this.actions = [];
-        _this.active = false;
-        _this.scheduled = undefined;
-        return _this;
-    }
-    AsyncScheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-            return AsyncScheduler.delegate.schedule(work, delay, state);
-        }
-        else {
-            return _super.prototype.schedule.call(this, work, delay, state);
-        }
-    };
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift());
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
-
-},{"../Scheduler":52}],201:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
-
-},{"./AsyncAction":199}],202:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
-
-},{"./AsyncScheduler":200}],203:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var VirtualTimeScheduler = (function (_super) {
-    __extends(VirtualTimeScheduler, _super);
-    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
-        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
-        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
-        _this.maxFrames = maxFrames;
-        _this.frame = 0;
-        _this.index = -1;
-        return _this;
-    }
-    VirtualTimeScheduler.prototype.flush = function () {
-        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
-        var error, action;
-        while ((action = actions[0]) && action.delay <= maxFrames) {
-            actions.shift();
-            this.frame = action.delay;
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        }
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    VirtualTimeScheduler.frameTimeFactor = 10;
-    return VirtualTimeScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.VirtualTimeScheduler = VirtualTimeScheduler;
-var VirtualAction = (function (_super) {
-    __extends(VirtualAction, _super);
-    function VirtualAction(scheduler, work, index) {
-        if (index === void 0) { index = scheduler.index += 1; }
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.index = index;
-        _this.active = true;
-        _this.index = scheduler.index = index;
-        return _this;
-    }
-    VirtualAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (!this.id) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.active = false;
-        var action = new VirtualAction(this.scheduler, this.work);
-        this.add(action);
-        return action.schedule(state, delay);
-    };
-    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.delay = scheduler.frame + delay;
-        var actions = scheduler.actions;
-        actions.push(this);
-        actions.sort(VirtualAction.sortActions);
-        return true;
-    };
-    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return undefined;
-    };
-    VirtualAction.prototype._execute = function (state, delay) {
-        if (this.active === true) {
-            return _super.prototype._execute.call(this, state, delay);
-        }
-    };
-    VirtualAction.sortActions = function (a, b) {
-        if (a.delay === b.delay) {
-            if (a.index === b.index) {
-                return 0;
-            }
-            else if (a.index > b.index) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        }
-        else if (a.delay > b.delay) {
-            return 1;
-        }
-        else {
-            return -1;
-        }
-    };
-    return VirtualAction;
-}(AsyncAction_1.AsyncAction));
-exports.VirtualAction = VirtualAction;
-
-},{"./AsyncAction":199,"./AsyncScheduler":200}],204:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AnimationFrameAction_1 = require("./AnimationFrameAction");
-var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
-exports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
-
-},{"./AnimationFrameAction":195,"./AnimationFrameScheduler":196}],205:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsapAction_1 = require("./AsapAction");
-var AsapScheduler_1 = require("./AsapScheduler");
-exports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
-
-},{"./AsapAction":197,"./AsapScheduler":198}],206:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
-
-},{"./AsyncAction":199,"./AsyncScheduler":200}],207:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var QueueAction_1 = require("./QueueAction");
-var QueueScheduler_1 = require("./QueueScheduler");
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
-
-},{"./QueueAction":201,"./QueueScheduler":202}],208:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function getSymbolIterator() {
-    if (typeof Symbol !== 'function' || !Symbol.iterator) {
-        return '@@iterator';
-    }
-    return Symbol.iterator;
-}
-exports.getSymbolIterator = getSymbolIterator;
-exports.iterator = getSymbolIterator();
-exports.$$iterator = exports.iterator;
-
-},{}],209:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
-
-},{}],210:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.rxSubscriber = (function () {
-    return typeof Symbol === 'function'
-        ? Symbol('rxSubscriber')
-        : '@@rxSubscriber_' + Math.random();
-})();
-exports.$$rxSubscriber = exports.rxSubscriber;
-
-},{}],211:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentOutOfRangeErrorImpl = (function () {
-    function ArgumentOutOfRangeErrorImpl() {
-        Error.call(this);
-        this.message = 'argument out of range';
-        this.name = 'ArgumentOutOfRangeError';
-        return this;
-    }
-    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-    return ArgumentOutOfRangeErrorImpl;
-})();
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-
-},{}],212:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyErrorImpl = (function () {
-    function EmptyErrorImpl() {
-        Error.call(this);
-        this.message = 'no elements in sequence';
-        this.name = 'EmptyError';
-        return this;
-    }
-    EmptyErrorImpl.prototype = Object.create(Error.prototype);
-    return EmptyErrorImpl;
-})();
-exports.EmptyError = EmptyErrorImpl;
-
-},{}],213:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var nextHandle = 1;
-var RESOLVED = (function () { return Promise.resolve(); })();
-var activeHandles = {};
-function findAndClearHandle(handle) {
-    if (handle in activeHandles) {
-        delete activeHandles[handle];
-        return true;
-    }
-    return false;
-}
-exports.Immediate = {
-    setImmediate: function (cb) {
-        var handle = nextHandle++;
-        activeHandles[handle] = true;
-        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
-        return handle;
-    },
-    clearImmediate: function (handle) {
-        findAndClearHandle(handle);
-    },
-};
-exports.TestTools = {
-    pending: function () {
-        return Object.keys(activeHandles).length;
-    }
-};
-
-},{}],214:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ObjectUnsubscribedErrorImpl = (function () {
-    function ObjectUnsubscribedErrorImpl() {
-        Error.call(this);
-        this.message = 'object unsubscribed';
-        this.name = 'ObjectUnsubscribedError';
-        return this;
-    }
-    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-    return ObjectUnsubscribedErrorImpl;
-})();
-exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-
-},{}],215:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var TimeoutErrorImpl = (function () {
-    function TimeoutErrorImpl() {
-        Error.call(this);
-        this.message = 'Timeout has occurred';
-        this.name = 'TimeoutError';
-        return this;
-    }
-    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-    return TimeoutErrorImpl;
-})();
-exports.TimeoutError = TimeoutErrorImpl;
-
-},{}],216:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnsubscriptionErrorImpl = (function () {
-    function UnsubscriptionErrorImpl(errors) {
-        Error.call(this);
-        this.message = errors ?
-            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
-        this.name = 'UnsubscriptionError';
-        this.errors = errors;
-        return this;
-    }
-    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-    return UnsubscriptionErrorImpl;
-})();
-exports.UnsubscriptionError = UnsubscriptionErrorImpl;
-
-},{}],217:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function canReportError(observer) {
-    while (observer) {
-        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
-        if (closed_1 || isStopped) {
-            return false;
-        }
-        else if (destination && destination instanceof Subscriber_1.Subscriber) {
-            observer = destination;
-        }
-        else {
-            observer = null;
-        }
-    }
-    return true;
-}
-exports.canReportError = canReportError;
-
-},{"../Subscriber":55}],218:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function hostReportError(err) {
-    setTimeout(function () { throw err; }, 0);
-}
-exports.hostReportError = hostReportError;
-
-},{}],219:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function identity(x) {
-    return x;
-}
-exports.identity = identity;
-
-},{}],220:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
-
-},{}],221:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
-
-},{}],222:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-exports.isDate = isDate;
-
-},{}],223:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
-
-},{}],224:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-function isInteropObservable(input) {
-    return input && typeof input[observable_1.observable] === 'function';
-}
-exports.isInteropObservable = isInteropObservable;
-
-},{"../symbol/observable":209}],225:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-function isIterable(input) {
-    return input && typeof input[iterator_1.iterator] === 'function';
-}
-exports.isIterable = isIterable;
-
-},{"../symbol/iterator":208}],226:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./isArray");
-function isNumeric(val) {
-    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-exports.isNumeric = isNumeric;
-
-},{"./isArray":220}],227:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isObject(x) {
-    return x !== null && typeof x === 'object';
-}
-exports.isObject = isObject;
-
-},{}],228:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function isObservable(obj) {
-    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
-exports.isObservable = isObservable;
-
-},{"../Observable":48}],229:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isPromise(value) {
-    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
-
-},{}],230:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
-
-},{}],231:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function noop() { }
-exports.noop = noop;
-
-},{}],232:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function not(pred, thisArg) {
-    function notPred() {
-        return !(notPred.pred.apply(notPred.thisArg, arguments));
-    }
-    notPred.pred = pred;
-    notPred.thisArg = thisArg;
-    return notPred;
-}
-exports.not = not;
-
-},{}],233:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var identity_1 = require("./identity");
-function pipe() {
-    var fns = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        fns[_i] = arguments[_i];
-    }
-    return pipeFromArray(fns);
-}
-exports.pipe = pipe;
-function pipeFromArray(fns) {
-    if (fns.length === 0) {
-        return identity_1.identity;
-    }
-    if (fns.length === 1) {
-        return fns[0];
-    }
-    return function piped(input) {
-        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
-    };
-}
-exports.pipeFromArray = pipeFromArray;
-
-},{"./identity":219}],234:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToArray_1 = require("./subscribeToArray");
-var subscribeToPromise_1 = require("./subscribeToPromise");
-var subscribeToIterable_1 = require("./subscribeToIterable");
-var subscribeToObservable_1 = require("./subscribeToObservable");
-var isArrayLike_1 = require("./isArrayLike");
-var isPromise_1 = require("./isPromise");
-var isObject_1 = require("./isObject");
-var iterator_1 = require("../symbol/iterator");
-var observable_1 = require("../symbol/observable");
-exports.subscribeTo = function (result) {
-    if (!!result && typeof result[observable_1.observable] === 'function') {
-        return subscribeToObservable_1.subscribeToObservable(result);
-    }
-    else if (isArrayLike_1.isArrayLike(result)) {
-        return subscribeToArray_1.subscribeToArray(result);
-    }
-    else if (isPromise_1.isPromise(result)) {
-        return subscribeToPromise_1.subscribeToPromise(result);
-    }
-    else if (!!result && typeof result[iterator_1.iterator] === 'function') {
-        return subscribeToIterable_1.subscribeToIterable(result);
-    }
-    else {
-        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
-        var msg = "You provided " + value + " where a stream was expected."
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        throw new TypeError(msg);
-    }
-};
-
-},{"../symbol/iterator":208,"../symbol/observable":209,"./isArrayLike":221,"./isObject":227,"./isPromise":229,"./subscribeToArray":235,"./subscribeToIterable":236,"./subscribeToObservable":237,"./subscribeToPromise":238}],235:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.subscribeToArray = function (array) { return function (subscriber) {
-    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-        subscriber.next(array[i]);
-    }
-    subscriber.complete();
-}; };
-
-},{}],236:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-exports.subscribeToIterable = function (iterable) { return function (subscriber) {
-    var iterator = iterable[iterator_1.iterator]();
-    do {
-        var item = iterator.next();
-        if (item.done) {
-            subscriber.complete();
-            break;
-        }
-        subscriber.next(item.value);
-        if (subscriber.closed) {
-            break;
-        }
-    } while (true);
-    if (typeof iterator.return === 'function') {
-        subscriber.add(function () {
-            if (iterator.return) {
-                iterator.return();
-            }
-        });
-    }
-    return subscriber;
-}; };
-
-},{"../symbol/iterator":208}],237:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-exports.subscribeToObservable = function (obj) { return function (subscriber) {
-    var obs = obj[observable_1.observable]();
-    if (typeof obs.subscribe !== 'function') {
-        throw new TypeError('Provided object does not correctly implement Symbol.observable');
-    }
-    else {
-        return obs.subscribe(subscriber);
-    }
-}; };
-
-},{"../symbol/observable":209}],238:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var hostReportError_1 = require("./hostReportError");
-exports.subscribeToPromise = function (promise) { return function (subscriber) {
-    promise.then(function (value) {
-        if (!subscriber.closed) {
-            subscriber.next(value);
-            subscriber.complete();
-        }
-    }, function (err) { return subscriber.error(err); })
-        .then(null, hostReportError_1.hostReportError);
-    return subscriber;
-}; };
-
-},{"./hostReportError":218}],239:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeTo_1 = require("./subscribeTo");
-var Observable_1 = require("../Observable");
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
-    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
-    if (innerSubscriber.closed) {
-        return undefined;
-    }
-    if (result instanceof Observable_1.Observable) {
-        return result.subscribe(innerSubscriber);
-    }
-    return subscribeTo_1.subscribeTo(result)(innerSubscriber);
-}
-exports.subscribeToResult = subscribeToResult;
-
-},{"../InnerSubscriber":46,"../Observable":48,"./subscribeTo":234}],240:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var rxSubscriber_1 = require("../symbol/rxSubscriber");
-var Observer_1 = require("../Observer");
-function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
-            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber_1.Subscriber(Observer_1.empty);
-    }
-    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-}
-exports.toSubscriber = toSubscriber;
-
-},{"../Observer":49,"../Subscriber":55,"../symbol/rxSubscriber":210}],241:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var audit_1 = require("../internal/operators/audit");
-exports.audit = audit_1.audit;
-var auditTime_1 = require("../internal/operators/auditTime");
-exports.auditTime = auditTime_1.auditTime;
-var buffer_1 = require("../internal/operators/buffer");
-exports.buffer = buffer_1.buffer;
-var bufferCount_1 = require("../internal/operators/bufferCount");
-exports.bufferCount = bufferCount_1.bufferCount;
-var bufferTime_1 = require("../internal/operators/bufferTime");
-exports.bufferTime = bufferTime_1.bufferTime;
-var bufferToggle_1 = require("../internal/operators/bufferToggle");
-exports.bufferToggle = bufferToggle_1.bufferToggle;
-var bufferWhen_1 = require("../internal/operators/bufferWhen");
-exports.bufferWhen = bufferWhen_1.bufferWhen;
-var catchError_1 = require("../internal/operators/catchError");
-exports.catchError = catchError_1.catchError;
-var combineAll_1 = require("../internal/operators/combineAll");
-exports.combineAll = combineAll_1.combineAll;
-var combineLatest_1 = require("../internal/operators/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("../internal/operators/concat");
-exports.concat = concat_1.concat;
-var concatAll_1 = require("../internal/operators/concatAll");
-exports.concatAll = concatAll_1.concatAll;
-var concatMap_1 = require("../internal/operators/concatMap");
-exports.concatMap = concatMap_1.concatMap;
-var concatMapTo_1 = require("../internal/operators/concatMapTo");
-exports.concatMapTo = concatMapTo_1.concatMapTo;
-var count_1 = require("../internal/operators/count");
-exports.count = count_1.count;
-var debounce_1 = require("../internal/operators/debounce");
-exports.debounce = debounce_1.debounce;
-var debounceTime_1 = require("../internal/operators/debounceTime");
-exports.debounceTime = debounceTime_1.debounceTime;
-var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
-exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
-var delay_1 = require("../internal/operators/delay");
-exports.delay = delay_1.delay;
-var delayWhen_1 = require("../internal/operators/delayWhen");
-exports.delayWhen = delayWhen_1.delayWhen;
-var dematerialize_1 = require("../internal/operators/dematerialize");
-exports.dematerialize = dematerialize_1.dematerialize;
-var distinct_1 = require("../internal/operators/distinct");
-exports.distinct = distinct_1.distinct;
-var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
-exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
-var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
-var elementAt_1 = require("../internal/operators/elementAt");
-exports.elementAt = elementAt_1.elementAt;
-var endWith_1 = require("../internal/operators/endWith");
-exports.endWith = endWith_1.endWith;
-var every_1 = require("../internal/operators/every");
-exports.every = every_1.every;
-var exhaust_1 = require("../internal/operators/exhaust");
-exports.exhaust = exhaust_1.exhaust;
-var exhaustMap_1 = require("../internal/operators/exhaustMap");
-exports.exhaustMap = exhaustMap_1.exhaustMap;
-var expand_1 = require("../internal/operators/expand");
-exports.expand = expand_1.expand;
-var filter_1 = require("../internal/operators/filter");
-exports.filter = filter_1.filter;
-var finalize_1 = require("../internal/operators/finalize");
-exports.finalize = finalize_1.finalize;
-var find_1 = require("../internal/operators/find");
-exports.find = find_1.find;
-var findIndex_1 = require("../internal/operators/findIndex");
-exports.findIndex = findIndex_1.findIndex;
-var first_1 = require("../internal/operators/first");
-exports.first = first_1.first;
-var groupBy_1 = require("../internal/operators/groupBy");
-exports.groupBy = groupBy_1.groupBy;
-var ignoreElements_1 = require("../internal/operators/ignoreElements");
-exports.ignoreElements = ignoreElements_1.ignoreElements;
-var isEmpty_1 = require("../internal/operators/isEmpty");
-exports.isEmpty = isEmpty_1.isEmpty;
-var last_1 = require("../internal/operators/last");
-exports.last = last_1.last;
-var map_1 = require("../internal/operators/map");
-exports.map = map_1.map;
-var mapTo_1 = require("../internal/operators/mapTo");
-exports.mapTo = mapTo_1.mapTo;
-var materialize_1 = require("../internal/operators/materialize");
-exports.materialize = materialize_1.materialize;
-var max_1 = require("../internal/operators/max");
-exports.max = max_1.max;
-var merge_1 = require("../internal/operators/merge");
-exports.merge = merge_1.merge;
-var mergeAll_1 = require("../internal/operators/mergeAll");
-exports.mergeAll = mergeAll_1.mergeAll;
-var mergeMap_1 = require("../internal/operators/mergeMap");
-exports.mergeMap = mergeMap_1.mergeMap;
-var mergeMap_2 = require("../internal/operators/mergeMap");
-exports.flatMap = mergeMap_2.mergeMap;
-var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
-exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
-var mergeScan_1 = require("../internal/operators/mergeScan");
-exports.mergeScan = mergeScan_1.mergeScan;
-var min_1 = require("../internal/operators/min");
-exports.min = min_1.min;
-var multicast_1 = require("../internal/operators/multicast");
-exports.multicast = multicast_1.multicast;
-var observeOn_1 = require("../internal/operators/observeOn");
-exports.observeOn = observeOn_1.observeOn;
-var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairwise_1 = require("../internal/operators/pairwise");
-exports.pairwise = pairwise_1.pairwise;
-var partition_1 = require("../internal/operators/partition");
-exports.partition = partition_1.partition;
-var pluck_1 = require("../internal/operators/pluck");
-exports.pluck = pluck_1.pluck;
-var publish_1 = require("../internal/operators/publish");
-exports.publish = publish_1.publish;
-var publishBehavior_1 = require("../internal/operators/publishBehavior");
-exports.publishBehavior = publishBehavior_1.publishBehavior;
-var publishLast_1 = require("../internal/operators/publishLast");
-exports.publishLast = publishLast_1.publishLast;
-var publishReplay_1 = require("../internal/operators/publishReplay");
-exports.publishReplay = publishReplay_1.publishReplay;
-var race_1 = require("../internal/operators/race");
-exports.race = race_1.race;
-var reduce_1 = require("../internal/operators/reduce");
-exports.reduce = reduce_1.reduce;
-var repeat_1 = require("../internal/operators/repeat");
-exports.repeat = repeat_1.repeat;
-var repeatWhen_1 = require("../internal/operators/repeatWhen");
-exports.repeatWhen = repeatWhen_1.repeatWhen;
-var retry_1 = require("../internal/operators/retry");
-exports.retry = retry_1.retry;
-var retryWhen_1 = require("../internal/operators/retryWhen");
-exports.retryWhen = retryWhen_1.retryWhen;
-var refCount_1 = require("../internal/operators/refCount");
-exports.refCount = refCount_1.refCount;
-var sample_1 = require("../internal/operators/sample");
-exports.sample = sample_1.sample;
-var sampleTime_1 = require("../internal/operators/sampleTime");
-exports.sampleTime = sampleTime_1.sampleTime;
-var scan_1 = require("../internal/operators/scan");
-exports.scan = scan_1.scan;
-var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
-exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
-var share_1 = require("../internal/operators/share");
-exports.share = share_1.share;
-var shareReplay_1 = require("../internal/operators/shareReplay");
-exports.shareReplay = shareReplay_1.shareReplay;
-var single_1 = require("../internal/operators/single");
-exports.single = single_1.single;
-var skip_1 = require("../internal/operators/skip");
-exports.skip = skip_1.skip;
-var skipLast_1 = require("../internal/operators/skipLast");
-exports.skipLast = skipLast_1.skipLast;
-var skipUntil_1 = require("../internal/operators/skipUntil");
-exports.skipUntil = skipUntil_1.skipUntil;
-var skipWhile_1 = require("../internal/operators/skipWhile");
-exports.skipWhile = skipWhile_1.skipWhile;
-var startWith_1 = require("../internal/operators/startWith");
-exports.startWith = startWith_1.startWith;
-var subscribeOn_1 = require("../internal/operators/subscribeOn");
-exports.subscribeOn = subscribeOn_1.subscribeOn;
-var switchAll_1 = require("../internal/operators/switchAll");
-exports.switchAll = switchAll_1.switchAll;
-var switchMap_1 = require("../internal/operators/switchMap");
-exports.switchMap = switchMap_1.switchMap;
-var switchMapTo_1 = require("../internal/operators/switchMapTo");
-exports.switchMapTo = switchMapTo_1.switchMapTo;
-var take_1 = require("../internal/operators/take");
-exports.take = take_1.take;
-var takeLast_1 = require("../internal/operators/takeLast");
-exports.takeLast = takeLast_1.takeLast;
-var takeUntil_1 = require("../internal/operators/takeUntil");
-exports.takeUntil = takeUntil_1.takeUntil;
-var takeWhile_1 = require("../internal/operators/takeWhile");
-exports.takeWhile = takeWhile_1.takeWhile;
-var tap_1 = require("../internal/operators/tap");
-exports.tap = tap_1.tap;
-var throttle_1 = require("../internal/operators/throttle");
-exports.throttle = throttle_1.throttle;
-var throttleTime_1 = require("../internal/operators/throttleTime");
-exports.throttleTime = throttleTime_1.throttleTime;
-var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
-exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
-var timeInterval_1 = require("../internal/operators/timeInterval");
-exports.timeInterval = timeInterval_1.timeInterval;
-var timeout_1 = require("../internal/operators/timeout");
-exports.timeout = timeout_1.timeout;
-var timeoutWith_1 = require("../internal/operators/timeoutWith");
-exports.timeoutWith = timeoutWith_1.timeoutWith;
-var timestamp_1 = require("../internal/operators/timestamp");
-exports.timestamp = timestamp_1.timestamp;
-var toArray_1 = require("../internal/operators/toArray");
-exports.toArray = toArray_1.toArray;
-var window_1 = require("../internal/operators/window");
-exports.window = window_1.window;
-var windowCount_1 = require("../internal/operators/windowCount");
-exports.windowCount = windowCount_1.windowCount;
-var windowTime_1 = require("../internal/operators/windowTime");
-exports.windowTime = windowTime_1.windowTime;
-var windowToggle_1 = require("../internal/operators/windowToggle");
-exports.windowToggle = windowToggle_1.windowToggle;
-var windowWhen_1 = require("../internal/operators/windowWhen");
-exports.windowWhen = windowWhen_1.windowWhen;
-var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
-exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
-var zip_1 = require("../internal/operators/zip");
-exports.zip = zip_1.zip;
-var zipAll_1 = require("../internal/operators/zipAll");
-exports.zipAll = zipAll_1.zipAll;
-
-},{"../internal/operators/audit":86,"../internal/operators/auditTime":87,"../internal/operators/buffer":88,"../internal/operators/bufferCount":89,"../internal/operators/bufferTime":90,"../internal/operators/bufferToggle":91,"../internal/operators/bufferWhen":92,"../internal/operators/catchError":93,"../internal/operators/combineAll":94,"../internal/operators/combineLatest":95,"../internal/operators/concat":96,"../internal/operators/concatAll":97,"../internal/operators/concatMap":98,"../internal/operators/concatMapTo":99,"../internal/operators/count":100,"../internal/operators/debounce":101,"../internal/operators/debounceTime":102,"../internal/operators/defaultIfEmpty":103,"../internal/operators/delay":104,"../internal/operators/delayWhen":105,"../internal/operators/dematerialize":106,"../internal/operators/distinct":107,"../internal/operators/distinctUntilChanged":108,"../internal/operators/distinctUntilKeyChanged":109,"../internal/operators/elementAt":110,"../internal/operators/endWith":111,"../internal/operators/every":112,"../internal/operators/exhaust":113,"../internal/operators/exhaustMap":114,"../internal/operators/expand":115,"../internal/operators/filter":116,"../internal/operators/finalize":117,"../internal/operators/find":118,"../internal/operators/findIndex":119,"../internal/operators/first":120,"../internal/operators/groupBy":121,"../internal/operators/ignoreElements":122,"../internal/operators/isEmpty":123,"../internal/operators/last":124,"../internal/operators/map":125,"../internal/operators/mapTo":126,"../internal/operators/materialize":127,"../internal/operators/max":128,"../internal/operators/merge":129,"../internal/operators/mergeAll":130,"../internal/operators/mergeMap":131,"../internal/operators/mergeMapTo":132,"../internal/operators/mergeScan":133,"../internal/operators/min":134,"../internal/operators/multicast":135,"../internal/operators/observeOn":136,"../internal/operators/onErrorResumeNext":137,"../internal/operators/pairwise":138,"../internal/operators/partition":139,"../internal/operators/pluck":140,"../internal/operators/publish":141,"../internal/operators/publishBehavior":142,"../internal/operators/publishLast":143,"../internal/operators/publishReplay":144,"../internal/operators/race":145,"../internal/operators/reduce":146,"../internal/operators/refCount":147,"../internal/operators/repeat":148,"../internal/operators/repeatWhen":149,"../internal/operators/retry":150,"../internal/operators/retryWhen":151,"../internal/operators/sample":152,"../internal/operators/sampleTime":153,"../internal/operators/scan":154,"../internal/operators/sequenceEqual":155,"../internal/operators/share":156,"../internal/operators/shareReplay":157,"../internal/operators/single":158,"../internal/operators/skip":159,"../internal/operators/skipLast":160,"../internal/operators/skipUntil":161,"../internal/operators/skipWhile":162,"../internal/operators/startWith":163,"../internal/operators/subscribeOn":164,"../internal/operators/switchAll":165,"../internal/operators/switchMap":166,"../internal/operators/switchMapTo":167,"../internal/operators/take":168,"../internal/operators/takeLast":169,"../internal/operators/takeUntil":170,"../internal/operators/takeWhile":171,"../internal/operators/tap":172,"../internal/operators/throttle":173,"../internal/operators/throttleTime":174,"../internal/operators/throwIfEmpty":175,"../internal/operators/timeInterval":176,"../internal/operators/timeout":177,"../internal/operators/timeoutWith":178,"../internal/operators/timestamp":179,"../internal/operators/toArray":180,"../internal/operators/window":181,"../internal/operators/windowCount":182,"../internal/operators/windowTime":183,"../internal/operators/windowToggle":184,"../internal/operators/windowWhen":185,"../internal/operators/withLatestFrom":186,"../internal/operators/zip":187,"../internal/operators/zipAll":188}],242:[function(require,module,exports){
-// threejs.org/license
-(function(k,ua){"object"===typeof exports&&"undefined"!==typeof module?ua(exports):"function"===typeof define&&define.amd?define(["exports"],ua):(k=k||self,ua(k.THREE={}))})(this,function(k){function ua(){}function v(a,b){this.x=a||0;this.y=b||0}function ya(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function W(a,b,c,d,e,f,g,h,l,m){Object.defineProperty(this,"id",{value:ej++});this.uuid=O.generateUUID();
-this.name="";this.image=void 0!==a?a:W.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:W.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.internalFormat=null;this.type=void 0!==h?h:1009;this.offset=new v(0,0);this.repeat=new v(1,1);this.center=new v(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ya;this.generateMipmaps=
-!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function R(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Ba(a,b,c){this.width=a;this.height=b;this.scissor=new R(0,0,a,b);this.scissorTest=!1;this.viewport=new R(0,0,a,b);c=c||{};this.texture=new W(void 0,c.mapping,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.texture.image={};this.texture.image.width=
-a;this.texture.image.height=b;this.texture.generateMipmaps=void 0!==c.generateMipmaps?c.generateMipmaps:!1;this.texture.minFilter=void 0!==c.minFilter?c.minFilter:1006;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Xf(a,b,c){Ba.call(this,a,b,c);this.samples=4}function va(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,b,
-c){this.x=a||0;this.y=b||0;this.z=c||0}function N(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Ub(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Ub.DefaultOrder}function De(){this.mask=1}function y(){Object.defineProperty(this,"id",{value:fj++});this.uuid=O.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=y.DefaultUp.clone();
-var a=new p,b=new Ub,c=new va,d=new p(1,1,1);b._onChange(function(){c.setFromEuler(b,!1)});c._onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:a},rotation:{configurable:!0,enumerable:!0,value:b},quaternion:{configurable:!0,enumerable:!0,value:c},scale:{configurable:!0,enumerable:!0,value:d},modelViewMatrix:{value:new N},normalMatrix:{value:new ya}});this.matrix=new N;this.matrixWorld=new N;this.matrixAutoUpdate=y.DefaultMatrixAutoUpdate;
-this.matrixWorldNeedsUpdate=!1;this.layers=new De;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function zc(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.environment=this.background=null;this.autoUpdate=!0;"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Va(a,b){this.min=void 0!==a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==
-b?b:new p(-Infinity,-Infinity,-Infinity)}function Yf(a,b,c,d,e){var f;var g=0;for(f=a.length-3;g<=f;g+=3){Vb.fromArray(a,g);var h=e.x*Math.abs(Vb.x)+e.y*Math.abs(Vb.y)+e.z*Math.abs(Vb.z),l=b.dot(Vb),m=c.dot(Vb),z=d.dot(Vb);if(Math.max(-Math.max(l,m,z),Math.min(l,m,z))>h)return!1}return!0}function eb(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:-1}function Wb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p(0,0,-1)}function Wa(a,b){this.normal=void 0!==a?a:new p(1,
-0,0);this.constant=void 0!==b?b:0}function pa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==b?b:new p;this.c=void 0!==c?c:new p}function D(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function Zf(a,b,c){0>c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:.5>c?b:c<2/3?a+6*(b-a)*(2/3-c):a}function $f(a){return.04045>a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}function ag(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}function Ac(a,b,c,d,e,f){this.a=a;this.b=
-b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new D;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function K(){Object.defineProperty(this,"id",{value:gj++});this.uuid=O.generateUUID();this.name="";this.type="Material";this.fog=!0;this.blending=1;this.side=0;this.vertexColors=this.flatShading=!1;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=
-this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.stencilWriteMask=255;this.stencilFunc=519;this.stencilRef=0;this.stencilFuncMask=255;this.stencilZPass=this.stencilZFail=this.stencilFail=7680;this.stencilWrite=!1;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=
-!1;this.toneMapped=this.visible=!0;this.userData={};this.version=0}function Pa(a){K.call(this);this.type="MeshBasicMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphTargets=this.skinning=!1;this.setValues(a)}
-function G(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function yd(a,b,c){G.call(this,new Int8Array(a),b,c)}function zd(a,b,c){G.call(this,new Uint8Array(a),b,c)}function Ad(a,b,c){G.call(this,new Uint8ClampedArray(a),b,c)}function Bd(a,b,c){G.call(this,new Int16Array(a),
-b,c)}function Xb(a,b,c){G.call(this,new Uint16Array(a),b,c)}function Cd(a,b,c){G.call(this,new Int32Array(a),b,c)}function Yb(a,b,c){G.call(this,new Uint32Array(a),b,c)}function B(a,b,c){G.call(this,new Float32Array(a),b,c)}function Dd(a,b,c){G.call(this,new Float64Array(a),b,c)}function rh(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=
-this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function sh(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function F(){Object.defineProperty(this,"id",{value:hj+=2});this.uuid=O.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.morphTargetsRelative=!1;this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};
-this.userData={}}function ea(a,b){y.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Pa;this.updateMorphTargets()}function th(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;Ee.copy(h);Ee.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(Ee);return b<c.near||b>c.far?null:{distance:b,point:Ee.clone(),object:a}}function Fe(a,b,c,d,e,f,g,h,l,m,z,n){Db.fromBufferAttribute(e,m);Eb.fromBufferAttribute(e,
-z);Fb.fromBufferAttribute(e,n);e=a.morphTargetInfluences;if(b.morphTargets&&f&&e){Ge.set(0,0,0);He.set(0,0,0);Ie.set(0,0,0);for(var t=0,r=f.length;t<r;t++){var k=e[t],u=f[t];0!==k&&(bg.fromBufferAttribute(u,m),cg.fromBufferAttribute(u,z),dg.fromBufferAttribute(u,n),g?(Ge.addScaledVector(bg,k),He.addScaledVector(cg,k),Ie.addScaledVector(dg,k)):(Ge.addScaledVector(bg.sub(Db),k),He.addScaledVector(cg.sub(Eb),k),Ie.addScaledVector(dg.sub(Fb),k)))}Db.add(Ge);Eb.add(He);Fb.add(Ie)}a.isSkinnedMesh&&(a.boneTransform(m,
-Db),a.boneTransform(z,Eb),a.boneTransform(n,Fb));if(a=th(a,b,c,d,Db,Eb,Fb,Ed))h&&(Bc.fromBufferAttribute(h,m),Cc.fromBufferAttribute(h,z),Dc.fromBufferAttribute(h,n),a.uv=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),l&&(Bc.fromBufferAttribute(l,m),Cc.fromBufferAttribute(l,z),Dc.fromBufferAttribute(l,n),a.uv2=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),h=new Ac(m,z,n),pa.getNormal(Db,Eb,Fb,h.normal),a.face=h;return a}function L(){Object.defineProperty(this,"id",{value:ij+=2});this.uuid=O.generateUUID();this.name=
-"";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Ec(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||
-e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}function wa(a){for(var b={},c=0;c<a.length;c++){var d=Ec(a[c]),e;for(e in d)b[e]=d[e]}return b}function Ca(a){K.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
-this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}
-function fb(){y.call(this);this.type="Camera";this.matrixWorldInverse=new N;this.projectionMatrix=new N;this.projectionMatrixInverse=new N}function P(a,b,c,d){fb.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function Fc(a,b,c){y.call(this);this.type="CubeCamera";if(!0!==c.isWebGLCubeRenderTarget)console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");
-else{this.renderTarget=c;var d=new P(90,1,a,b);d.layers=this.layers;d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new P(90,1,a,b);e.layers=this.layers;e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new P(90,1,a,b);f.layers=this.layers;f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new P(90,1,a,b);g.layers=this.layers;g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new P(90,1,a,b);h.layers=this.layers;h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);
-var l=new P(90,1,a,b);l.layers=this.layers;l.up.set(0,-1,0);l.lookAt(new p(0,0,-1));this.add(l);this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var m=a.xr.enabled,z=a.getRenderTarget();a.xr.enabled=!1;var r=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;a.setRenderTarget(c,0);a.render(b,d);a.setRenderTarget(c,1);a.render(b,e);a.setRenderTarget(c,2);a.render(b,f);a.setRenderTarget(c,3);a.render(b,g);a.setRenderTarget(c,4);a.render(b,h);c.texture.generateMipmaps=r;a.setRenderTarget(c,
-5);a.render(b,l);a.setRenderTarget(z);a.xr.enabled=m};this.clear=function(a,b,d,e){for(var f=a.getRenderTarget(),g=0;6>g;g++)a.setRenderTarget(c,g),a.clear(b,d,e);a.setRenderTarget(f)}}}function Zb(a,b,c){Number.isInteger(b)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),b=c);Ba.call(this,a,a,b)}function $b(a,b,c,d,e,f,g,h,l,m,z,n){W.call(this,null,f,g,h,l,m,d,e,z,n);this.image={data:a||null,width:b||1,height:c||1};this.magFilter=
-void 0!==l?l:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1;this.needsUpdate=!0}function Gc(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Wa,void 0!==b?b:new Wa,void 0!==c?c:new Wa,void 0!==d?d:new Wa,void 0!==e?e:new Wa,void 0!==f?f:new Wa]}function uh(){function a(e,f){!1!==c&&(d(e,f),b.requestAnimationFrame(a))}var b=null,c=!1,d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=
-a},setContext:function(a){b=a}}}function jj(a,b){function c(b,c){var d=b.array,e=b.usage,f=a.createBuffer();a.bindBuffer(c,f);a.bufferData(c,d,e);b.onUploadCallback();c=5126;d instanceof Float32Array?c=5126:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=5123:d instanceof Int16Array?c=5122:d instanceof Uint32Array?c=5125:d instanceof Int32Array?c=5124:d instanceof Int8Array?c=5120:d instanceof Uint8Array&&(c=
-5121);return{buffer:f,type:c,bytesPerElement:d.BYTES_PER_ELEMENT,version:b.version}}var d=b.isWebGL2,e=new WeakMap;return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return e.get(a)},remove:function(b){b.isInterleavedBufferAttribute&&(b=b.data);var c=e.get(b);c&&(a.deleteBuffer(c.buffer),e.delete(b))},update:function(b,g){b.isInterleavedBufferAttribute&&(b=b.data);var f=e.get(b);if(void 0===f)e.set(b,c(b,g));else if(f.version<b.version){var l=b.array,m=b.updateRange;a.bindBuffer(g,
-f.buffer);-1===m.count?a.bufferSubData(g,0,l):(d?a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l,m.offset,m.count):a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l.subarray(m.offset,m.offset+m.count)),m.count=-1);f.version=b.version}}}}function Fd(a,b,c,d){L.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ac(a,b,c,d));this.mergeVertices()}function ac(a,b,c,d){F.call(this);this.type="PlaneBufferGeometry";this.parameters=
-{width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,l=a/c,m=b/d,z=[],n=[],t=[],r=[];for(a=0;a<h;a++){var k=a*m-f;for(b=0;b<g;b++)n.push(b*l-e,-k,0),t.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,z.push(b+g*a,e,h),z.push(e,f,h);this.setIndex(z);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}
-function kj(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new D(0),g=0,h,l,m=null,z=0,n=null;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,k,u){d=d.background;k=a.xr;(k=k.getSession&&k.getSession())&&"additive"===k.environmentBlendMode&&(d=null);null===d?e(f,g):d&&d.isColor&&(e(d,1),u=!0);(a.autoClear||u)&&a.clear(a.autoClearColor,
-a.autoClearDepth,a.autoClearStencil);if(d&&(d.isCubeTexture||d.isWebGLCubeRenderTarget||306===d.mapping)){void 0===l&&(l=new ea(new Gd(1,1,1),new Ca({type:"BackgroundCubeMaterial",uniforms:Ec(gb.cube.uniforms),vertexShader:gb.cube.vertexShader,fragmentShader:gb.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),l.geometry.deleteAttribute("uv"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},Object.defineProperty(l.material,
-"envMap",{get:function(){return this.uniforms.envMap.value}}),c.update(l));u=d.isWebGLCubeRenderTarget?d.texture:d;l.material.uniforms.envMap.value=u;l.material.uniforms.flipEnvMap.value=u.isCubeTexture?-1:1;if(m!==d||z!==u.version||n!==a.toneMapping)l.material.needsUpdate=!0,m=d,z=u.version,n=a.toneMapping;b.unshift(l,l.geometry,l.material,0,0,null)}else if(d&&d.isTexture){void 0===h&&(h=new ea(new ac(2,2),new Ca({type:"BackgroundMaterial",uniforms:Ec(gb.background.uniforms),vertexShader:gb.background.vertexShader,
-fragmentShader:gb.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),c.update(h));h.material.uniforms.t2D.value=d;!0===d.matrixAutoUpdate&&d.updateMatrix();h.material.uniforms.uvTransform.value.copy(d.matrix);if(m!==d||z!==d.version||n!==a.toneMapping)h.material.needsUpdate=!0,m=d,z=d.version,n=a.toneMapping;b.unshift(h,h.geometry,h.material,0,0,null)}}}}
-function lj(a,b,c,d){var e=d.isWebGL2,f;this.setMode=function(a){f=a};this.render=function(b,d){a.drawArrays(f,b,d);c.update(d,f)};this.renderInstances=function(d,h,l,m){if(0!==m){if(e){d=a;var g="drawArraysInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),g="drawArraysInstancedANGLE",null===d){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}d[g](f,h,l,m);c.update(l,f,m)}}}function mj(a,b,c){function d(b){if("highp"===
-b){if(0<a.getShaderPrecisionFormat(35633,36338).precision&&0<a.getShaderPrecisionFormat(35632,36338).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(35633,36337).precision&&0<a.getShaderPrecisionFormat(35632,36337).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext||"undefined"!==typeof WebGL2ComputeRenderingContext&&a instanceof WebGL2ComputeRenderingContext,g=void 0!==c.precision?c.precision:"highp",
-h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(34930);var l=a.getParameter(35660),m=a.getParameter(3379),z=a.getParameter(34076),n=a.getParameter(34921),k=a.getParameter(36347),r=a.getParameter(36348),q=a.getParameter(36349),u=0<l,p=f||!!b.get("OES_texture_float"),x=u&&p,w=f?a.getParameter(36183):0;return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");
-return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:m,maxCubemapSize:z,maxAttributes:n,maxVertexUniforms:k,maxVaryings:r,maxFragmentUniforms:q,vertexTextures:u,floatFragmentTextures:p,floatVertexTextures:x,maxSamples:w}}function nj(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==
-f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;c.numIntersection=0;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Wa,l=new ya,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);
-e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,l,k,q,u){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var n=4*l,z=q.clippingState||null;m.value=z;z=b(c,k,n,u);for(c=0;c!==n;++c)z[c]=d[c];q.clippingState=z;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function oj(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||
-a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;
-case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function pj(a,b,c){function d(a){var e=a.target;a=f.get(e);null!==a.index&&b.remove(a.index);for(var h in a.attributes)b.remove(a.attributes[h]);e.removeEventListener("dispose",d);f.delete(e);if(h=g.get(a))b.remove(h),g.delete(a);
-c.memory.geometries--}function e(a){var c=[],d=a.index,e=a.attributes.position;if(null!==d){var f=d.array;d=d.version;e=0;for(var h=f.length;e<h;e+=3){var k=f[e+0],q=f[e+1],u=f[e+2];c.push(k,q,q,u,u,k)}}else for(f=e.array,d=e.version,e=0,h=f.length/3-1;e<h;e+=3)k=e+0,q=e+1,u=e+2,c.push(k,q,q,u,u,k);c=new (65535<sh(c)?Yb:Xb)(c,1);c.version=d;b.update(c,34963);(f=g.get(a))&&b.remove(f);g.set(a,c)}var f=new WeakMap,g=new WeakMap;return{get:function(a,b){var e=f.get(b);if(e)return e;b.addEventListener("dispose",
-d);b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new F).setFromObject(a)),e=b._bufferGeometry);f.set(b,e);c.memory.geometries++;return e},update:function(a){var c=a.index,d=a.attributes;null!==c&&b.update(c,34963);for(var e in d)b.update(d[e],34962);a=a.morphAttributes;for(e in a){c=a[e];d=0;for(var f=c.length;d<f;d++)b.update(c[d],34962)}},getWireframeAttribute:function(a){var b=g.get(a);if(b){var c=a.index;null!==c&&b.version<c.version&&e(a)}else e(a);return g.get(a)}}}
-function qj(a,b,c,d){var e=d.isWebGL2,f,g,h;this.setMode=function(a){f=a};this.setIndex=function(a){g=a.type;h=a.bytesPerElement};this.render=function(b,d){a.drawElements(f,d,g,b*h);c.update(d,f)};this.renderInstances=function(d,m,z,n){if(0!==n){if(e){d=a;var l="drawElementsInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),l="drawElementsInstancedANGLE",null===d){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
-return}d[l](f,z,g,m*h,n);c.update(z,f,n)}}}function rj(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(a,d,e){e=e||1;b.calls++;switch(d){case 4:b.triangles+=a/3*e;break;case 1:b.lines+=a/2*e;break;case 3:b.lines+=e*(a-1);break;case 2:b.lines+=e*a;break;case 0:b.points+=e*a;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",
-d)}}}}function sj(a,b){return Math.abs(b[1])-Math.abs(a[1])}function tj(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,l=void 0===h?0:h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<l;m++)d[m]=[m,0];b[e.id]=d}var z=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<l;m++){var n=d[m];0!==n[1]&&(z&&e.deleteAttribute("morphTarget"+m),f&&e.deleteAttribute("morphNormal"+m))}for(m=0;m<l;m++)n=d[m],n[0]=m,
-n[1]=h[m];d.sort(sj);for(m=h=0;8>m;m++){if(n=d[m])if(l=n[0],n=n[1]){z&&e.setAttribute("morphTarget"+m,z[l]);f&&e.setAttribute("morphNormal"+m,f[l]);c[m]=n;h+=n;continue}c[m]=0}e=e.morphTargetsRelative?1:1-h;g.getUniforms().setValue(a,"morphTargetBaseInfluence",e);g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function uj(a,b,c,d){var e=new WeakMap;return{update:function(a){var f=d.render.frame,h=a.geometry,l=b.get(a,h);e.get(l)!==f&&(h.isGeometry&&l.updateFromObject(a),b.update(l),e.set(l,
-f));a.isInstancedMesh&&c.update(a.instanceMatrix,34962);return l},dispose:function(){e=new WeakMap}}}function qb(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];W.call(this,a,void 0!==b?b:301,c,d,e,f,void 0!==g?g:1022,h,l,m);this.flipY=!1}function Hc(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Ic(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||
-1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Jc(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=vh[e];void 0===f&&(f=new Float32Array(e),vh[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function Qa(a,b){if(a.length!==b.length)return!1;for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;return!0}function Ja(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function wh(a,
-b){var c=xh[b];void 0===c&&(c=new Int32Array(b),xh[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocateTextureUnit();return c}function vj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function wj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else Qa(c,b)||(a.uniform2fv(this.addr,b),Ja(c,b))}function xj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,
-c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else Qa(c,b)||(a.uniform3fv(this.addr,b),Ja(c,b))}function yj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else Qa(c,b)||(a.uniform4fv(this.addr,b),Ja(c,b))}function zj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix2fv(this.addr,
-!1,b),Ja(c,b)):Qa(c,d)||(yh.set(d),a.uniformMatrix2fv(this.addr,!1,yh),Ja(c,d))}function Aj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(zh.set(d),a.uniformMatrix3fv(this.addr,!1,zh),Ja(c,d))}function Bj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(Ah.set(d),a.uniformMatrix4fv(this.addr,!1,Ah),Ja(c,d))}function Cj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==
-e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTexture2D(b||Bh,e)}function Dj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2DArray(b||Ej,e)}function Fj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture3D(b||Gj,e)}function Hj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTextureCube(b||Ch,e)}function Ij(a,b){var c=this.cache;c[0]!==
-b&&(a.uniform1i(this.addr,b),c[0]=b)}function Jj(a,b){var c=this.cache;Qa(c,b)||(a.uniform2iv(this.addr,b),Ja(c,b))}function Kj(a,b){var c=this.cache;Qa(c,b)||(a.uniform3iv(this.addr,b),Ja(c,b))}function Lj(a,b){var c=this.cache;Qa(c,b)||(a.uniform4iv(this.addr,b),Ja(c,b))}function Mj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1ui(this.addr,b),c[0]=b)}function Nj(a){switch(a){case 5126:return vj;case 35664:return wj;case 35665:return xj;case 35666:return yj;case 35674:return zj;case 35675:return Aj;
-case 35676:return Bj;case 5124:case 35670:return Ij;case 35667:case 35671:return Jj;case 35668:case 35672:return Kj;case 35669:case 35673:return Lj;case 5125:return Mj;case 35678:case 36198:case 36298:case 36306:case 35682:return Cj;case 35679:case 36299:case 36307:return Fj;case 35680:case 36300:case 36308:case 36293:return Hj;case 36289:case 36303:case 36311:case 36292:return Dj}}function Oj(a,b){a.uniform1fv(this.addr,b)}function Pj(a,b){a.uniform1iv(this.addr,b)}function Qj(a,b){a.uniform2iv(this.addr,
-b)}function Rj(a,b){a.uniform3iv(this.addr,b)}function Sj(a,b){a.uniform4iv(this.addr,b)}function Tj(a,b){b=Jc(b,this.size,2);a.uniform2fv(this.addr,b)}function Uj(a,b){b=Jc(b,this.size,3);a.uniform3fv(this.addr,b)}function Vj(a,b){b=Jc(b,this.size,4);a.uniform4fv(this.addr,b)}function Wj(a,b){b=Jc(b,this.size,4);a.uniformMatrix2fv(this.addr,!1,b)}function Xj(a,b){b=Jc(b,this.size,9);a.uniformMatrix3fv(this.addr,!1,b)}function Yj(a,b){b=Jc(b,this.size,16);a.uniformMatrix4fv(this.addr,!1,b)}function Zj(a,
-b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTexture2D(b[a]||Bh,e[a])}function ak(a,b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTextureCube(b[a]||Ch,e[a])}function bk(a){switch(a){case 5126:return Oj;case 35664:return Tj;case 35665:return Uj;case 35666:return Vj;case 35674:return Wj;case 35675:return Xj;case 35676:return Yj;case 5124:case 35670:return Pj;case 35667:case 35671:return Qj;case 35668:case 35672:return Rj;case 35669:case 35673:return Sj;
-case 35678:case 36198:case 36298:case 36306:case 35682:return Zj;case 35680:case 36300:case 36308:case 36293:return ak}}function ck(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=Nj(b.type)}function Dh(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=bk(b.type)}function Eh(a){this.id=a;this.seq=[];this.map={}}function Gb(a,b){this.seq=[];this.map={};for(var c=a.getProgramParameter(b,35718),d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),
-g=this,h=e.name,l=h.length;for(eg.lastIndex=0;;){var m=eg.exec(h),z=eg.lastIndex,n=m[1],k=m[3];"]"===m[2]&&(n|=0);if(void 0===k||"["===k&&z+2===l){h=g;e=void 0===k?new ck(n,e,f):new Dh(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else k=g.map[n],void 0===k&&(k=new Eh(n),n=g,g=k,n.seq.push(g),n.map[g.id]=g),g=k}}}function Fh(a,b,c){b=a.createShader(b);a.shaderSource(b,c);a.compileShader(b);return b}function Gh(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE",
-"( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:throw Error("unsupported encoding: "+a);}}function Hh(a,b,c){var d=a.getShaderParameter(b,35713),e=a.getShaderInfoLog(b).trim();if(d&&""===e)return"";a=a.getShaderSource(b).split("\n");for(b=0;b<a.length;b++)a[b]=b+1+": "+a[b];a=a.join("\n");return"THREE.WebGLShader: gl.getShaderInfoLog() "+
-c+"\n"+e+a}function Hd(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function dk(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function ek(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;case 5:b="ACESFilmic";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function fk(a){var b=
-[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function Id(a){return""!==a}function Ih(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,b.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,b.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,
-b.numPointLightShadows)}function Jh(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-b.numClipIntersection)}function fg(a,b){a=M[b];if(void 0===a)throw Error("Can not resolve #include <"+b+">");return a.replace(gg,fg)}function Kh(a,b,c,d){console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.");return hg(a,b,c,d)}function hg(a,b,c,d){a="";for(b=parseInt(b);b<
-parseInt(c);b++)a+=d.replace(/\[ i \]/g,"[ "+b+" ]").replace(/UNROLLED_LOOP_INDEX/g,b);return a}function Lh(a){var b="precision "+a.precision+" float;\nprecision "+a.precision+" int;";"highp"===a.precision?b+="\n#define HIGH_PRECISION":"mediump"===a.precision?b+="\n#define MEDIUM_PRECISION":"lowp"===a.precision&&(b+="\n#define LOW_PRECISION");return b}function gk(a){var b="SHADOWMAP_TYPE_BASIC";1===a.shadowMapType?b="SHADOWMAP_TYPE_PCF":2===a.shadowMapType?b="SHADOWMAP_TYPE_PCF_SOFT":3===a.shadowMapType&&
-(b="SHADOWMAP_TYPE_VSM");return b}function hk(a){var b="ENVMAP_TYPE_CUBE";if(a.envMap)switch(a.envMapMode){case 301:case 302:b="ENVMAP_TYPE_CUBE";break;case 306:case 307:b="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:b="ENVMAP_TYPE_EQUIREC";break;case 305:b="ENVMAP_TYPE_SPHERE"}return b}function ik(a){var b="ENVMAP_MODE_REFLECTION";if(a.envMap)switch(a.envMapMode){case 302:case 304:b="ENVMAP_MODE_REFRACTION"}return b}function jk(a){var b="ENVMAP_BLENDING_NONE";if(a.envMap)switch(a.combine){case 0:b=
-"ENVMAP_BLENDING_MULTIPLY";break;case 1:b="ENVMAP_BLENDING_MIX";break;case 2:b="ENVMAP_BLENDING_ADD"}return b}function kk(a,b,c){var d=a.getContext(),e=c.defines,f=c.vertexShader,g=c.fragmentShader,h=gk(c),l=hk(c),m=ik(c),z=jk(c),n=0<a.gammaFactor?a.gammaFactor:1,k=c.isWebGL2?"":[c.extensionDerivatives||c.envMapCubeUV||c.bumpMap||c.tangentSpaceNormalMap||c.clearcoatNormalMap||c.flatShading||"physical"===c.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(c.extensionFragDepth||c.logarithmicDepthBuffer)&&
-c.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",c.extensionDrawBuffers&&c.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Id).join("\n"),r=fk(e),q=d.createProgram();c.isRawShaderMaterial?(e=[r].filter(Id).join("\n"),0<e.length&&(e+="\n"),h=[k,r].filter(Id).join("\n"),0<h.length&&(h+="\n")):(e=[Lh(c),"#define SHADER_NAME "+
-c.shaderName,r,c.instancing?"#define USE_INSTANCING":"",c.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+n,"#define MAX_BONES "+c.maxBones,c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+m:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":
-"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.displacementMap&&c.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":
-"",c.alphaMap?"#define USE_ALPHAMAP":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.flatShading?"#define FLAT_SHADED":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals&&!1===c.flatShading?"#define USE_MORPHNORMALS":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":
-"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING",
-" attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;",
-"\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Id).join("\n"),h=[k,Lh(c),"#define SHADER_NAME "+c.shaderName,r,c.alphaTest?"#define ALPHATEST "+c.alphaTest+(c.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+n,c.useFog&&c.fog?"#define USE_FOG":
-"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.matcap?"#define USE_MATCAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+l:"",c.envMap?"#define "+m:"",c.envMap?"#define "+z:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?
-"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":"",c.alphaMap?"#define USE_ALPHAMAP":"",c.sheen?"#define USE_SHEEN":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":
-"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.gradientMap?"#define USE_GRADIENTMAP":"",c.flatShading?"#define FLAT_SHADED":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",c.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?
-"#define USE_LOGDEPTHBUF_EXT":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==c.toneMapping?"#define TONE_MAPPING":"",0!==c.toneMapping?M.tonemapping_pars_fragment:"",0!==c.toneMapping?ek("toneMapping",c.toneMapping):"",c.dithering?"#define DITHERING":"",c.outputEncoding||c.mapEncoding||c.matcapEncoding||c.envMapEncoding||c.emissiveMapEncoding||
-c.lightMapEncoding?M.encodings_pars_fragment:"",c.mapEncoding?Hd("mapTexelToLinear",c.mapEncoding):"",c.matcapEncoding?Hd("matcapTexelToLinear",c.matcapEncoding):"",c.envMapEncoding?Hd("envMapTexelToLinear",c.envMapEncoding):"",c.emissiveMapEncoding?Hd("emissiveMapTexelToLinear",c.emissiveMapEncoding):"",c.lightMapEncoding?Hd("lightMapTexelToLinear",c.lightMapEncoding):"",c.outputEncoding?dk("linearToOutputTexel",c.outputEncoding):"",c.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(Id).join("\n"));
-f=f.replace(gg,fg);f=Ih(f,c);f=Jh(f,c);g=g.replace(gg,fg);g=Ih(g,c);g=Jh(g,c);f=f.replace(Mh,hg).replace(Nh,Kh);g=g.replace(Mh,hg).replace(Nh,Kh);c.isWebGL2&&!c.isRawShaderMaterial&&(l=!1,m=/^\s*#version\s+300\s+es\s*\n/,c.isShaderMaterial&&null!==f.match(m)&&null!==g.match(m)&&(l=!0,f=f.replace(m,""),g=g.replace(m,"")),e="#version 300 es\n\n#define attribute in\n#define varying out\n#define texture2D texture\n"+e,h=["#version 300 es\n\n#define varying in",l?"":"out highp vec4 pc_fragColor;",l?"":
-"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+h);g=h+g;f=Fh(d,35633,e+f);g=Fh(d,35632,g);d.attachShader(q,f);d.attachShader(q,
-g);void 0!==c.index0AttributeName?d.bindAttribLocation(q,0,c.index0AttributeName):!0===c.morphTargets&&d.bindAttribLocation(q,0,"position");d.linkProgram(q);if(a.debug.checkShaderErrors){a=d.getProgramInfoLog(q).trim();l=d.getShaderInfoLog(f).trim();m=d.getShaderInfoLog(g).trim();n=z=!0;if(!1===d.getProgramParameter(q,35714))z=!1,k=Hh(d,f,"vertex"),r=Hh(d,g,"fragment"),console.error("THREE.WebGLProgram: shader error: ",d.getError(),"35715",d.getProgramParameter(q,35715),"gl.getProgramInfoLog",a,k,
-r);else if(""!==a)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",a);else if(""===l||""===m)n=!1;n&&(this.diagnostics={runnable:z,programLog:a,vertexShader:{log:l,prefix:e},fragmentShader:{log:m,prefix:h}})}d.deleteShader(f);d.deleteShader(g);var u;this.getUniforms=function(){void 0===u&&(u=new Gb(d,q));return u};var p;this.getAttributes=function(){if(void 0===p){for(var a={},b=d.getProgramParameter(q,35721),c=0;c<b;c++){var e=d.getActiveAttrib(q,c).name;a[e]=d.getAttribLocation(q,e)}p=
-a}return p};this.destroy=function(){d.deleteProgram(q);this.program=void 0};this.name=c.shaderName;this.id=lk++;this.cacheKey=b;this.usedTimes=1;this.program=q;this.vertexShader=f;this.fragmentShader=g;return this}function mk(a,b,c){function d(a){if(a)a.isTexture?b=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),b=a.texture.encoding);else var b=3E3;return b}var e=[],f=c.isWebGL2,
-g=c.logarithmicDepthBuffer,h=c.floatVertexTextures,l=c.precision,m=c.maxVertexUniforms,z=c.vertexTextures,n={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},
-k="precision isWebGL2 supportsVertexTextures outputEncoding instancing map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding envMapCubeUV lightMap lightMapEncoding aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatMap clearcoatRoughnessMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents vertexUvs uvsVertexOnly fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights numDirLightShadows numPointLightShadows numSpotLightShadows shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
-this.getParameters=function(e,k,t,p,x,w,ja){var q=p.fog;p=e.isMeshStandardMaterial?p.environment:null;p=e.envMap||p;var r=n[e.type];if(ja.isSkinnedMesh){var u=ja.skeleton.bones;if(h)u=1024;else{var E=Math.min(Math.floor((m-20)/4),u.length);E<u.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+u.length+" bones. This GPU supports "+E+"."),u=0):u=E}}else u=0;null!==e.precision&&(l=c.getMaxPrecision(e.precision),l!==e.precision&&console.warn("THREE.WebGLProgram.getParameters:",e.precision,"not supported, using",
-l,"instead."));r?(E=gb[r],E={name:e.type,uniforms:Oh.clone(E.uniforms),vertexShader:E.vertexShader,fragmentShader:E.fragmentShader}):E={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};e.onBeforeCompile(E,a);var v=a.getRenderTarget();return{isWebGL2:f,shaderID:r,shaderName:E.name,uniforms:E.uniforms,vertexShader:E.vertexShader,fragmentShader:E.fragmentShader,defines:e.defines,isRawShaderMaterial:e.isRawShaderMaterial,isShaderMaterial:e.isShaderMaterial,
-precision:l,instancing:!0===ja.isInstancedMesh,supportsVertexTextures:z,outputEncoding:null!==v?d(v.texture):a.outputEncoding,map:!!e.map,mapEncoding:d(e.map),matcap:!!e.matcap,matcapEncoding:d(e.matcap),envMap:!!p,envMapMode:p&&p.mapping,envMapEncoding:d(p),envMapCubeUV:!!p&&(306===p.mapping||307===p.mapping),lightMap:!!e.lightMap,lightMapEncoding:d(e.lightMap),aoMap:!!e.aoMap,emissiveMap:!!e.emissiveMap,emissiveMapEncoding:d(e.emissiveMap),bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,objectSpaceNormalMap:1===
-e.normalMapType,tangentSpaceNormalMap:0===e.normalMapType,clearcoatMap:!!e.clearcoatMap,clearcoatRoughnessMap:!!e.clearcoatRoughnessMap,clearcoatNormalMap:!!e.clearcoatNormalMap,displacementMap:!!e.displacementMap,roughnessMap:!!e.roughnessMap,metalnessMap:!!e.metalnessMap,specularMap:!!e.specularMap,alphaMap:!!e.alphaMap,gradientMap:!!e.gradientMap,sheen:!!e.sheen,combine:e.combine,vertexTangents:e.normalMap&&e.vertexTangents,vertexColors:e.vertexColors,vertexUvs:!!e.map||!!e.bumpMap||!!e.normalMap||
-!!e.specularMap||!!e.alphaMap||!!e.emissiveMap||!!e.roughnessMap||!!e.metalnessMap||!!e.clearcoatMap||!!e.clearcoatRoughnessMap||!!e.clearcoatNormalMap||!!e.displacementMap,uvsVertexOnly:!(e.map||e.bumpMap||e.normalMap||e.specularMap||e.alphaMap||e.emissiveMap||e.roughnessMap||e.metalnessMap||e.clearcoatNormalMap)&&!!e.displacementMap,fog:!!q,useFog:e.fog,fogExp2:q&&q.isFogExp2,flatShading:e.flatShading,sizeAttenuation:e.sizeAttenuation,logarithmicDepthBuffer:g,skinning:e.skinning&&0<u,maxBones:u,
-useVertexTexture:h,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:k.directional.length,numPointLights:k.point.length,numSpotLights:k.spot.length,numRectAreaLights:k.rectArea.length,numHemiLights:k.hemi.length,numDirLightShadows:k.directionalShadowMap.length,numPointLightShadows:k.pointShadowMap.length,numSpotLightShadows:k.spotShadowMap.length,numClippingPlanes:x,numClipIntersection:w,dithering:e.dithering,shadowMapEnabled:a.shadowMap.enabled&&
-0<t.length,shadowMapType:a.shadowMap.type,toneMapping:e.toneMapped?a.toneMapping:0,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:e.premultipliedAlpha,alphaTest:e.alphaTest,doubleSided:2===e.side,flipSided:1===e.side,depthPacking:void 0!==e.depthPacking?e.depthPacking:!1,index0AttributeName:e.index0AttributeName,extensionDerivatives:e.extensions&&e.extensions.derivatives,extensionFragDepth:e.extensions&&e.extensions.fragDepth,extensionDrawBuffers:e.extensions&&e.extensions.drawBuffers,
-extensionShaderTextureLOD:e.extensions&&e.extensions.shaderTextureLOD,rendererExtensionFragDepth:f||null!==b.get("EXT_frag_depth"),rendererExtensionDrawBuffers:f||null!==b.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:f||null!==b.get("EXT_shader_texture_lod"),onBeforeCompile:e.onBeforeCompile}};this.getProgramCacheKey=function(b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(b.fragmentShader),c.push(b.vertexShader));if(void 0!==b.defines)for(var d in b.defines)c.push(d),c.push(b.defines[d]);
-if(void 0===b.isRawShaderMaterial){for(d=0;d<k.length;d++)c.push(b[k[d]]);c.push(a.outputEncoding);c.push(a.gammaFactor)}c.push(b.onBeforeCompile.toString());return c.join()};this.acquireProgram=function(b,c){for(var d,f=0,g=e.length;f<g;f++){var h=e[f];if(h.cacheKey===c){d=h;++d.usedTimes;break}}void 0===d&&(d=new kk(a,c,b),e.push(d));return d};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function nk(){var a=new WeakMap;
-return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function ok(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function pk(a,b){return a.groupOrder!==b.groupOrder?
-a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Ph(){function a(a,d,e,m,z,n){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||f,groupOrder:m,renderOrder:a.renderOrder,z:z,group:n},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=z,g.group=n);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,
-init:function(){c=0;d.length=0;e.length=0},push:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).unshift(b)},finish:function(){for(var a=c,d=b.length;a<d;a++){var e=b[a];if(null===e.id)break;e.id=null;e.object=null;e.geometry=null;e.material=null;e.program=null;e.group=null}},sort:function(a,b){1<d.length&&d.sort(a||ok);1<e.length&&e.sort(b||pk)}}}function qk(){function a(c){c=c.target;c.removeEventListener("dispose",
-a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Ph;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Ph,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function rk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new p,color:new D};break;case "SpotLight":c={position:new p,direction:new p,color:new D,distance:0,
-coneCos:0,penumbraCos:0,decay:0};break;case "PointLight":c={position:new p,color:new D,distance:0,decay:0};break;case "HemisphereLight":c={direction:new p,skyColor:new D,groundColor:new D};break;case "RectAreaLight":c={color:new D,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function sk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={shadowBias:0,shadowRadius:1,shadowMapSize:new v};break;case "SpotLight":c={shadowBias:0,
-shadowRadius:1,shadowMapSize:new v};break;case "PointLight":c={shadowBias:0,shadowRadius:1,shadowMapSize:new v,shadowCameraNear:1,shadowCameraFar:1E3}}return a[b.id]=c}}}function tk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function uk(){for(var a=new rk,b=sk(),c={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],
-directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},d=0;9>d;d++)c.probe.push(new p);var e=new p,f=new N,g=new N;return{setup:function(d,l,m){for(var h=0,n=0,k=0,r=0;9>r;r++)c.probe[r].set(0,0,0);var q=l=0,u=0,p=0,x=0,w=0,ja=0,T=0;m=m.matrixWorldInverse;d.sort(tk);r=0;for(var Z=d.length;r<Z;r++){var C=d[r],v=C.color,Q=C.intensity,Da=C.distance,Ka=C.shadow&&C.shadow.map?C.shadow.map.texture:
-null;if(C.isAmbientLight)h+=v.r*Q,n+=v.g*Q,k+=v.b*Q;else if(C.isLightProbe)for(Ka=0;9>Ka;Ka++)c.probe[Ka].addScaledVector(C.sh.coefficients[Ka],Q);else if(C.isDirectionalLight){var U=a.get(C);U.color.copy(C.color).multiplyScalar(C.intensity);U.direction.setFromMatrixPosition(C.matrixWorld);e.setFromMatrixPosition(C.target.matrixWorld);U.direction.sub(e);U.direction.transformDirection(m);C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.directionalShadow[l]=
-v,c.directionalShadowMap[l]=Ka,c.directionalShadowMatrix[l]=C.shadow.matrix,w++);c.directional[l]=U;l++}else C.isSpotLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(v).multiplyScalar(Q),U.distance=Da,U.direction.setFromMatrixPosition(C.matrixWorld),e.setFromMatrixPosition(C.target.matrixWorld),U.direction.sub(e),U.direction.transformDirection(m),U.coneCos=Math.cos(C.angle),U.penumbraCos=Math.cos(C.angle*(1-C.penumbra)),U.decay=C.decay,C.castShadow&&
-(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.spotShadow[u]=v,c.spotShadowMap[u]=Ka,c.spotShadowMatrix[u]=C.shadow.matrix,T++),c.spot[u]=U,u++):C.isRectAreaLight?(U=a.get(C),U.color.copy(v).multiplyScalar(Q),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),g.identity(),f.copy(C.matrixWorld),f.premultiply(m),g.extractRotation(f),U.halfWidth.set(.5*C.width,0,0),U.halfHeight.set(0,.5*C.height,0),U.halfWidth.applyMatrix4(g),U.halfHeight.applyMatrix4(g),
-c.rectArea[p]=U,p++):C.isPointLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(C.color).multiplyScalar(C.intensity),U.distance=C.distance,U.decay=C.decay,C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,v.shadowCameraNear=Q.camera.near,v.shadowCameraFar=Q.camera.far,c.pointShadow[q]=v,c.pointShadowMap[q]=Ka,c.pointShadowMatrix[q]=C.shadow.matrix,ja++),c.point[q]=U,q++):C.isHemisphereLight&&
-(U=a.get(C),U.direction.setFromMatrixPosition(C.matrixWorld),U.direction.transformDirection(m),U.direction.normalize(),U.skyColor.copy(C.color).multiplyScalar(Q),U.groundColor.copy(C.groundColor).multiplyScalar(Q),c.hemi[x]=U,x++)}c.ambient[0]=h;c.ambient[1]=n;c.ambient[2]=k;d=c.hash;if(d.directionalLength!==l||d.pointLength!==q||d.spotLength!==u||d.rectAreaLength!==p||d.hemiLength!==x||d.numDirectionalShadows!==w||d.numPointShadows!==ja||d.numSpotShadows!==T)c.directional.length=l,c.spot.length=
-u,c.rectArea.length=p,c.point.length=q,c.hemi.length=x,c.directionalShadow.length=w,c.directionalShadowMap.length=w,c.pointShadow.length=ja,c.pointShadowMap.length=ja,c.spotShadow.length=T,c.spotShadowMap.length=T,c.directionalShadowMatrix.length=w,c.pointShadowMatrix.length=ja,c.spotShadowMatrix.length=T,d.directionalLength=l,d.pointLength=q,d.spotLength=u,d.rectAreaLength=p,d.hemiLength=x,d.numDirectionalShadows=w,d.numPointShadows=ja,d.numSpotShadows=T,c.version=vk++},state:c}}function Qh(){var a=
-new uk,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},pushShadow:function(a){c.push(a)}}}function wk(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){if(!1===b.has(c)){var e=new Qh;b.set(c,new WeakMap);b.get(c).set(d,e);c.addEventListener("dispose",a)}else!1===b.get(c).has(d)?(e=new Qh,b.get(c).set(d,e)):
-e=b.get(c).get(d);return e},dispose:function(){b=new WeakMap}}}function Hb(a){K.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.fog=!1;this.setValues(a)}function Ib(a){K.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=
-!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.fog=!1;this.setValues(a)}function Rh(a,b,c){function d(a,b,c){c=a<<0|b<<1|c<<2;var d=n[c];void 0===d&&(d=new Hb({depthPacking:3201,morphTargets:a,skinning:b}),n[c]=d);return d}function e(a,b,c){c=a<<0|b<<1|c<<2;var d=k[c];void 0===d&&(d=new Ib({morphTargets:a,skinning:b}),k[c]=d);return d}function f(b,c,f,g,h,l,m){var n=d,k=b.customDepthMaterial;!0===g.isPointLight&&(n=e,k=b.customDistanceMaterial);
-void 0===k?(k=!1,!0===f.morphTargets&&(k=c.morphAttributes&&c.morphAttributes.position&&0<c.morphAttributes.position.length),c=!1,!0===b.isSkinnedMesh&&(!0===f.skinning?c=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b)),b=n(k,c,!0===b.isInstancedMesh)):b=k;a.localClippingEnabled&&!0===f.clipShadows&&0!==f.clippingPlanes.length&&(k=b.uuid,n=f.uuid,c=r[k],void 0===c&&(c={},r[k]=c),k=c[n],void 0===k&&(k=b.clone(),c[n]=k),b=k);b.visible=f.visible;b.wireframe=
-f.wireframe;b.side=3===m?null!==f.shadowSide?f.shadowSide:f.side:null!==f.shadowSide?f.shadowSide:q[f.side];b.clipShadows=f.clipShadows;b.clippingPlanes=f.clippingPlanes;b.clipIntersection=f.clipIntersection;b.wireframeLinewidth=f.wireframeLinewidth;b.linewidth=f.linewidth;!0===g.isPointLight&&!0===b.isMeshDistanceMaterial&&(b.referencePosition.setFromMatrixPosition(g.matrixWorld),b.nearDistance=h,b.farDistance=l);return b}function g(c,d,e,l,m){if(!1!==c.visible){if(c.layers.test(d.layers)&&(c.isMesh||
-c.isLine||c.isPoints)&&(c.castShadow||c.receiveShadow&&3===m)&&(!c.frustumCulled||h.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(e.matrixWorldInverse,c.matrixWorld);var n=b.update(c),k=c.material;if(Array.isArray(k))for(var z=n.groups,t=0,q=z.length;t<q;t++){var r=z[t],u=k[r.materialIndex];u&&u.visible&&(u=f(c,n,u,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,r))}else k.visible&&(u=f(c,n,k,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,null))}c=c.children;n=0;for(k=c.length;n<
-k;n++)g(c[n],d,e,l,m)}}var h=new Gc,l=new v,m=new v,z=new R,n=[],k=[],r={},q={0:1,1:0,2:2},u=new Ca({defines:{SAMPLE_RATE:.25,HALF_SAMPLE_RATE:.125},uniforms:{shadow_pass:{value:null},resolution:{value:new v},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = sqrt( squared_mean - mean * mean );\n  gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),
-p=u.clone();p.defines.HORIZONAL_PASS=1;var x=new F;x.setAttribute("position",new G(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var w=new ea(x,u),ja=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(d,e,f){if(!1!==ja.enabled&&(!1!==ja.autoUpdate||!1!==ja.needsUpdate)&&0!==d.length){var n=a.getRenderTarget(),k=a.getActiveCubeFace(),t=a.getActiveMipmapLevel(),q=a.state;q.setBlending(0);q.buffers.color.setClear(1,1,1,1);q.buffers.depth.setTest(!0);q.setScissorTest(!1);
-for(var r=0,E=d.length;r<E;r++){var x=d[r],C=x.shadow;if(void 0===C)console.warn("THREE.WebGLShadowMap:",x,"has no shadow.");else{l.copy(C.mapSize);var v=C.getFrameExtents();l.multiply(v);m.copy(C.mapSize);if(l.x>c||l.y>c)l.x>c&&(m.x=Math.floor(c/v.x),l.x=m.x*v.x,C.mapSize.x=m.x),l.y>c&&(m.y=Math.floor(c/v.y),l.y=m.y*v.y,C.mapSize.y=m.y);null!==C.map||C.isPointLightShadow||3!==this.type||(v={minFilter:1006,magFilter:1006,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",
-C.mapPass=new Ba(l.x,l.y,v),C.camera.updateProjectionMatrix());null===C.map&&(v={minFilter:1003,magFilter:1003,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",C.camera.updateProjectionMatrix());a.setRenderTarget(C.map);a.clear();v=C.getViewportCount();for(var Z=0;Z<v;Z++){var T=C.getViewport(Z);z.set(m.x*T.x,m.y*T.y,m.x*T.z,m.y*T.w);q.viewport(z);C.updateMatrices(x,Z);h=C.getFrustum();g(e,f,C.camera,x,this.type)}C.isPointLightShadow||3!==this.type||(x=C,C=f,v=b.update(w),
-u.uniforms.shadow_pass.value=x.map.texture,u.uniforms.resolution.value=x.mapSize,u.uniforms.radius.value=x.radius,a.setRenderTarget(x.mapPass),a.clear(),a.renderBufferDirect(C,null,v,u,w,null),p.uniforms.shadow_pass.value=x.mapPass.texture,p.uniforms.resolution.value=x.mapSize,p.uniforms.radius.value=x.radius,a.setRenderTarget(x.map),a.clear(),a.renderBufferDirect(C,null,v,p,w,null))}}ja.needsUpdate=!1;a.setRenderTarget(n,k,t)}}}function xk(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
-a.bindTexture(b,f);a.texParameteri(b,10241,9728);a.texParameteri(b,10240,9728);for(b=0;b<d;b++)a.texImage2D(c+b,0,6408,1,1,0,6408,5121,e);return f}function e(c,d){p[c]=1;0===x[c]&&(a.enableVertexAttribArray(c),x[c]=1);w[c]!==d&&((t?a:b.get("ANGLE_instanced_arrays"))[t?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](c,d),w[c]=d)}function f(b){!0!==v[b]&&(a.enable(b),v[b]=!0)}function g(b){!1!==v[b]&&(a.disable(b),v[b]=!1)}function h(b,c,d,e,h,l,m,n){if(0===b)Z&&(g(3042),Z=!1);else if(Z||(f(3042),
-Z=!0),5!==b){if(b!==C||n!==y){if(100!==B||100!==Ka)a.blendEquation(32774),Ka=B=100;if(n)switch(b){case 1:a.blendFuncSeparate(1,771,1,771);break;case 2:a.blendFunc(1,1);break;case 3:a.blendFuncSeparate(0,0,769,771);break;case 4:a.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",b)}else switch(b){case 1:a.blendFuncSeparate(770,771,1,771);break;case 2:a.blendFunc(770,1);break;case 3:a.blendFunc(0,769);break;case 4:a.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",
-b)}A=U=Da=Q=null;C=b;y=n}}else{h=h||c;l=l||d;m=m||e;if(c!==B||h!==Ka)a.blendEquationSeparate(xa[c],xa[h]),B=c,Ka=h;if(d!==Q||e!==Da||l!==U||m!==A)a.blendFuncSeparate(J[d],J[e],J[l],J[m]),Q=d,Da=e,U=l,A=m;C=b;y=null}}function l(b){D!==b&&(b?a.frontFace(2304):a.frontFace(2305),D=b)}function m(b){0!==b?(f(2884),b!==F&&(1===b?a.cullFace(1029):2===b?a.cullFace(1028):a.cullFace(1032))):g(2884);F=b}function k(b,c,d){if(b){if(f(32823),G!==c||K!==d)a.polygonOffset(c,d),G=c,K=d}else g(32823)}function n(b){void 0===
-b&&(b=33984+L-1);N!==b&&(a.activeTexture(b),N=b)}var t=c.isWebGL2,r=new function(){var b=!1,c=new R,d=null,e=new R(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},q=new function(){var b=!1,c=null,d=null,e=null;return{setTest:function(a){a?f(2929):g(2929)},setMask:function(d){c===
-d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(512);break;case 1:a.depthFunc(519);break;case 2:a.depthFunc(513);break;case 3:a.depthFunc(515);break;case 4:a.depthFunc(514);break;case 5:a.depthFunc(518);break;case 6:a.depthFunc(516);break;case 7:a.depthFunc(517);break;default:a.depthFunc(515)}else a.depthFunc(515);d=b}},setLocked:function(a){b=a},setClear:function(b){e!==b&&(a.clearDepth(b),e=b)},reset:function(){b=!1;e=d=c=null}}},u=new function(){var b=
-!1,c=null,d=null,e=null,h=null,l=null,m=null,n=null,k=null;return{setTest:function(a){b||(a?f(2960):g(2960))},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,f){if(d!==b||e!==c||h!==f)a.stencilFunc(b,c,f),d=b,e=c,h=f},setOp:function(b,c,d){if(l!==b||m!==c||n!==d)a.stencilOp(b,c,d),l=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){k!==b&&(a.clearStencil(b),k=b)},reset:function(){b=!1;k=n=m=l=h=e=d=c=null}}};c=a.getParameter(34921);var p=new Uint8Array(c),x=new Uint8Array(c),
-w=new Uint8Array(c),v={},T=null,Z=null,C=null,B=null,Q=null,Da=null,Ka=null,U=null,A=null,y=!1,D=null,F=null,H=null,G=null,K=null,L=a.getParameter(35661),O=!1;c=0;c=a.getParameter(7938);-1!==c.indexOf("WebGL")?(c=parseFloat(/^WebGL ([0-9])/.exec(c)[1]),O=1<=c):-1!==c.indexOf("OpenGL ES")&&(c=parseFloat(/^OpenGL ES ([0-9])/.exec(c)[1]),O=2<=c);var N=null,Jd={},aa=new R,Sh=new R,Ra={};Ra[3553]=d(3553,3553,1);Ra[34067]=d(34067,34069,6);r.setClear(0,0,0,1);q.setClear(1);u.setClear(0);f(2929);q.setFunc(3);
-l(!1);m(1);f(2884);h(0);var xa={100:32774,101:32778,102:32779};t?(xa[103]=32775,xa[104]=32776):(c=b.get("EXT_blend_minmax"),null!==c&&(xa[103]=c.MIN_EXT,xa[104]=c.MAX_EXT));var J={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};return{buffers:{color:r,depth:q,stencil:u},initAttributes:function(){for(var a=0,b=p.length;a<b;a++)p[a]=0},enableAttribute:function(a){e(a,0)},enableAttributeAndDivisor:e,disableUnusedAttributes:function(){for(var b=0,c=x.length;b!==c;++b)x[b]!==
-p[b]&&(a.disableVertexAttribArray(b),x[b]=0)},vertexAttribPointer:function(b,c,d,e,f,g){!0!==t||5124!==d&&5125!==d?a.vertexAttribPointer(b,c,d,e,f,g):a.vertexAttribIPointer(b,c,d,e,f,g)},enable:f,disable:g,useProgram:function(b){return T!==b?(a.useProgram(b),T=b,!0):!1},setBlending:h,setMaterial:function(a,b){2===a.side?g(2884):f(2884);var c=1===a.side;b&&(c=!c);l(c);1===a.blending&&!1===a.transparent?h(0):h(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,
-a.premultipliedAlpha);q.setFunc(a.depthFunc);q.setTest(a.depthTest);q.setMask(a.depthWrite);r.setMask(a.colorWrite);b=a.stencilWrite;u.setTest(b);b&&(u.setMask(a.stencilWriteMask),u.setFunc(a.stencilFunc,a.stencilRef,a.stencilFuncMask),u.setOp(a.stencilFail,a.stencilZFail,a.stencilZPass));k(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)},setFlipSided:l,setCullFace:m,setLineWidth:function(b){b!==H&&(O&&a.lineWidth(b),H=b)},setPolygonOffset:k,setScissorTest:function(a){a?f(3089):g(3089)},
-activeTexture:n,bindTexture:function(b,c){null===N&&n();var d=Jd[N];void 0===d&&(d={type:void 0,texture:void 0},Jd[N]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||Ra[b]),d.type=b,d.texture=c},unbindTexture:function(){var b=Jd[N];void 0!==b&&void 0!==b.type&&(a.bindTexture(b.type,null),b.type=void 0,b.texture=void 0)},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",
-ca)}},texImage3D:function(){try{a.texImage3D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},scissor:function(b){!1===aa.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),aa.copy(b))},viewport:function(b){!1===Sh.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),Sh.copy(b))},reset:function(){for(var b=0;b<x.length;b++)1===x[b]&&(a.disableVertexAttribArray(b),x[b]=0);v={};N=null;Jd={};F=D=C=T=null;r.reset();q.reset();u.reset()}}}function yk(a,b,c,d,e,f,g){function h(a,b){return G?new OffscreenCanvas(a,
-b):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function l(a,b,c,d){var e=1;if(a.width>d||a.height>d)e=d/Math.max(a.width,a.height);if(1>e||!0===b){if("undefined"!==typeof HTMLImageElement&&a instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&a instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&a instanceof ImageBitmap)return d=b?O.floorPowerOfTwo:Math.floor,b=d(e*a.width),e=d(e*a.height),void 0===H&&(H=h(b,e)),c=c?h(b,e):H,c.width=b,c.height=e,
-c.getContext("2d").drawImage(a,0,0,b,e),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+a.width+"x"+a.height+") to ("+b+"x"+e+")."),c;"data"in a&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+a.width+"x"+a.height+").")}return a}function m(a){return O.isPowerOfTwo(a.width)&&O.isPowerOfTwo(a.height)}function k(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,
-f))*Math.LOG2E}function t(c,d,e){if(!1===Da)return d;if(null!==c){if(void 0!==a[c])return a[c];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+c+"'")}c=d;6403===d&&(5126===e&&(c=33326),5131===e&&(c=33325),5121===e&&(c=33321));6407===d&&(5126===e&&(c=34837),5131===e&&(c=34843),5121===e&&(c=32849));6408===d&&(5126===e&&(c=34836),5131===e&&(c=34842),5121===e&&(c=32856));33325!==c&&33326!==c&&34842!==c&&34836!==c||b.get("EXT_color_buffer_float");return c}function r(a){return 1003===
-a||1004===a||1005===a?9728:9729}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b);void 0!==c.__webglInit&&(a.deleteTexture(c.__webglTexture),d.remove(b));b.isVideoTexture&&F.delete(b);g.memory.textures--}function u(b){b=b.target;b.removeEventListener("dispose",u);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLCubeRenderTarget)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),
-c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer),c.__webglMultisampledFramebuffer&&a.deleteFramebuffer(c.__webglMultisampledFramebuffer),c.__webglColorRenderbuffer&&a.deleteRenderbuffer(c.__webglColorRenderbuffer),c.__webglDepthRenderbuffer&&a.deleteRenderbuffer(c.__webglDepthRenderbuffer);d.remove(b.texture);d.remove(b)}g.memory.textures--}function p(a,b){var e=d.get(a);
-if(a.isVideoTexture){var f=g.render.frame;F.get(a)!==f&&(F.set(a,f),a.update())}if(0<a.version&&e.__version!==a.version)if(f=a.image,void 0===f)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else if(!1===f.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Z(e,a,b);return}c.activeTexture(33984+b);c.bindTexture(3553,e.__webglTexture)}function x(b,e){if(6===b.image.length){var g=d.get(b);if(0<b.version&&g.__version!==
-b.version){T(g,b);c.activeTexture(33984+e);c.bindTexture(34067,g.__webglTexture);a.pixelStorei(37440,b.flipY);var h=b&&(b.isCompressedTexture||b.image[0].isCompressedTexture);e=b.image[0]&&b.image[0].isDataTexture;for(var z=[],q=0;6>q;q++)z[q]=h||e?e?b.image[q].image:b.image[q]:l(b.image[q],!1,!0,U);var r=z[0],u=m(r)||Da,p=f.convert(b.format),E=f.convert(b.type),w=t(b.internalFormat,p,E);v(34067,b,u);if(h){for(q=0;6>q;q++){var x=z[q].mipmaps;for(h=0;h<x.length;h++){var aa=x[h];1023!==b.format&&1022!==
-b.format?null!==p?c.compressedTexImage2D(34069+q,h,w,aa.width,aa.height,0,aa.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(34069+q,h,w,aa.width,aa.height,0,p,E,aa.data)}}g.__maxMipLevel=x.length-1}else{x=b.mipmaps;for(q=0;6>q;q++)if(e)for(c.texImage2D(34069+q,0,w,z[q].width,z[q].height,0,p,E,z[q].data),h=0;h<x.length;h++)aa=x[h],aa=aa.image[q].image,c.texImage2D(34069+q,h+1,w,aa.width,aa.height,0,p,E,aa.data);else for(c.texImage2D(34069+
-q,0,w,p,E,z[q]),h=0;h<x.length;h++)aa=x[h],c.texImage2D(34069+q,h+1,w,p,E,aa.image[q]);g.__maxMipLevel=x.length}k(b,u)&&n(34067,b,r.width,r.height);g.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(33984+e),c.bindTexture(34067,g.__webglTexture)}}function w(a,b){c.activeTexture(33984+b);c.bindTexture(34067,d.get(a).__webglTexture)}function v(c,f,g){g?(a.texParameteri(c,10242,L[f.wrapS]),a.texParameteri(c,10243,L[f.wrapT]),32879!==c&&35866!==c||a.texParameteri(c,32882,L[f.wrapR]),
-a.texParameteri(c,10240,N[f.magFilter]),a.texParameteri(c,10241,N[f.minFilter])):(a.texParameteri(c,10242,33071),a.texParameteri(c,10243,33071),32879!==c&&35866!==c||a.texParameteri(c,32882,33071),1001===f.wrapS&&1001===f.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),a.texParameteri(c,10240,r(f.magFilter)),a.texParameteri(c,10241,r(f.minFilter)),1003!==f.minFilter&&1006!==f.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));
-!(g=b.get("EXT_texture_filter_anisotropic"))||1015===f.type&&null===b.get("OES_texture_float_linear")||1016===f.type&&null===(Da||b.get("OES_texture_half_float_linear"))||!(1<f.anisotropy||d.get(f).__currentAnisotropy)||(a.texParameterf(c,g.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(f.anisotropy,e.getMaxAnisotropy())),d.get(f).__currentAnisotropy=f.anisotropy)}function T(b,c){void 0===b.__webglInit&&(b.__webglInit=!0,c.addEventListener("dispose",q),b.__webglTexture=a.createTexture(),g.memory.textures++)}
-function Z(b,d,e){var g=3553;d.isDataTexture2DArray&&(g=35866);d.isDataTexture3D&&(g=32879);T(b,d);c.activeTexture(33984+e);c.bindTexture(g,b.__webglTexture);a.pixelStorei(37440,d.flipY);a.pixelStorei(37441,d.premultiplyAlpha);a.pixelStorei(3317,d.unpackAlignment);e=Da?!1:1001!==d.wrapS||1001!==d.wrapT||1003!==d.minFilter&&1006!==d.minFilter;e=e&&!1===m(d.image);e=l(d.image,e,!1,y);var h=m(e)||Da,z=f.convert(d.format),q=f.convert(d.type),r=t(d.internalFormat,z,q);v(g,d,h);var u=d.mipmaps;if(d.isDepthTexture)r=
-6402,Da?r=1015===d.type?36012:1014===d.type?33190:1020===d.type?35056:33189:1015===d.type&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),1026===d.format&&6402===r&&1012!==d.type&&1014!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),d.type=1012,q=f.convert(d.type)),1027===d.format&&6402===r&&(r=34041,1020!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),
-d.type=1020,q=f.convert(d.type))),c.texImage2D(3553,0,r,e.width,e.height,0,z,q,null);else if(d.isDataTexture)if(0<u.length&&h){for(var p=0,E=u.length;p<E;p++){var w=u[p];c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data)}d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,e.width,e.height,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isCompressedTexture){p=0;for(E=u.length;p<E;p++)w=u[p],1023!==d.format&&1022!==d.format?null!==z?c.compressedTexImage2D(3553,p,r,w.width,w.height,
-0,w.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data);b.__maxMipLevel=u.length-1}else if(d.isDataTexture2DArray)c.texImage3D(35866,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isDataTexture3D)c.texImage3D(32879,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(0<u.length&&h){p=0;for(E=u.length;p<E;p++)w=u[p],c.texImage2D(3553,p,r,z,q,
-w);d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,z,q,e),b.__maxMipLevel=0;k(d,h)&&n(g,d,e.width,e.height);b.__version=d.version;if(d.onUpdate)d.onUpdate(d)}function C(b,e,g,h){var l=f.convert(e.texture.format),m=f.convert(e.texture.type),n=t(e.texture.internalFormat,l,m);c.texImage2D(h,0,n,e.width,e.height,0,l,m,null);a.bindFramebuffer(36160,b);a.framebufferTexture2D(36160,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(36160,null)}function B(b,c,d){a.bindRenderbuffer(36161,
-b);if(c.depthBuffer&&!c.stencilBuffer){var e=33189;d?((d=c.depthTexture)&&d.isDepthTexture&&(1015===d.type?e=36012:1014===d.type&&(e=33190)),d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height);a.framebufferRenderbuffer(36160,36096,36161,b)}else c.depthBuffer&&c.stencilBuffer?(d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,35056,c.width,c.height)):a.renderbufferStorage(36161,34041,c.width,c.height),a.framebufferRenderbuffer(36160,
-33306,36161,b)):(b=f.convert(c.texture.format),e=f.convert(c.texture.type),e=t(c.texture.internalFormat,b,e),d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height));a.bindRenderbuffer(36161,null)}function Q(a){return Da&&a.isWebGLMultisampleRenderTarget?Math.min(D,a.samples):0}var Da=e.isWebGL2,A=e.maxTextures,U=e.maxCubemapSize,y=e.maxTextureSize,D=e.maxSamples,F=new WeakMap,H,G=!1;try{G="undefined"!==typeof OffscreenCanvas&&null!==
-(new OffscreenCanvas(1,1)).getContext("2d")}catch(Jd){}var K=0,L={1E3:10497,1001:33071,1002:33648},N={1003:9728,1004:9984,1005:9986,1006:9729,1007:9985,1008:9987},M=!1,R=!1;this.allocateTextureUnit=function(){var a=K;a>=A&&console.warn("THREE.WebGLTextures: Trying to use "+a+" texture units while this GPU supports only "+A);K+=1;return a};this.resetTextureUnits=function(){K=0};this.setTexture2D=p;this.setTexture2DArray=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+
-b),c.bindTexture(35866,e.__webglTexture))};this.setTexture3D=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+b),c.bindTexture(32879,e.__webglTexture))};this.setTextureCube=x;this.setTextureCubeDynamic=w;this.setupRenderTarget=function(b){var e=d.get(b),h=d.get(b.texture);b.addEventListener("dispose",u);h.__webglTexture=a.createTexture();g.memory.textures++;var l=!0===b.isWebGLCubeRenderTarget,z=!0===b.isWebGLMultisampleRenderTarget,q=m(b)||Da;!Da||
-1022!==b.texture.format||1015!==b.texture.type&&1016!==b.texture.type||(b.texture.format=1023,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead."));if(l)for(e.__webglFramebuffer=[],z=0;6>z;z++)e.__webglFramebuffer[z]=a.createFramebuffer();else if(e.__webglFramebuffer=a.createFramebuffer(),z)if(Da){e.__webglMultisampledFramebuffer=a.createFramebuffer();e.__webglColorRenderbuffer=a.createRenderbuffer();a.bindRenderbuffer(36161,e.__webglColorRenderbuffer);
-z=f.convert(b.texture.format);var r=f.convert(b.texture.type);z=t(b.texture.internalFormat,z,r);r=Q(b);a.renderbufferStorageMultisample(36161,r,z,b.width,b.height);a.bindFramebuffer(36160,e.__webglMultisampledFramebuffer);a.framebufferRenderbuffer(36160,36064,36161,e.__webglColorRenderbuffer);a.bindRenderbuffer(36161,null);b.depthBuffer&&(e.__webglDepthRenderbuffer=a.createRenderbuffer(),B(e.__webglDepthRenderbuffer,b,!0));a.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
-if(l){c.bindTexture(34067,h.__webglTexture);v(34067,b.texture,q);for(z=0;6>z;z++)C(e.__webglFramebuffer[z],b,36064,34069+z);k(b.texture,q)&&n(34067,b.texture,b.width,b.height);c.bindTexture(34067,null)}else c.bindTexture(3553,h.__webglTexture),v(3553,b.texture,q),C(e.__webglFramebuffer,b,36064,3553),k(b.texture,q)&&n(3553,b.texture,b.width,b.height),c.bindTexture(3553,null);if(b.depthBuffer){e=d.get(b);h=!0===b.isWebGLCubeRenderTarget;if(b.depthTexture){if(h)throw Error("target.depthTexture not supported in Cube render targets");
-if(b&&b.isWebGLCubeRenderTarget)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(36160,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);
-p(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(36160,36096,3553,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(36160,33306,3553,e,0);else throw Error("Unknown depthTexture format");}else if(h)for(e.__webglDepthbuffer=[],h=0;6>h;h++)a.bindFramebuffer(36160,e.__webglFramebuffer[h]),e.__webglDepthbuffer[h]=a.createRenderbuffer(),B(e.__webglDepthbuffer[h],b,!1);else a.bindFramebuffer(36160,e.__webglFramebuffer),e.__webglDepthbuffer=
-a.createRenderbuffer(),B(e.__webglDepthbuffer,b,!1);a.bindFramebuffer(36160,null)}};this.updateRenderTargetMipmap=function(a){var b=a.texture,e=m(a)||Da;if(k(b,e)){e=a.isWebGLCubeRenderTarget?34067:3553;var f=d.get(b).__webglTexture;c.bindTexture(e,f);n(e,b,a.width,a.height);c.bindTexture(e,null)}};this.updateMultisampleRenderTarget=function(b){if(b.isWebGLMultisampleRenderTarget)if(Da){var c=d.get(b);a.bindFramebuffer(36008,c.__webglMultisampledFramebuffer);a.bindFramebuffer(36009,c.__webglFramebuffer);
-var e=b.width,f=b.height,g=16384;b.depthBuffer&&(g|=256);b.stencilBuffer&&(g|=1024);a.blitFramebuffer(0,0,e,f,0,0,e,f,g,9728);a.bindFramebuffer(36160,c.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")};this.safeSetTexture2D=function(a,b){a&&a.isWebGLRenderTarget&&(!1===M&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),M=!0),a=a.texture);
-p(a,b)};this.safeSetTextureCube=function(a,b){a&&a.isWebGLCubeRenderTarget&&(!1===R&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),R=!0),a=a.texture);a&&a.isCubeTexture||Array.isArray(a.image)&&6===a.image.length?x(a,b):w(a,b)}}function Th(a,b,c){var d=c.isWebGL2;return{convert:function(a){if(1009===a)return 5121;if(1017===a)return 32819;if(1018===a)return 32820;if(1019===a)return 33635;if(1010===a)return 5120;
-if(1011===a)return 5122;if(1012===a)return 5123;if(1013===a)return 5124;if(1014===a)return 5125;if(1015===a)return 5126;if(1016===a){if(d)return 5131;var c=b.get("OES_texture_half_float");return null!==c?c.HALF_FLOAT_OES:null}if(1021===a)return 6406;if(1022===a)return 6407;if(1023===a)return 6408;if(1024===a)return 6409;if(1025===a)return 6410;if(1026===a)return 6402;if(1027===a)return 34041;if(1028===a)return 6403;if(1029===a)return 36244;if(1030===a)return 33319;if(1031===a)return 33320;if(1032===
-a)return 36248;if(1033===a)return 36249;if(33776===a||33777===a||33778===a||33779===a)if(c=b.get("WEBGL_compressed_texture_s3tc"),null!==c){if(33776===a)return c.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return c.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return c.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===a)return c.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(35840===a||35841===a||35842===a||35843===a)if(c=b.get("WEBGL_compressed_texture_pvrtc"),null!==c){if(35840===a)return c.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
-if(35841===a)return c.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return c.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return c.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(36196===a)return c=b.get("WEBGL_compressed_texture_etc1"),null!==c?c.COMPRESSED_RGB_ETC1_WEBGL:null;if(37492===a||37496===a)if(c=b.get("WEBGL_compressed_texture_etc"),null!==c){if(37492===a)return c.COMPRESSED_RGB8_ETC2;if(37496===a)return c.COMPRESSED_RGBA8_ETC2_EAC}if(37808===a||37809===a||37810===a||37811===a||37812===
-a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a||37840===a||37841===a||37842===a||37843===a||37844===a||37845===a||37846===a||37847===a||37848===a||37849===a||37850===a||37851===a||37852===a||37853===a)return c=b.get("WEBGL_compressed_texture_astc"),null!==c?a:null;if(36492===a)return c=b.get("EXT_texture_compression_bptc"),null!==c?a:null;if(1020===a){if(d)return 34042;c=b.get("WEBGL_depth_texture");return null!==c?c.UNSIGNED_INT_24_8_WEBGL:null}}}}
-function Le(a){P.call(this);this.cameras=a||[]}function Kc(){y.call(this);this.type="Group"}function Me(){this._grip=this._targetRay=null}function Uh(a,b){function c(a){var b=q.get(a.inputSource);b&&b.dispatchEvent({type:a.type})}function d(){q.forEach(function(a,b){a.disconnect(b)});q.clear();a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());Q.stop();h.isPresenting=!1;h.dispatchEvent({type:"sessionend"})}function e(a){k=a;Q.setContext(l);Q.start();h.isPresenting=!0;h.dispatchEvent({type:"sessionstart"})}
-function f(a){for(var b=l.inputSources,c=0;c<r.length;c++)q.set(b[c],r[c]);for(c=0;c<a.removed.length;c++){b=a.removed[c];var d=q.get(b);d&&(d.dispatchEvent({type:"disconnected",data:b}),q.delete(b))}for(c=0;c<a.added.length;c++)b=a.added[c],(d=q.get(b))&&d.dispatchEvent({type:"connected",data:b})}function g(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var h=this,l=null,m=1,k=null,n="local-floor",t=
-null,r=[],q=new Map,u=new P;u.layers.enable(1);u.viewport=new R;var E=new P;E.layers.enable(2);E.viewport=new R;var x=[u,E],w=new Le;w.layers.enable(1);w.layers.enable(2);var v=null,T=null;this.isPresenting=this.enabled=!1;this.getController=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getTargetRaySpace()};this.getControllerGrip=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getGripSpace()};this.setFramebufferScaleFactor=function(a){m=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")};
-this.setReferenceSpaceType=function(a){n=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")};this.getReferenceSpace=function(){return k};this.getSession=function(){return l};this.setSession=function(a){l=a;null!==l&&(l.addEventListener("select",c),l.addEventListener("selectstart",c),l.addEventListener("selectend",c),l.addEventListener("squeeze",c),l.addEventListener("squeezestart",c),l.addEventListener("squeezeend",c),l.addEventListener("end",
-d),a=b.getContextAttributes(),!0!==a.xrCompatible&&b.makeXRCompatible(),a=new XRWebGLLayer(l,b,{antialias:a.antialias,alpha:a.alpha,depth:a.depth,stencil:a.stencil,framebufferScaleFactor:m}),l.updateRenderState({baseLayer:a}),l.requestReferenceSpace(n).then(e),l.addEventListener("inputsourceschange",f))};var Z=new p,C=new p;this.getCamera=function(a){w.near=E.near=u.near=a.near;w.far=E.far=u.far=a.far;if(v!==w.near||T!==w.far)l.updateRenderState({depthNear:w.near,depthFar:w.far}),v=w.near,T=w.far;
-var b=a.parent,c=w.cameras;g(w,b);for(var d=0;d<c.length;d++)g(c[d],b);a.matrixWorld.copy(w.matrixWorld);a=a.children;d=0;for(b=a.length;d<b;d++)a[d].updateMatrixWorld(!0);if(2===c.length){Z.setFromMatrixPosition(u.matrixWorld);C.setFromMatrixPosition(E.matrixWorld);c=Z.distanceTo(C);var e=u.projectionMatrix.elements,f=E.projectionMatrix.elements,h=e[14]/(e[10]-1);d=e[14]/(e[10]+1);a=(e[9]+1)/e[5];b=(e[9]-1)/e[5];var m=(e[8]-1)/e[0],n=(f[8]+1)/f[0];f=h*m;e=h*n;n=c/(-m+n);m=n*-m;u.matrixWorld.decompose(w.position,
-w.quaternion,w.scale);w.translateX(m);w.translateZ(n);w.matrixWorld.compose(w.position,w.quaternion,w.scale);w.matrixWorldInverse.getInverse(w.matrixWorld);h+=n;n=d+n;w.projectionMatrix.makePerspective(f-m,e+(c-m),a*d/n*h,b*d/n*h,h,n)}else w.projectionMatrix.copy(u.projectionMatrix);return w};var B=null,Q=new uh;Q.setAnimationLoop(function(b,c){t=c.getViewerPose(k);if(null!==t){var d=t.views,e=l.renderState.baseLayer;a.setFramebuffer(e.framebuffer);var f=!1;d.length!==w.cameras.length&&(w.cameras.length=
-0,f=!0);for(var g=0;g<d.length;g++){var h=d[g],m=e.getViewport(h),n=x[g];n.matrix.fromArray(h.transform.matrix);n.projectionMatrix.fromArray(h.projectionMatrix);n.viewport.set(m.x,m.y,m.width,m.height);0===g&&w.matrix.copy(n.matrix);!0===f&&w.cameras.push(n)}}d=l.inputSources;for(g=0;g<r.length;g++)r[g].update(d[g],c,k);B&&B(b,c)});this.setAnimationLoop=function(a){B=a};this.dispose=function(){}}function zk(a){function b(b,c,f){b.opacity.value=c.opacity;c.color&&b.diffuse.value.copy(c.color);c.emissive&&
-b.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);c.map&&(b.map.value=c.map);c.alphaMap&&(b.alphaMap.value=c.alphaMap);c.specularMap&&(b.specularMap.value=c.specularMap);if(f=c.envMap||f)b.envMap.value=f,b.flipEnvMap.value=f.isCubeTexture?-1:1,b.reflectivity.value=c.reflectivity,b.refractionRatio.value=c.refractionRatio,b.maxMipLevel.value=a.get(f).__maxMipLevel;c.lightMap&&(b.lightMap.value=c.lightMap,b.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(b.aoMap.value=c.aoMap,
-b.aoMapIntensity.value=c.aoMapIntensity);if(c.map)var d=c.map;else c.specularMap?d=c.specularMap:c.displacementMap?d=c.displacementMap:c.normalMap?d=c.normalMap:c.bumpMap?d=c.bumpMap:c.roughnessMap?d=c.roughnessMap:c.metalnessMap?d=c.metalnessMap:c.alphaMap?d=c.alphaMap:c.emissiveMap&&(d=c.emissiveMap);void 0!==d&&(d.isWebGLRenderTarget&&(d=d.texture),!0===d.matrixAutoUpdate&&d.updateMatrix(),b.uvTransform.value.copy(d.matrix));if(c.aoMap)var e=c.aoMap;else c.lightMap&&(e=c.lightMap);void 0!==e&&
-(e.isWebGLRenderTarget&&(e=e.texture),!0===e.matrixAutoUpdate&&e.updateMatrix(),b.uv2Transform.value.copy(e.matrix))}function c(a,b,c){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,
-a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);if(b.envMap||c)a.envMapIntensity.value=b.envMapIntensity}return{refreshFogUniforms:function(a,b){a.fogColor.value.copy(b.color);b.isFog?(a.fogNear.value=b.near,a.fogFar.value=b.far):b.isFogExp2&&(a.fogDensity.value=b.density)},refreshMaterialUniforms:function(a,e,f,
-g,h){if(e.isMeshBasicMaterial)b(a,e);else if(e.isMeshLambertMaterial)b(a,e),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap);else if(e.isMeshToonMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.gradientMap&&(a.gradientMap.value=e.gradientMap),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
-1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshPhongMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,
-a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshStandardMaterial)b(a,e,f),e.isMeshPhysicalMaterial?(c(a,e,f),a.reflectivity.value=e.reflectivity,a.clearcoat.value=e.clearcoat,a.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&a.sheen.value.copy(e.sheen),e.clearcoatMap&&(a.clearcoatMap.value=
-e.clearcoatMap),e.clearcoatRoughnessMap&&(a.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(a.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),a.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&a.clearcoatNormalScale.value.negate()),a.transparency.value=e.transparency):c(a,e,f);else if(e.isMeshMatcapMaterial)b(a,e),e.matcap&&(a.matcap.value=e.matcap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),
-e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDepthMaterial)b(a,e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDistanceMaterial)b(a,
-e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias),a.referencePosition.value.copy(e.referencePosition),a.nearDistance.value=e.nearDistance,a.farDistance.value=e.farDistance;else if(e.isMeshNormalMaterial)b(a,e),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
-1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isLineBasicMaterial)a.diffuse.value.copy(e.color),a.opacity.value=e.opacity,e.isLineDashedMaterial&&(a.dashSize.value=e.dashSize,a.totalSize.value=e.dashSize+e.gapSize,a.scale.value=e.scale);else if(e.isPointsMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.size.value=e.size*g;
-a.scale.value=.5*h;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var d=e.map;else e.alphaMap&&(d=e.alphaMap);void 0!==d&&(!0===d.matrixAutoUpdate&&d.updateMatrix(),a.uvTransform.value.copy(d.matrix))}else if(e.isSpriteMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.rotation.value=e.rotation;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var m=e.map;else e.alphaMap&&(m=e.alphaMap);void 0!==m&&(!0===m.matrixAutoUpdate&&
-m.updateMatrix(),a.uvTransform.value.copy(m.matrix))}else e.isShadowMaterial?(a.color.value.copy(e.color),a.opacity.value=e.opacity):e.isShaderMaterial&&(e.uniformsNeedUpdate=!1)}}}function jg(a){var b;function c(){sa=new oj(I);Ha=new mj(I,sa,a);!1===Ha.isWebGL2&&(sa.get("WEBGL_depth_texture"),sa.get("OES_texture_float"),sa.get("OES_texture_half_float"),sa.get("OES_texture_half_float_linear"),sa.get("OES_standard_derivatives"),sa.get("OES_element_index_uint"),sa.get("ANGLE_instanced_arrays"));sa.get("OES_texture_float_linear");
-ra=new Th(I,sa,Ha);X=new xk(I,sa,Ha);X.scissor(S.copy(ka).multiplyScalar(xa).floor());X.viewport(Y.copy(da).multiplyScalar(xa).floor());fa=new rj(I);P=new nk;ba=new yk(I,sa,X,P,Ha,ra,fa);oa=new jj(I,Ha);va=new pj(I,oa,fa);pa=new uj(I,va,oa,fa);Aa=new tj(I);ta=new mk(y,sa,Ha);za=new zk(P);ya=new qk;wa=new wk;qa=new kj(y,X,pa,ja);Ca=new lj(I,sa,fa,Ha);Ea=new qj(I,sa,fa,Ha);fa.programs=ta.programs;y.capabilities=Ha;y.extensions=sa;y.properties=P;y.renderLists=ya;y.state=X;y.info=fa}function d(a){a.preventDefault();
-console.log("THREE.WebGLRenderer: Context Lost.");F=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");F=!1;c()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);P.remove(a)}function g(a){var b=P.get(a).program;a.program=void 0;void 0!==b&&ta.releaseProgram(b)}function h(a,b){a.render(function(a){y.renderBufferImmediate(a,b)})}function l(a,b,c,d){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isGroup)c=a.renderOrder;else if(a.isLOD)!0===a.autoUpdate&&a.update(b);
-else if(a.isLight)Q.pushLight(a),a.castShadow&&Q.pushShadow(a);else if(a.isSprite){if(!a.frustumCulled||na.intersectsSprite(a)){d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la);var e=pa.update(a),f=a.material;f.visible&&B.push(a,e,f,c,Jb.z,null)}}else if(a.isImmediateRenderObject)d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),B.push(a,null,a.material,c,Jb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.frame!==fa.render.frame&&(a.skeleton.update(),
-a.skeleton.frame=fa.render.frame),!a.frustumCulled||na.intersectsObject(a))if(d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),e=pa.update(a),f=a.material,Array.isArray(f))for(var g=e.groups,h=0,m=g.length;h<m;h++){var n=g[h],k=f[n.materialIndex];k&&k.visible&&B.push(a,e,k,c,Jb.z,n)}else f.visible&&B.push(a,e,f,c,Jb.z,null);a=a.children;h=0;for(m=a.length;h<m;h++)l(a[h],b,c,d)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,m=void 0===d?g.material:
-d;g=g.group;if(c.isArrayCamera){W=c;for(var n=c.cameras,z=0,q=n.length;z<q;z++){var t=n[z];h.layers.test(t.layers)&&(X.viewport(Y.copy(t.viewport)),Q.setupLights(t),k(h,b,t,l,m,g))}}else W=null,k(h,b,c,l,m,g)}}function k(a,c,d,e,f,g){a.onBeforeRender(y,c,d,e,f,g);Q=wa.get(c,W||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){var l=t(d,c,f,a);X.setMaterial(f);V=b=null;Ke=!1;h(a,l)}else y.renderBufferDirect(d,
-c,e,f,a,g);a.onAfterRender(y,c,d,e,f,g);Q=wa.get(c,W||d)}function n(a,b,c){var d=P.get(a),e=Q.state.lights,h=e.state.version;c=ta.getParameters(a,e.state,Q.state.shadowsArray,b,ha.numPlanes,ha.numIntersection,c);var l=ta.getProgramCacheKey(c),m=d.program,n=!0;if(void 0===m)a.addEventListener("dispose",f);else if(m.cacheKey!==l)g(a);else{if(d.lightsStateVersion!==h)d.lightsStateVersion=h;else if(void 0!==c.shaderID)return;n=!1}n&&(m=ta.acquireProgram(c,l),d.program=m,d.uniforms=c.uniforms,d.outputEncoding=
-c.outputEncoding,a.program=m);c=m.getAttributes();if(a.morphTargets)for(l=a.numSupportedMorphTargets=0;l<y.maxMorphTargets;l++)0<=c["morphTarget"+l]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(l=a.numSupportedMorphNormals=0;l<y.maxMorphNormals;l++)0<=c["morphNormal"+l]&&a.numSupportedMorphNormals++;c=d.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=ha.numPlanes,d.numIntersection=ha.numIntersection,c.clippingPlanes=ha.uniform;d.environment=a.isMeshStandardMaterial?
-b.environment:null;d.fog=b.fog;d.needsLights=a.isMeshLambertMaterial||a.isMeshToonMaterial||a.isMeshPhongMaterial||a.isMeshStandardMaterial||a.isShadowMaterial||a.isShaderMaterial&&!0===a.lights;d.lightsStateVersion=h;d.needsLights&&(c.ambientLightColor.value=e.state.ambient,c.lightProbe.value=e.state.probe,c.directionalLights.value=e.state.directional,c.directionalLightShadows.value=e.state.directionalShadow,c.spotLights.value=e.state.spot,c.spotLightShadows.value=e.state.spotShadow,c.rectAreaLights.value=
-e.state.rectArea,c.pointLights.value=e.state.point,c.pointLightShadows.value=e.state.pointShadow,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=e.state.spotShadowMap,c.spotShadowMatrix.value=e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Gb.seqWithValue(a.seq,c);
-d.uniformsList=a}function t(a,b,c,d){ba.resetTextureUnits();var e=b.fog,f=c.isMeshStandardMaterial?b.environment:null,g=null===G?y.outputEncoding:G.texture.encoding,h=P.get(c),l=Q.state.lights;Je&&(ig||a!==ia)&&ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,h,a===ia&&c.id===M);c.version===h.__version?void 0===h.program?n(c,b,d):c.fog&&h.fog!==e?n(c,b,d):h.environment!==f?n(c,b,d):h.needsLights&&h.lightsStateVersion!==l.state.version?n(c,b,d):void 0===h.numClippingPlanes||h.numClippingPlanes===
-ha.numPlanes&&h.numIntersection===ha.numIntersection?h.outputEncoding!==g&&n(c,b,d):n(c,b,d):(n(c,b,d),h.__version=c.version);var m=!1,k=!1,z=!1;b=h.program;g=b.getUniforms();l=h.uniforms;X.useProgram(b.program)&&(z=k=m=!0);c.id!==M&&(M=c.id,k=!0);if(m||ia!==a){g.setValue(I,"projectionMatrix",a.projectionMatrix);Ha.logarithmicDepthBuffer&&g.setValue(I,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));ia!==a&&(ia=a,z=k=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshStandardMaterial||
-c.envMap)m=g.map.cameraPosition,void 0!==m&&m.setValue(I,Jb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial)&&g.setValue(I,"isOrthographic",!0===a.isOrthographicCamera);(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&g.setValue(I,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&
-(g.setOptional(I,d,"bindMatrix"),g.setOptional(I,d,"bindMatrixInverse"),a=d.skeleton))if(m=a.bones,Ha.floatVertexTextures){if(void 0===a.boneTexture){m=Math.sqrt(4*m.length);m=O.ceilPowerOfTwo(m);m=Math.max(m,4);var q=new Float32Array(m*m*4);q.set(a.boneMatrices);var t=new $b(q,m,m,1023,1015);a.boneMatrices=q;a.boneTexture=t;a.boneTextureSize=m}g.setValue(I,"boneTexture",a.boneTexture,ba);g.setValue(I,"boneTextureSize",a.boneTextureSize)}else g.setOptional(I,a,"boneMatrices");if(k||h.receiveShadow!==
-d.receiveShadow)h.receiveShadow=d.receiveShadow,g.setValue(I,"receiveShadow",d.receiveShadow);k&&(g.setValue(I,"toneMappingExposure",y.toneMappingExposure),g.setValue(I,"toneMappingWhitePoint",y.toneMappingWhitePoint),h.needsLights&&(k=z,l.ambientLightColor.needsUpdate=k,l.lightProbe.needsUpdate=k,l.directionalLights.needsUpdate=k,l.directionalLightShadows.needsUpdate=k,l.pointLights.needsUpdate=k,l.pointLightShadows.needsUpdate=k,l.spotLights.needsUpdate=k,l.spotLightShadows.needsUpdate=k,l.rectAreaLights.needsUpdate=
-k,l.hemisphereLights.needsUpdate=k),e&&c.fog&&za.refreshFogUniforms(l,e),za.refreshMaterialUniforms(l,c,f,xa,Ra),void 0!==l.ltc_1&&(l.ltc_1.value=A.LTC_1),void 0!==l.ltc_2&&(l.ltc_2.value=A.LTC_2),Gb.upload(I,h.uniformsList,l,ba));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Gb.upload(I,h.uniformsList,l,ba),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(I,"center",d.center);g.setValue(I,"modelViewMatrix",d.modelViewMatrix);g.setValue(I,"normalMatrix",d.normalMatrix);g.setValue(I,"modelMatrix",
-d.matrixWorld);return b}a=a||{};var r=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),q=void 0!==a.context?a.context:null,u=void 0!==a.alpha?a.alpha:!1,E=void 0!==a.depth?a.depth:!0,x=void 0!==a.stencil?a.stencil:!0,w=void 0!==a.antialias?a.antialias:!1,ja=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,T=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,Z=void 0!==a.powerPreference?a.powerPreference:"default",C=void 0!==a.failIfMajorPerformanceCaveat?
-a.failIfMajorPerformanceCaveat:!1,B=null,Q=null;this.domElement=r;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.outputEncoding=3E3;this.physicallyCorrectLights=!1;this.toneMapping=0;this.toneMappingWhitePoint=this.toneMappingExposure=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var y=this,F=!1,D=null,H=0,K=0,G=null,L=null,M=-1;var V=b=
-null;var Ke=!1;var ia=null,W=null,Y=new R,S=new R,aa=null,ea=r.width,Ra=r.height,xa=1,J=null,ca=null,da=new R(0,0,ea,Ra),ka=new R(0,0,ea,Ra),ma=!1,na=new Gc,ha=new nj,Je=!1,ig=!1,la=new N,Jb=new p;try{u={alpha:u,depth:E,stencil:x,antialias:w,premultipliedAlpha:ja,preserveDrawingBuffer:T,powerPreference:Z,failIfMajorPerformanceCaveat:C};r.addEventListener("webglcontextlost",d,!1);r.addEventListener("webglcontextrestored",e,!1);var I=q||r.getContext("webgl",u)||r.getContext("experimental-webgl",u);
-if(null===I){if(null!==r.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===I.getShaderPrecisionFormat&&(I.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Vh){throw console.error("THREE.WebGLRenderer: "+Vh.message),Vh;}var sa,Ha,X,fa,P,ba,oa,va,pa,ta,za,ya,wa,qa,Aa,Ca,Ea,ra;c();var ua=new Uh(y,I);this.xr=ua;var Ga=new Rh(y,pa,Ha.maxTextureSize);this.shadowMap=Ga;
-this.getContext=function(){return I};this.getContextAttributes=function(){return I.getContextAttributes()};this.forceContextLoss=function(){var a=sa.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=sa.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return xa};this.setPixelRatio=function(a){void 0!==a&&(xa=a,this.setSize(ea,Ra,!1))};this.getSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),
-a=new v);return a.set(ea,Ra)};this.setSize=function(a,b,c){ua.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(ea=a,Ra=b,r.width=Math.floor(a*xa),r.height=Math.floor(b*xa),!1!==c&&(r.style.width=a+"px",r.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),a=new v);return a.set(ea*xa,Ra*xa).floor()};this.setDrawingBufferSize=
-function(a,b,c){ea=a;Ra=b;xa=c;r.width=Math.floor(a*c);r.height=Math.floor(b*c);this.setViewport(0,0,a,b)};this.getCurrentViewport=function(a){void 0===a&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),a=new R);return a.copy(Y)};this.getViewport=function(a){return a.copy(da)};this.setViewport=function(a,b,c,d){a.isVector4?da.set(a.x,a.y,a.z,a.w):da.set(a,b,c,d);X.viewport(Y.copy(da).multiplyScalar(xa).floor())};this.getScissor=function(a){return a.copy(ka)};
-this.setScissor=function(a,b,c,d){a.isVector4?ka.set(a.x,a.y,a.z,a.w):ka.set(a,b,c,d);X.scissor(S.copy(ka).multiplyScalar(xa).floor())};this.getScissorTest=function(){return ma};this.setScissorTest=function(a){X.setScissorTest(ma=a)};this.setOpaqueSort=function(a){J=a};this.setTransparentSort=function(a){ca=a};this.getClearColor=function(){return qa.getClearColor()};this.setClearColor=function(){qa.setClearColor.apply(qa,arguments)};this.getClearAlpha=function(){return qa.getClearAlpha()};this.setClearAlpha=
-function(){qa.setClearAlpha.apply(qa,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=16384;if(void 0===b||b)d|=256;if(void 0===c||c)d|=1024;I.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.dispose=function(){r.removeEventListener("webglcontextlost",d,!1);r.removeEventListener("webglcontextrestored",e,!1);ya.dispose();wa.dispose();P.dispose();pa.dispose();ua.dispose();
-Ba.stop()};this.renderBufferImmediate=function(a,b){X.initAttributes();var c=P.get(a);a.hasPositions&&!c.position&&(c.position=I.createBuffer());a.hasNormals&&!c.normal&&(c.normal=I.createBuffer());a.hasUvs&&!c.uv&&(c.uv=I.createBuffer());a.hasColors&&!c.color&&(c.color=I.createBuffer());b=b.getAttributes();a.hasPositions&&(I.bindBuffer(34962,c.position),I.bufferData(34962,a.positionArray,35048),X.enableAttribute(b.position),I.vertexAttribPointer(b.position,3,5126,!1,0,0));a.hasNormals&&(I.bindBuffer(34962,
-c.normal),I.bufferData(34962,a.normalArray,35048),X.enableAttribute(b.normal),I.vertexAttribPointer(b.normal,3,5126,!1,0,0));a.hasUvs&&(I.bindBuffer(34962,c.uv),I.bufferData(34962,a.uvArray,35048),X.enableAttribute(b.uv),I.vertexAttribPointer(b.uv,2,5126,!1,0,0));a.hasColors&&(I.bindBuffer(34962,c.color),I.bufferData(34962,a.colorArray,35048),X.enableAttribute(b.color),I.vertexAttribPointer(b.color,3,5126,!1,0,0));X.disableUnusedAttributes();I.drawArrays(4,0,a.count);a.count=0};var Ia=new zc;this.renderBufferDirect=
-function(a,c,d,e,f,g){null===c&&(c=Ia);var h=f.isMesh&&0>f.matrixWorld.determinant(),l=t(a,c,e,f);X.setMaterial(e,h);var m=!1;if(b!==d.id||V!==l.id||Ke!==(!0===e.wireframe))b=d.id,V=l.id,Ke=!0===e.wireframe,m=!0;if(e.morphTargets||e.morphNormals)Aa.update(f,d,e,l),m=!0;!0===f.isInstancedMesh&&(m=!0);a=d.index;c=d.attributes.position;if(null===a){if(void 0===c||0===c.count)return}else if(0===a.count)return;var n=1;!0===e.wireframe&&(a=va.getWireframeAttribute(d),n=2);h=Ca;if(null!==a){var k=oa.get(a);
-h=Ea;h.setIndex(k)}if(m){if(!1!==Ha.isWebGL2||!f.isInstancedMesh&&!d.isInstancedBufferGeometry||null!==sa.get("ANGLE_instanced_arrays")){X.initAttributes();m=d.attributes;l=l.getAttributes();var z=e.defaultAttributeValues;for(ja in l){var q=l[ja];if(0<=q){var r=m[ja];if(void 0!==r){var u=r.normalized,p=r.itemSize,w=oa.get(r);if(void 0!==w){var E=w.buffer,x=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var v=r.data,C=v.stride;r=r.offset;v&&v.isInstancedInterleavedBuffer?(X.enableAttributeAndDivisor(q,
-v.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=v.meshPerAttribute*v.count)):X.enableAttribute(q);I.bindBuffer(34962,E);X.vertexAttribPointer(q,p,x,u,C*w,r*w)}else r.isInstancedBufferAttribute?(X.enableAttributeAndDivisor(q,r.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=r.meshPerAttribute*r.count)):X.enableAttribute(q),I.bindBuffer(34962,E),X.vertexAttribPointer(q,p,x,u,0,0)}}else if("instanceMatrix"===ja)w=oa.get(f.instanceMatrix),void 0!==w&&(E=w.buffer,
-x=w.type,X.enableAttributeAndDivisor(q+0,1),X.enableAttributeAndDivisor(q+1,1),X.enableAttributeAndDivisor(q+2,1),X.enableAttributeAndDivisor(q+3,1),I.bindBuffer(34962,E),I.vertexAttribPointer(q+0,4,x,!1,64,0),I.vertexAttribPointer(q+1,4,x,!1,64,16),I.vertexAttribPointer(q+2,4,x,!1,64,32),I.vertexAttribPointer(q+3,4,x,!1,64,48));else if(void 0!==z&&(u=z[ja],void 0!==u))switch(u.length){case 2:I.vertexAttrib2fv(q,u);break;case 3:I.vertexAttrib3fv(q,u);break;case 4:I.vertexAttrib4fv(q,u);break;default:I.vertexAttrib1fv(q,
-u)}}}X.disableUnusedAttributes()}null!==a&&I.bindBuffer(34963,k.buffer)}var ja=d.drawRange.start*n;m=null!==g?g.start*n:0;k=Math.max(ja,m);g=Math.max(0,Math.min(null!==a?a.count:c.count,ja+d.drawRange.count*n,m+(null!==g?g.count*n:Infinity))-1-k+1);0!==g&&(f.isMesh?!0===e.wireframe?(X.setLineWidth(e.wireframeLinewidth*(null===G?xa:1)),h.setMode(1)):h.setMode(4):f.isLine?(e=e.linewidth,void 0===e&&(e=1),X.setLineWidth(e*(null===G?xa:1)),f.isLineSegments?h.setMode(1):f.isLineLoop?h.setMode(2):h.setMode(3)):
-f.isPoints?h.setMode(0):f.isSprite&&h.setMode(4),f.isInstancedMesh?h.renderInstances(d,k,g,f.count):d.isInstancedBufferGeometry?h.renderInstances(d,k,g,Math.min(d.instanceCount,d._maxInstanceCount)):h.render(k,g))};this.compile=function(a,b){Q=wa.get(a,b);Q.init();a.traverse(function(a){a.isLight&&(Q.pushLight(a),a.castShadow&&Q.pushShadow(a))});Q.setupLights(b);var c={};a.traverse(function(b){var d=b.material;if(d)if(Array.isArray(d))for(var e=0;e<d.length;e++){var f=d[e];!1===f.uuid in c&&(n(f,
-a,b),c[f.uuid]=!0)}else!1===d.uuid in c&&(n(d,a,b),c[d.uuid]=!0)})};var Fa=null,Ba=new uh;Ba.setAnimationLoop(function(a){ua.isPresenting||Fa&&Fa(a)});"undefined"!==typeof window&&Ba.setContext(window);this.setAnimationLoop=function(a){Fa=a;ua.setAnimationLoop(a);Ba.start()};this.render=function(a,c,d,e){if(void 0!==d){console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.");var f=d}if(void 0!==e){console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.");
-var g=e}c&&c.isCamera?F||(V=b=null,Ke=!1,M=-1,ia=null,!0===a.autoUpdate&&a.updateMatrixWorld(),null===c.parent&&c.updateMatrixWorld(),ua.enabled&&ua.isPresenting&&(c=ua.getCamera(c)),a.onBeforeRender(y,a,c,f||G),Q=wa.get(a,c),Q.init(),la.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse),na.setFromProjectionMatrix(la),ig=this.localClippingEnabled,Je=ha.init(this.clippingPlanes,ig,c),B=ya.get(a,c),B.init(),l(a,c,0,y.sortObjects),B.finish(),!0===y.sortObjects&&B.sort(J,ca),Je&&ha.beginShadows(),
-Ga.render(Q.state.shadowsArray,a,c),Q.setupLights(c),Je&&ha.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==f&&this.setRenderTarget(f),qa.render(B,a,c,g),d=B.opaque,e=B.transparent,a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,c,f),e.length&&m(e,a,c,f)):(d.length&&m(d,a,c),e.length&&m(e,a,c)),a.onAfterRender(y,a,c),null!==G&&(ba.updateRenderTargetMipmap(G),ba.updateMultisampleRenderTarget(G)),X.buffers.depth.setTest(!0),X.buffers.depth.setMask(!0),X.buffers.color.setMask(!0),
-X.setPolygonOffset(!1),Q=B=null):console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFramebuffer=function(a){D!==a&&null===G&&I.bindFramebuffer(36160,a);D=a};this.getActiveCubeFace=function(){return H};this.getActiveMipmapLevel=function(){return K};this.getRenderTarget=function(){return G};this.setRenderTarget=function(a,b,c){G=a;H=b;K=c;a&&void 0===P.get(a).__webglFramebuffer&&ba.setupRenderTarget(a);var d=D,e=!1;a?(d=P.get(a).__webglFramebuffer,a.isWebGLCubeRenderTarget?
-(d=d[b||0],e=!0):d=a.isWebGLMultisampleRenderTarget?P.get(a).__webglMultisampledFramebuffer:d,Y.copy(a.viewport),S.copy(a.scissor),aa=a.scissorTest):(Y.copy(da).multiplyScalar(xa).floor(),S.copy(ka).multiplyScalar(xa).floor(),aa=ma);L!==d&&(I.bindFramebuffer(36160,d),L=d);X.viewport(Y);X.scissor(S);X.setScissorTest(aa);e&&(a=P.get(a.texture),I.framebufferTexture2D(36160,36064,34069+(b||0),a.__webglTexture,c||0))};this.readRenderTargetPixels=function(a,b,c,d,e,f,g){if(a&&a.isWebGLRenderTarget){var h=
-P.get(a).__webglFramebuffer;a.isWebGLCubeRenderTarget&&void 0!==g&&(h=h[g]);if(h){g=!1;h!==L&&(I.bindFramebuffer(36160,h),g=!0);try{var l=a.texture,m=l.format,n=l.type;1023!==m&&ra.convert(m)!==I.getParameter(35739)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||ra.convert(n)===I.getParameter(35738)||1015===n&&(Ha.isWebGL2||sa.get("OES_texture_float")||sa.get("WEBGL_color_buffer_float"))||1016===n&&(Ha.isWebGL2?
-sa.get("EXT_color_buffer_float"):sa.get("EXT_color_buffer_half_float"))?36053===I.checkFramebufferStatus(36160)?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&I.readPixels(b,c,d,e,ra.convert(m),ra.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{g&&I.bindFramebuffer(36160,L)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};
-this.copyFramebufferToTexture=function(a,b,c){void 0===c&&(c=0);var d=Math.pow(2,-c),e=Math.floor(b.image.width*d);d=Math.floor(b.image.height*d);var f=ra.convert(b.format);ba.setTexture2D(b,0);I.copyTexImage2D(3553,c,f,a.x,a.y,e,d,0);X.unbindTexture()};this.copyTextureToTexture=function(a,b,c,d){void 0===d&&(d=0);var e=b.image.width,f=b.image.height,g=ra.convert(c.format),h=ra.convert(c.type);ba.setTexture2D(c,0);b.isDataTexture?I.texSubImage2D(3553,d,a.x,a.y,e,f,g,h,b.image.data):b.isCompressedTexture?
-I.compressedTexSubImage2D(3553,d,a.x,a.y,b.mipmaps[0].width,b.mipmaps[0].height,g,b.mipmaps[0].data):I.texSubImage2D(3553,d,a.x,a.y,g,h,b.image);0===d&&c.generateMipmaps&&I.generateMipmap(3553);X.unbindTexture()};this.initTexture=function(a){ba.setTexture2D(a,0);X.unbindTexture()};"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Ne(a,b){this.name="";this.color=new D(a);this.density=void 0!==b?b:2.5E-4}function Oe(a,b,c){this.name=
-"";this.color=new D(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function rb(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function Kd(a,b,c,d){this.name="";this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function Kb(a){K.call(this);this.type="SpriteMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.rotation=0;this.transparent=this.sizeAttenuation=!0;this.setValues(a)}
-function Ld(a){y.call(this);this.type="Sprite";if(void 0===Lc){Lc=new F;var b=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]);b=new rb(b,5);Lc.setIndex([0,1,2,0,2,3]);Lc.setAttribute("position",new Kd(b,3,0,!1));Lc.setAttribute("uv",new Kd(b,2,3,!1))}this.geometry=Lc;this.material=void 0!==a?a:new Kb;this.center=new v(.5,.5)}function Pe(a,b,c,d,e,f){Mc.subVectors(a,c).addScalar(.5).multiply(d);void 0!==e?(Md.x=f*Mc.x-e*Mc.y,Md.y=e*Mc.x+f*Mc.y):Md.copy(Mc);a.copy(b);a.x+=Md.x;
-a.y+=Md.y;a.applyMatrix4(Wh)}function Nd(){y.call(this);this._currentLevel=0;this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}});this.autoUpdate=!0}function Qe(a,b){a&&a.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");ea.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new N;this.bindMatrixInverse=new N}function Re(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*
-this.bones.length);this.frame=-1;if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new N)}function kg(){y.call(this);this.type="Bone"}function Se(a,b,c){ea.call(this,a,b);this.instanceMatrix=new G(new Float32Array(16*c),16);this.count=c;this.frustumCulled=!1}function da(a){K.call(this);this.type=
-"LineBasicMaterial";this.color=new D(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.morphTargets=!1;this.setValues(a)}function La(a,b,c){1===c&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");y.call(this);this.type="Line";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new da;this.updateMorphTargets()}function ma(a,b){La.call(this,a,b);this.type="LineSegments"}function Te(a,b){La.call(this,a,b);this.type=
-"LineLoop"}function Xa(a){K.call(this);this.type="PointsMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.size=1;this.sizeAttenuation=!0;this.morphTargets=!1;this.setValues(a)}function Nc(a,b){y.call(this);this.type="Points";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Xa;this.updateMorphTargets()}function lg(a,b,c,d,e,f,g){var h=mg.distanceSqToPoint(a);h<c&&(c=new p,mg.closestPointToPoint(a,c),c.applyMatrix4(d),a=e.ray.origin.distanceTo(c),a<e.near||a>e.far||
-f.push({distance:a,distanceToRay:Math.sqrt(h),point:c,index:b,face:null,object:g}))}function ng(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.format=void 0!==g?g:1022;this.minFilter=void 0!==f?f:1006;this.magFilter=void 0!==e?e:1006;this.generateMipmaps=!1}function Oc(a,b,c,d,e,f,g,h,l,m,k,n){W.call(this,null,f,g,h,l,m,d,e,k,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Od(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.needsUpdate=!0}
-function Pd(a,b,c,d,e,f,g,h,l,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);W.call(this,null,d,e,f,g,h,m,c,l);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Pc(a){F.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&
-a.isGeometry){var l=a.faces;var m=0;for(d=l.length;m<d;m++){var k=l[m];for(c=0;3>c;c++){var n=k[h[c]];var t=k[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){l=a.attributes.position;k=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:k.count,materialIndex:0}]);a=0;for(e=
-r.length;a<e;++a)for(m=r[a],c=m.start,d=m.count,m=c,d=c+d;m<d;m+=3)for(c=0;3>c;c++)n=k.getX(m+c),t=k.getX(m+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(l,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(l,m.index2),b.push(h.x,h.y,h.z)}else for(l=a.attributes.position,m=0,d=l.count/3;m<d;m++)for(c=0;3>c;c++)g=3*m+c,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(l,
-g),b.push(h.x,h.y,h.z);this.setAttribute("position",new B(b,3))}function Qd(a,b,c){L.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Qc(a,b,c));this.mergeVertices()}function Qc(a,b,c){F.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,l=new p,m=new p,k=new p,n=new p,t,r;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
-var q=b+1;for(t=0;t<=c;t++){var u=t/c;for(r=0;r<=b;r++){var E=r/b;a(E,u,l);e.push(l.x,l.y,l.z);0<=E-1E-5?(a(E-1E-5,u,m),k.subVectors(l,m)):(a(E+1E-5,u,m),k.subVectors(m,l));0<=u-1E-5?(a(E,u-1E-5,m),n.subVectors(l,m)):(a(E,u+1E-5,m),n.subVectors(m,l));h.crossVectors(k,n).normalize();f.push(h.x,h.y,h.z);g.push(E,u)}}for(t=0;t<c;t++)for(r=0;r<b;r++)a=t*q+r+1,h=(t+1)*q+r+1,l=(t+1)*q+r,d.push(t*q+r,a,l),d.push(a,h,l);this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",
-new B(f,3));this.setAttribute("uv",new B(g,2))}function Rd(a,b,c,d){L.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new Ga(a,b,c,d));this.mergeVertices()}function Ga(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}F.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,
-indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],l=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var l,m,k=c,x=d,w=g,v=Math.pow(2,a),T=[];for(m=0;m<=v;m++){T[m]=[];var Z=k.clone().lerp(w,m/v),C=x.clone().lerp(w,m/v),y=v-m;for(l=0;l<=y;l++)T[m][l]=0===l&&m===v?Z:Z.clone().lerp(C,l/y)}for(m=0;m<v;m++)for(l=0;l<2*(v-m)-1;l++)k=Math.floor(l/2),0===l%2?(e(T[m][k+1]),e(T[m+1][k]),e(T[m][k])):(e(T[m][k+1]),e(T[m+1][k+1]),e(T[m+1][k]))}})(d);(function(a){for(var b=
-new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],l.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));a=new p;b=new p;for(var c=new p,d=new p,e=new v,f=new v,k=new v,E=0,x=0;E<h.length;E+=9,x+=6){a.set(h[E+0],h[E+1],h[E+2]);b.set(h[E+3],h[E+4],h[E+5]);c.set(h[E+6],h[E+7],h[E+8]);e.set(l[x+0],
-l[x+1]);f.set(l[x+2],l[x+3]);k.set(l[x+4],l[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,x+0,a,w);g(f,x+2,b,w);g(k,x+4,c,w)}for(a=0;a<l.length;a+=6)b=l[a+0],c=l[a+2],d=l[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})();this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(h.slice(),3));this.setAttribute("uv",new B(l,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Sd(a,
-b){L.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rc(a,b));this.mergeVertices()}function Rc(a,b){Ga.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Td(a,b){L.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new bc(a,b));this.mergeVertices()}function bc(a,b){Ga.call(this,[1,0,0,
--1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ud(a,b){L.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sc(a,b));this.mergeVertices()}function Sc(a,b){var c=(1+Math.sqrt(5))/2;Ga.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,
-11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Vd(a,b){L.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tc(a,b));this.mergeVertices()}function Tc(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;Ga.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,
-0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Wd(a,b,c,d,e,f){L.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,
-closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new cc(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function cc(a,b,c,d,e){function f(e){k=a.getPointAt(e/b,k);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var m=t/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);l.x=m*f.x+n*e.x;l.y=m*f.y+n*e.y;l.z=m*f.z+n*e.z;l.normalize();q.push(l.x,l.y,l.z);h.x=k.x+c*l.x;h.y=k.y+c*l.y;h.z=
-k.z+c*l.z;r.push(h.x,h.y,h.z)}}F.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,l=new p,m=new v,k=new p,n,t,r=[],q=[],u=[],E=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)m.x=n/b,m.y=t/d,u.push(m.x,m.y);(function(){for(t=1;t<=b;t++)for(n=1;n<=d;n++){var a=
-(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;E.push((d+1)*(t-1)+(n-1),a,e);E.push(a,c,e)}})();this.setIndex(E);this.setAttribute("position",new B(r,3));this.setAttribute("normal",new B(q,3));this.setAttribute("uv",new B(u,2))}function Xd(a,b,c,d,e,f,g){L.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Uc(a,
-b,c,d,e,f));this.mergeVertices()}function Uc(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}F.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],l=[],m=[],k=[],n,t=new p,r=new p,q=new p,u=new p,E=new p,x=new p,w=new p;for(n=0;n<=c;++n){var v=n/c*e*Math.PI*2;
-g(v,e,f,a,q);g(v+.01,e,f,a,u);x.subVectors(u,q);w.addVectors(u,q);E.crossVectors(x,w);w.crossVectors(E,x);E.normalize();w.normalize();for(v=0;v<=d;++v){var T=v/d*Math.PI*2,Z=-b*Math.cos(T);T=b*Math.sin(T);t.x=q.x+(Z*w.x+T*E.x);t.y=q.y+(Z*w.y+T*E.y);t.z=q.z+(Z*w.z+T*E.z);l.push(t.x,t.y,t.z);r.subVectors(t,q).normalize();m.push(r.x,r.y,r.z);k.push(n/c);k.push(v/d)}}for(v=1;v<=c;v++)for(n=1;n<=d;n++)a=(d+1)*v+(n-1),b=(d+1)*v+n,e=(d+1)*(v-1)+n,h.push((d+1)*(v-1)+(n-1),a,e),h.push(a,b,e);this.setIndex(h);
-this.setAttribute("position",new B(l,3));this.setAttribute("normal",new B(m,3));this.setAttribute("uv",new B(k,2))}function Yd(a,b,c,d,e){L.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Vc(a,b,c,d,e));this.mergeVertices()}function Vc(a,b,c,d,e){F.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||
-6;e=e||2*Math.PI;var f=[],g=[],h=[],l=[],m=new p,k=new p,n=new p,t,r;for(t=0;t<=c;t++)for(r=0;r<=d;r++){var q=r/d*e,u=t/c*Math.PI*2;k.x=(a+b*Math.cos(u))*Math.cos(q);k.y=(a+b*Math.cos(u))*Math.sin(q);k.z=b*Math.sin(u);g.push(k.x,k.y,k.z);m.x=a*Math.cos(q);m.y=a*Math.sin(q);n.subVectors(k,m).normalize();h.push(n.x,n.y,n.z);l.push(r/d);l.push(t/c)}for(t=1;t<=c;t++)for(r=1;r<=d;r++)a=(d+1)*(t-1)+r-1,b=(d+1)*(t-1)+r,e=(d+1)*t+r,f.push((d+1)*t+r-1,a,e),f.push(a,b,e);this.setIndex(f);this.setAttribute("position",
-new B(g,3));this.setAttribute("normal",new B(h,3));this.setAttribute("uv",new B(l,2))}function Xh(a,b,c,d,e){for(var f,g=0,h=b,l=c-d;h<c;h+=d)g+=(a[l]-a[h])*(a[h+1]+a[l+1]),l=h;if(e===0<g)for(e=b;e<c;e+=d)f=Yh(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Yh(e,a[e],a[e+1],f);f&&Ue(f,f.next)&&(Zd(f),f=f.next);return f}function Lb(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!Ue(a,a.next)&&0!==na(a.prev,a,a.next))a=a.next;else{Zd(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
-function $d(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=og(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,k,n,t,r=1;do{l=h;var q=h=null;for(k=0;l;){k++;var p=l;for(m=n=0;m<r&&(n++,p=p.nextZ,p);m++);for(t=r;0<n||0<t&&p;)0!==n&&(0===t||!p||l.z<=p.z)?(m=l,l=l.nextZ,n--):(m=p,p=p.nextZ,t--),q?q.nextZ=m:h=m,m.prevZ=q,q=m;l=p}q.nextZ=null;r*=2}while(1<k)}for(h=a;a.prev!==a.next;){l=a.prev;p=a.next;if(f)q=Ak(a,d,e,f);else a:if(q=
-a,k=q.prev,n=q,r=q.next,0<=na(k,n,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(Wc(k.x,k.y,n.x,n.y,r.x,r.y,m.x,m.y)&&0<=na(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(p.i/c),Zd(a),h=a=p.next;else if(a=p,a===h){if(!g)$d(Lb(a),b,c,d,e,f,1);else if(1===g){a=Lb(a);g=b;h=c;l=a;do p=l.prev,q=l.next.next,!Ue(p,q)&&Zh(p,l,l.next,q)&&ae(p,q)&&ae(q,p)&&(g.push(p.i/h),g.push(l.i/h),g.push(q.i/h),Zd(l),Zd(l.next),l=a=q),l=l.next;while(l!==a);a=Lb(l);$d(a,b,c,d,e,f,2)}else if(2===
-g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;p=h;if(q=l.next.i!==p.i&&l.prev.i!==p.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==p.i&&q.next.i!==p.i&&Zh(q,q.next,l,p)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q){if(q=ae(l,p)&&ae(p,l)){q=l;k=!1;n=(l.x+p.x)/2;r=(l.y+p.y)/2;do q.y>r!==q.next.y>r&&q.next.y!==q.y&&n<(q.next.x-q.x)*(r-q.y)/(q.next.y-q.y)+q.x&&(k=!k),q=q.next;while(q!==l);q=k}q=q&&(na(l.prev,l,p.prev)||na(l,p.prev,p))||Ue(l,p)&&0<na(l.prev,l,l.next)&&0<na(p.prev,
-p,p.next)}l=q}if(l){a=$h(g,h);g=Lb(g,g.next);a=Lb(a,a.next);$d(g,b,c,d,e,f);$d(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ak(a,b,c,d){var e=a.prev,f=a.next;if(0<=na(e,a,f))return!1;var g=e.x>a.x?e.x>f.x?e.x:f.x:a.x>f.x?a.x:f.x,h=e.y>a.y?e.y>f.y?e.y:f.y:a.y>f.y?a.y:f.y,l=og(e.x<a.x?e.x<f.x?e.x:f.x:a.x<f.x?a.x:f.x,e.y<a.y?e.y<f.y?e.y:f.y:a.y<f.y?a.y:f.y,b,c,d);b=og(g,h,b,c,d);c=a.prevZ;for(d=a.nextZ;c&&c.z>=l&&d&&d.z<=b;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,
-f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ;if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}for(;c&&c.z>=l;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ}for(;d&&d.z<=b;){if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}return!0}function Bk(a,b){return a.x-b.x}function Ck(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=
-c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c=c.next}while(c!==b);if(!h)return null;if(d===f)return h;b=h;g=h.x;var l=h.y,m=Infinity;c=h;do{if(d>=c.x&&c.x>=g&&d!==c.x&&Wc(e<l?d:f,e,g,l,e<l?f:d,e,c.x,c.y)){var k=Math.abs(e-c.y)/(d-c.x);var n;if((n=ae(c,a))&&!(n=k<m)&&(n=k===m)&&!(n=c.x>h.x)&&(n=c.x===h.x)){n=h;var t=c;n=0>na(n.prev,n,t.prev)&&0>na(t.next,
-n,n.next)}n&&(h=c,m=k)}c=c.next}while(c!==b);return h}function og(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Dk(a){var b=a,c=a;do{if(b.x<c.x||b.x===c.x&&b.y<c.y)c=b;b=b.next}while(b!==a);return c}function Wc(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function na(a,
-b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function Ue(a,b){return a.x===b.x&&a.y===b.y}function Zh(a,b,c,d){var e=Ve(na(a,b,c)),f=Ve(na(a,b,d)),g=Ve(na(c,d,a)),h=Ve(na(c,d,b));return e!==f&&g!==h||0===e&&We(a,c,b)||0===f&&We(a,d,b)||0===g&&We(c,a,d)||0===h&&We(c,b,d)?!0:!1}function We(a,b,c){return b.x<=Math.max(a.x,c.x)&&b.x>=Math.min(a.x,c.x)&&b.y<=Math.max(a.y,c.y)&&b.y>=Math.min(a.y,c.y)}function Ve(a){return 0<a?1:0>a?-1:0}function ae(a,b){return 0>na(a.prev,a,a.next)?0<=na(a,b,a.next)&&
-0<=na(a,a.prev,b):0>na(a,b,a.prev)||0>na(a,a.next,b)}function $h(a,b){var c=new pg(a.i,a.x,a.y),d=new pg(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Yh(a,b,c,d){a=new pg(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Zd(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function pg(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=
-this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function ai(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function bi(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function dc(a,b){L.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new hb(a,b));this.mergeVertices()}function hb(a,b){function c(a){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}
-function g(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new v(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new v(f/e,d/
-e)}function h(a,b){for(J=a.length;0<=--J;){var c=J;var f=J-1;0>f&&(f=a.length-1);var g,h=w+2*B;for(g=0;g<h;g++){var l=W*g,m=W*(g+1),k=b+f+l,n=b+f+m;m=b+c+m;q(b+c+l);q(k);q(m);q(k);q(n);q(m);l=e.length/3;l=F.generateSideWallUV(d,e,l-6,l-3,l-2,l-1);u(l[0]);u(l[1]);u(l[3]);u(l[1]);u(l[2]);u(l[3])}}}function l(a,b,c){E.push(a);E.push(b);E.push(c)}function k(a,b,c){q(a);q(b);q(c);a=e.length/3;a=F.generateTopUV(d,e,a-3,a-2,a-1);u(a[0]);u(a[1]);u(a[2])}function q(a){e.push(E[3*a]);e.push(E[3*a+1]);e.push(E[3*
-a+2])}function u(a){f.push(a.x);f.push(a.y)}var E=[],x=void 0!==b.curveSegments?b.curveSegments:12,w=void 0!==b.steps?b.steps:1,ja=void 0!==b.depth?b.depth:100,T=void 0!==b.bevelEnabled?b.bevelEnabled:!0,Z=void 0!==b.bevelThickness?b.bevelThickness:6,C=void 0!==b.bevelSize?b.bevelSize:Z-2,y=void 0!==b.bevelOffset?b.bevelOffset:0,B=void 0!==b.bevelSegments?b.bevelSegments:3,A=b.extrudePath,F=void 0!==b.UVGenerator?b.UVGenerator:Ek;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),
-ja=b.amount);var D=!1;if(A){var G=A.getSpacedPoints(w);D=!0;T=!1;var H=A.computeFrenetFrames(w,!1);var K=new p;var L=new p;var N=new p}T||(y=C=Z=B=0);var O;x=a.extractPoints(x);a=x.shape;var M=x.holes;if(!sb.isClockWise(a)){a=a.reverse();var ia=0;for(O=M.length;ia<O;ia++){var P=M[ia];sb.isClockWise(P)&&(M[ia]=P.reverse())}}var Y=sb.triangulateShape(a,M),V=a;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],a=a.concat(P);var aa,W=a.length,R,ea=Y.length;x=[];var J=0;var ca=V.length;var S=ca-1;for(aa=J+1;J<ca;J++,
-S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),x[J]=g(V[J],V[S],V[aa]);A=[];var fa=x.concat();ia=0;for(O=M.length;ia<O;ia++){P=M[ia];var ba=[];J=0;ca=P.length;S=ca-1;for(aa=J+1;J<ca;J++,S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),ba[J]=g(P[J],P[S],P[aa]);A.push(ba);fa=fa.concat(ba)}for(S=0;S<B;S++){ca=S/B;var da=Z*Math.cos(ca*Math.PI/2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++){var ha=c(V[J],x[J],aa);l(ha.x,ha.y,-da)}ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=
-c(P[J],ba[J],aa),l(ha.x,ha.y,-da)}aa=C+y;for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[0]).multiplyScalar(ha.x),K.copy(H.binormals[0]).multiplyScalar(ha.y),N.copy(G[0]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,0);for(ca=1;ca<=w;ca++)for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[ca]).multiplyScalar(ha.x),K.copy(H.binormals[ca]).multiplyScalar(ha.y),N.copy(G[ca]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,ja/w*ca);for(S=B-1;0<=S;S--){ca=S/B;da=Z*Math.cos(ca*Math.PI/
-2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++)ha=c(V[J],x[J],aa),l(ha.x,ha.y,ja+da);ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=c(P[J],ba[J],aa),D?l(ha.x,ha.y+G[w-1].y,G[w-1].x+da):l(ha.x,ha.y,ja+da)}(function(){var a=e.length/3;if(T){var b=0*W;for(J=0;J<ea;J++)R=Y[J],k(R[2]+b,R[1]+b,R[0]+b);b=W*(w+2*B);for(J=0;J<ea;J++)R=Y[J],k(R[0]+b,R[1]+b,R[2]+b)}else{for(J=0;J<ea;J++)R=Y[J],k(R[2],R[1],R[0]);for(J=0;J<ea;J++)R=Y[J],k(R[0]+W*w,R[1]+W*w,R[2]+W*
-w)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(V,b);b+=V.length;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],h(P,b),b+=P.length;d.addGroup(a,e.length/3-a,1)})()}F.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.setAttribute("position",new B(e,3));this.setAttribute("uv",new B(f,2));this.computeVertexNormals()}function ci(a,b,c){c.shapes=[];if(Array.isArray(a))for(var d=
-0,e=a.length;d<e;d++)c.shapes.push(a[d].uuid);else c.shapes.push(a.uuid);void 0!==b.extrudePath&&(c.options.extrudePath=b.extrudePath.toJSON());return c}function be(a,b){L.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Xc(a,b));this.mergeVertices()}function Xc(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new L;a=c.generateShapes(a,b.size);b.depth=void 0!==
-b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);hb.call(this,a,b);this.type="TextBufferGeometry"}function ce(a,b,c,d,e,f,g){L.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new ec(a,b,c,d,e,f,g));this.mergeVertices()}function ec(a,b,c,d,e,f,g){F.call(this);this.type="SphereBufferGeometry";
-this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=Math.min(f+g,Math.PI),l,m,k=0,n=[],t=new p,r=new p,q=[],u=[],E=[],v=[];for(m=0;m<=c;m++){var w=[],y=m/c,T=0;0==m&&0==f?T=.5/b:m==c&&h==Math.PI&&(T=-.5/b);for(l=0;l<=b;l++){var Z=l/b;t.x=-a*Math.cos(d+Z*e)*Math.sin(f+y*g);t.y=a*Math.cos(f+
-y*g);t.z=a*Math.sin(d+Z*e)*Math.sin(f+y*g);u.push(t.x,t.y,t.z);r.copy(t).normalize();E.push(r.x,r.y,r.z);v.push(Z+T,1-y);w.push(k++)}n.push(w)}for(m=0;m<c;m++)for(l=0;l<b;l++)a=n[m][l+1],d=n[m][l],e=n[m+1][l],g=n[m+1][l+1],(0!==m||0<f)&&q.push(a,d,g),(m!==c-1||h<Math.PI)&&q.push(d,e,g);this.setIndex(q);this.setAttribute("position",new B(u,3));this.setAttribute("normal",new B(E,3));this.setAttribute("uv",new B(v,2))}function de(a,b,c,d,e,f){L.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,
-outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Yc(a,b,c,d,e,f));this.mergeVertices()}function Yc(a,b,c,d,e,f){F.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],l=[],m=[],k=a,n=(b-a)/d,t=new p,r=new v,q,u;for(q=0;q<=d;q++){for(u=
-0;u<=c;u++)a=e+u/c*f,t.x=k*Math.cos(a),t.y=k*Math.sin(a),h.push(t.x,t.y,t.z),l.push(0,0,1),r.x=(t.x/b+1)/2,r.y=(t.y/b+1)/2,m.push(r.x,r.y);k+=n}for(q=0;q<d;q++)for(b=q*(c+1),u=0;u<c;u++)a=u+b,e=a+c+1,f=a+c+2,k=a+1,g.push(a,e,k),g.push(e,f,k);this.setIndex(g);this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(l,3));this.setAttribute("uv",new B(m,2))}function ee(a,b,c,d){L.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Zc(a,
-b,c,d));this.mergeVertices()}function Zc(a,b,c,d){F.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=O.clamp(d,0,2*Math.PI);var e=[],f=[],g=[],h=1/b,l=new p,m=new v,k;for(k=0;k<=b;k++){var n=c+k*h*d;var t=Math.sin(n),r=Math.cos(n);for(n=0;n<=a.length-1;n++)l.x=a[n].x*t,l.y=a[n].y,l.z=a[n].x*r,f.push(l.x,l.y,l.z),m.x=k/b,m.y=n/(a.length-1),g.push(m.x,m.y)}for(k=0;k<b;k++)for(n=0;n<a.length-1;n++)c=n+
-k*a.length,h=c+a.length,l=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,l,m);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("uv",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=k=0;k<a.length;k++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function fc(a,b){L.call(this);
-this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new gc(a,b));this.mergeVertices()}function gc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,k=a.holes;!1===sb.isClockWise(m)&&(m=m.reverse());a=0;for(c=k.length;a<c;a++){var z=k[a];!0===sb.isClockWise(z)&&(k[a]=z.reverse())}var p=sb.triangulateShape(m,k);a=0;for(c=k.length;a<
-c;a++)z=k[a],m=m.concat(z);a=0;for(c=m.length;a<c;a++)z=m[a],e.push(z.x,z.y,0),f.push(0,0,1),g.push(z.x,z.y);a=0;for(c=p.length;a<c;a++)m=p[a],d.push(m[0]+h,m[1]+h,m[2]+h),l+=3}F.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,l=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,l,m),h+=l,l=0;this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",new B(f,3));
-this.setAttribute("uv",new B(g,2))}function di(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function $c(a,b){F.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(O.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new L;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,l=
-g.length;h<l;h++)for(var m=g[h],k=0;3>k;k++){var n=m[f[k]];var t=m[f[(k+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.setAttribute("position",new B(c,3))}function hc(a,b,c,d,e,f,g,h){L.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,
-radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new tb(a,b,c,d,e,f,g,h));this.mergeVertices()}function tb(a,b,c,d,e,f,g,h){function l(c){var e,f=new v,l=new p,z=0,u=!0===c?a:b,w=!0===c?1:-1;var y=q;for(e=1;e<=d;e++)n.push(0,E*w,0),t.push(0,w,0),r.push(.5,.5),q++;var B=q;for(e=0;e<=d;e++){var A=e/d*h+g,D=Math.cos(A);A=Math.sin(A);l.x=u*A;l.y=E*w;l.z=u*D;n.push(l.x,l.y,l.z);t.push(0,w,0);f.x=.5*D+.5;f.y=.5*A*w+.5;r.push(f.x,f.y);
-q++}for(e=0;e<d;e++)f=y+e,l=B+e,!0===c?k.push(l,l+1,f):k.push(l+1,l,f),z+=3;m.addGroup(x,z,!0===c?1:2);x+=z}F.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var k=[],n=[],t=[],r=[],q=0,u=[],E=c/2,x=0;(function(){var f,l,z=new p,
-v=new p,C=0,y=(b-a)/c;for(l=0;l<=e;l++){var B=[],A=l/e,D=A*(b-a)+a;for(f=0;f<=d;f++){var F=f/d,G=F*h+g,H=Math.sin(G);G=Math.cos(G);v.x=D*H;v.y=-A*c+E;v.z=D*G;n.push(v.x,v.y,v.z);z.set(H,y,G).normalize();t.push(z.x,z.y,z.z);r.push(F,1-A);B.push(q++)}u.push(B)}for(f=0;f<d;f++)for(l=0;l<e;l++)z=u[l+1][f],v=u[l+1][f+1],y=u[l][f+1],k.push(u[l][f],z,y),k.push(z,v,y),C+=6;m.addGroup(x,C,0);x+=C})();!1===f&&(0<a&&l(!0),0<b&&l(!1));this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",
-new B(t,3));this.setAttribute("uv",new B(r,2))}function fe(a,b,c,d,e,f,g){hc.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function ge(a,b,c,d,e,f,g){tb.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function he(a,b,c,d){L.call(this);this.type="CircleGeometry";this.parameters=
-{radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new ad(a,b,c,d));this.mergeVertices()}function ad(a,b,c,d){F.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],l,m=new p,k=new v;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(l=3;n<=b;n++,l+=3){var t=c+n/b*d;m.x=a*Math.cos(t);m.y=a*Math.sin(t);f.push(m.x,m.y,
-m.z);g.push(0,0,1);k.x=(f[l]/a+1)/2;k.y=(f[l+1]/a+1)/2;h.push(k.x,k.y)}for(l=1;l<=b;l++)e.push(l,l+1,0);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("normal",new B(g,3));this.setAttribute("uv",new B(h,2))}function ic(a){K.call(this);this.type="ShadowMaterial";this.color=new D(0);this.transparent=!0;this.setValues(a)}function ub(a){Ca.call(this,a);this.type="RawShaderMaterial"}function ib(a){K.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=
-new D(16777215);this.roughness=1;this.metalness=0;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=
-!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexTangents=this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function jc(a){ib.call(this);this.defines={STANDARD:"",PHYSICAL:""};this.type="MeshPhysicalMaterial";this.clearcoat=0;this.clearcoatMap=null;this.clearcoatRoughness=0;this.clearcoatRoughnessMap=null;this.clearcoatNormalScale=new v(1,1);this.clearcoatNormalMap=null;this.reflectivity=.5;this.sheen=null;this.transparency=0;this.setValues(a)}
-function Mb(a){K.call(this);this.type="MeshPhongMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=
-null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function kc(a){K.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.gradientMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=
-new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=this.specularMap=null;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function lc(a){K.call(this);this.type="MeshNormalMaterial";this.bumpMap=
-null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.fog=!1;this.setValues(a)}function mc(a){K.call(this);this.type="MeshLambertMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=
-1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function nc(a){K.call(this);this.defines={MATCAP:""};this.type="MeshMatcapMaterial";this.color=new D(16777215);this.bumpMap=this.map=this.matcap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=
-0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=null;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function oc(a){da.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Ma(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Xe(a,b,c,d){Ma.call(this,
-a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function ie(a,b,c,d){Ma.call(this,a,b,c,d)}function Ye(a,b,c,d){Ma.call(this,a,b,c,d)}function ta(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined");if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=ka.convertArray(b,this.TimeBufferType);this.values=ka.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation)}
-function Ze(a,b,c){ta.call(this,a,b,c)}function $e(a,b,c,d){ta.call(this,a,b,c,d)}function bd(a,b,c,d){ta.call(this,a,b,c,d)}function af(a,b,c,d){Ma.call(this,a,b,c,d)}function je(a,b,c,d){ta.call(this,a,b,c,d)}function bf(a,b,c,d){ta.call(this,a,b,c,d)}function cd(a,b,c,d){ta.call(this,a,b,c,d)}function Sa(a,b,c,d){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.blendMode=void 0!==d?d:2500;this.uuid=O.generateUUID();0>this.duration&&this.resetDuration()}function Fk(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return bd;
-case "vector":case "vector2":case "vector3":case "vector4":return cd;case "color":return $e;case "quaternion":return je;case "bool":case "boolean":return Ze;case "string":return bf}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Gk(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Fk(a.type);if(void 0===a.times){var c=[],d=[];ka.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,
-a.times,a.values,a.interpolation)}function qg(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0,l=[];this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=
-a;return this};this.addHandler=function(a,b){l.push(a,b);return this};this.removeHandler=function(a){a=l.indexOf(a);-1!==a&&l.splice(a,2);return this};this.getHandler=function(a){for(var b=0,c=l.length;b<c;b+=2){var d=l[b],e=l[b+1];d.global&&(d.lastIndex=0);if(d.test(a))return e}return null}}function V(a){this.manager=void 0!==a?a:ei;this.crossOrigin="anonymous";this.resourcePath=this.path="";this.requestHeader={}}function Ta(a){V.call(this,a)}function rg(a){V.call(this,a)}function sg(a){V.call(this,
-a)}function cf(a){V.call(this,a)}function dd(a){V.call(this,a)}function df(a){V.call(this,a)}function ef(a){V.call(this,a)}function H(){this.type="Curve";this.arcLengthDivisions=200}function Na(a,b,c,d,e,f,g,h){H.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ed(a,b,c,d,e,f){Na.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function tg(){var a=0,b=
-0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,l){e=l*(g-e);h=l*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,l,m,k){e=((f-e)/l-(g-e)/(l+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+k)+(h-g)/k)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function qa(a,b,c,d){H.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function fi(a,b,c,d,e){b=.5*(d-
-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function ke(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function le(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function Ya(a,b,c,d){H.call(this);this.type="CubicBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v;this.v3=d||new v}function jb(a,b,c,d){H.call(this);this.type="CubicBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function Ia(a,b){H.call(this);
-this.type="LineCurve";this.v1=a||new v;this.v2=b||new v}function Za(a,b){H.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function $a(a,b,c){H.call(this);this.type="QuadraticBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v}function kb(a,b,c){H.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p}function ab(a){H.call(this);this.type="SplineCurve";this.points=a||[]}function vb(){H.call(this);this.type="CurvePath";this.curves=
-[];this.autoClose=!1}function bb(a){vb.call(this);this.type="Path";this.currentPoint=new v;a&&this.setFromPoints(a)}function Nb(a){bb.call(this,a);this.uuid=O.generateUUID();this.type="Shape";this.holes=[]}function S(a,b){y.call(this);this.type="Light";this.color=new D(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function ff(a,b,c){S.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(y.DefaultUp);this.updateMatrix();this.groundColor=new D(b)}function lb(a){this.camera=
-a;this.bias=0;this.radius=1;this.mapSize=new v(512,512);this.mapPass=this.map=null;this.matrix=new N;this._frustum=new Gc;this._frameExtents=new v(1,1);this._viewportCount=1;this._viewports=[new R(0,0,1,1)]}function gf(){lb.call(this,new P(50,1,.5,500))}function hf(a,b,c,d,e,f){S.call(this,a,b);this.type="SpotLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=
-a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new gf}function ug(){lb.call(this,new P(90,1,.5,500));this._frameExtents=new v(4,2);this._viewportCount=6;this._viewports=[new R(2,1,1,1),new R(0,1,1,1),new R(3,1,1,1),new R(1,1,1,1),new R(3,0,1,1),new R(1,0,1,1)];this._cubeDirections=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)];this._cubeUps=[new p(0,1,0),new p(0,1,0),
-new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)]}function jf(a,b,c,d){S.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new ug}function fd(a,b,c,d,e,f){fb.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=void 0!==a?a:-1;this.right=void 0!==b?b:1;this.top=void 0!==c?c:1;this.bottom=
-void 0!==d?d:-1;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function kf(){lb.call(this,new fd(-5,5,5,-5,.5,500))}function lf(a,b){S.call(this,a,b);this.type="DirectionalLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;this.shadow=new kf}function mf(a,b){S.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function nf(a,b,c,d){S.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:
-10}function of(){this.coefficients=[];for(var a=0;9>a;a++)this.coefficients.push(new p)}function Ua(a,b){S.call(this,void 0,b);this.type="LightProbe";this.sh=void 0!==a?a:new of}function pf(a){V.call(this,a);this.textures={}}function me(){F.call(this);this.type="InstancedBufferGeometry";this.instanceCount=Infinity}function qf(a,b,c,d){"number"===typeof c&&(d=c,c=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument."));G.call(this,a,b,c);this.meshPerAttribute=
-d||1}function rf(a){V.call(this,a)}function sf(a){V.call(this,a)}function vg(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");V.call(this,a);this.options=void 0}function wg(){this.type="ShapePath";this.color=new D;this.subPaths=[];this.currentPath=null}function xg(a){this.type="Font";this.data=a}function yg(a){V.call(this,a)}function tf(a){V.call(this,
-a)}function zg(a,b,c){Ua.call(this,void 0,c);a=(new D).set(a);c=(new D).set(b);b=new p(a.r,a.g,a.b);a=new p(c.r,c.g,c.b);c=Math.sqrt(Math.PI);var d=c*Math.sqrt(.75);this.sh.coefficients[0].copy(b).add(a).multiplyScalar(c);this.sh.coefficients[1].copy(b).sub(a).multiplyScalar(d)}function Ag(a,b){Ua.call(this,void 0,b);a=(new D).set(a);this.sh.coefficients[0].set(a.r,a.g,a.b).multiplyScalar(2*Math.sqrt(Math.PI))}function gi(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new P;
-this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new P;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1;this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}function Bg(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function Cg(){y.call(this);this.type="AudioListener";this.context=Dg.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);
-this.filter=null;this.timeDelta=0;this._clock=new Bg}function gd(a){y.call(this);this.type="Audio";this.listener=a;this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.detune=0;this.loop=!1;this.offset=this.loopEnd=this.loopStart=0;this.duration=void 0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this._progress=this._startedAt=0;this.filters=[]}function Eg(a){gd.call(this,a);this.panner=
-this.context.createPanner();this.panner.panningModel="HRTF";this.panner.connect(this.gain)}function Fg(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function Gg(a,b,c){this.binding=a;this.valueSize=c;switch(b){case "quaternion":a=this._slerp;b=this._slerpAdditive;var d=this._setAdditiveIdentityQuaternion;this.buffer=new Float64Array(6*c);this._workIndex=5;break;case "string":case "bool":b=
-a=this._select;d=this._setAdditiveIdentityOther;this.buffer=Array(5*c);break;default:a=this._lerp,b=this._lerpAdditive,d=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*c)}this._mixBufferRegion=a;this._mixBufferRegionAdditive=b;this._setIdentity=d;this._origIndex=3;this._addIndex=4;this.referenceCount=this.useCount=this.cumulativeWeightAdditive=this.cumulativeWeight=0}function hi(a,b,c){c=c||Aa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function Aa(a,b,
-c){this.path=b;this.parsedPath=c||Aa.parseTrackName(b);this.node=Aa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function ii(){this.uuid=O.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-
-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function ji(a,b,c,d){this._mixer=a;this._clip=b;this._localRoot=c||null;this.blendMode=d||b.blendMode;a=b.tracks;b=a.length;c=Array(b);d={endingStart:2400,endingEnd:2400};for(var e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=
-2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Hg(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function uf(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Ig(a,b,c){rb.call(this,
-a,b);this.meshPerAttribute=c||1}function Jg(a,b,c,d){this.ray=new Wb(a,b);this.near=c||0;this.far=d||Infinity;this.camera=null;this.layers=new De;this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function ki(a,b){return a.distance-b.distance}function Kg(a,b,c,d){a.layers.test(b.layers)&&a.raycast(b,
-c);if(!0===d){a=a.children;d=0;for(var e=a.length;d<e;d++)Kg(a[d],b,c,!0)}}function li(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function mi(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function Lg(a,b){this.min=void 0!==a?a:new v(Infinity,Infinity);this.max=void 0!==b?b:new v(-Infinity,-Infinity)}function Mg(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function ne(a){y.call(this);
-this.material=a;this.render=function(){};this.hasUvs=this.hasColors=this.hasNormals=this.hasPositions=!1;this.uvArray=this.colorArray=this.normalArray=this.positionArray=null;this.count=0}function hd(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new F;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,
-Math.cos(f),Math.sin(f),1)}a.setAttribute("position",new B(b,3));b=new da({fog:!1,toneMapped:!1});this.cone=new ma(a,b);this.add(this.cone);this.update()}function ni(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,ni(a.children[c]));return b}function pc(a){for(var b=ni(a),c=new F,d=[],e=[],f=new D(0,0,1),g=new D(0,1,0),h=0;h<b.length;h++){var l=b[h];l.parent&&l.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.setAttribute("position",
-new B(d,3));c.setAttribute("color",new B(e,3));d=new da({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0});ma.call(this,c,d);this.type="SkeletonHelper";this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function id(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new ec(b,4,2);b=new Pa({wireframe:!0,fog:!1,toneMapped:!1});ea.call(this,a,b);this.type="PointLightHelper";this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}
-function jd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new bc(b);a.rotateY(.5*Math.PI);this.material=new Pa({wireframe:!0,fog:!1,toneMapped:!1});void 0===this.color&&(this.material.vertexColors=!0);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.setAttribute("color",new G(b,3));this.add(new ea(a,this.material));this.update()}function vf(a,b,c,d){a=a||10;b=b||10;c=new D(void 0!==c?c:4473924);d=new D(void 0!==
-d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],l=0,m=0,k=-g;l<=b;l++,k+=f){a.push(-g,0,k,g,0,k);a.push(k,0,-g,k,0,g);var n=l===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}b=new F;b.setAttribute("position",new B(a,3));b.setAttribute("color",new B(h,3));c=new da({vertexColors:!0,toneMapped:!1});ma.call(this,b,c);this.type="GridHelper"}function wf(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new D(void 0!==e?e:4473924);f=new D(void 0!==f?f:8947848);var g=
-[],h=[],l;for(l=0;l<=b;l++){var m=l/b*2*Math.PI;var k=Math.sin(m)*a;m=Math.cos(m)*a;g.push(0,0,0);g.push(k,0,m);var n=l&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(l=0;l<=c;l++){n=l&1?e:f;var t=a-a/c*l;for(b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b)}a=new F;a.setAttribute("position",new B(g,3));a.setAttribute("color",new B(h,3));g=new da({vertexColors:!0,toneMapped:!1});
-ma.call(this,a,g);this.type="PolarGridHelper"}function kd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new F;a.setAttribute("position",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new da({fog:!1,toneMapped:!1});this.lightPlane=new La(a,b);this.add(this.lightPlane);a=new F;a.setAttribute("position",new B([0,0,0,0,0,1],3));this.targetLine=new La(a,b);this.add(this.targetLine);this.update()}function oe(a){function b(a,
-b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new F,e=new da({color:16777215,vertexColors:!0,toneMapped:!1}),f=[],g=[],h={},l=new D(16755200),m=new D(16711680),k=new D(43775),n=new D(16777215),t=new D(3355443);b("n1","n2",l);b("n2","n4",l);b("n4","n3",l);b("n3","n1",l);b("f1","f2",l);b("f2","f4",l);b("f4","f3",l);b("f3","f1",l);b("n1","f1",l);b("n2","f2",l);b("n3","f3",l);b("n4","f4",l);b("p","n1",m);b("p","n2",m);b("p",
-"n3",m);b("p","n4",m);b("u1","u2",k);b("u2","u3",k);b("u3","u1",k);b("c","t",n);b("p","c",t);b("cn1","cn2",t);b("cn3","cn4",t);b("cf1","cf2",t);b("cf3","cf4",t);d.setAttribute("position",new B(f,3));d.setAttribute("color",new B(g,3));ma.call(this,d,e);this.type="CameraHelper";this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function fa(a,b,c,d,e,f,g){xf.set(e,f,g).unproject(d);a=
-b[a];if(void 0!==a)for(c=c.getAttribute("position"),b=0,d=a.length;b<d;b++)c.setXYZ(a[b],xf.x,xf.y,xf.z)}function wb(a,b){this.object=a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new F;d.setIndex(new G(a,1));d.setAttribute("position",new G(c,3));ma.call(this,d,new da({color:b,toneMapped:!1}));this.type="BoxHelper";this.matrixAutoUpdate=!1;this.update()}function pe(a,b){this.type="Box3Helper";this.box=a;b=b||16776960;a=
-new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new F;c.setIndex(new G(a,1));c.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));ma.call(this,c,new da({color:b,toneMapped:!1}));this.type="Box3Helper";this.geometry.computeBoundingSphere()}function qe(a,b,c){this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new F;b.setAttribute("position",new B([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));
-b.computeBoundingSphere();La.call(this,b,new da({color:a,toneMapped:!1}));this.type="PlaneHelper";b=new F;b.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new ea(b,new Pa({color:a,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}function xb(a,b,c,d,e,f){y.call(this);this.type="ArrowHelper";void 0===a&&(a=new p(0,0,1));void 0===b&&(b=new p(0,0,0));void 0===c&&(c=1);void 0===d&&(d=16776960);void 0===e&&(e=.2*c);void 0===f&&(f=
-.2*e);void 0===yf&&(yf=new F,yf.setAttribute("position",new B([0,0,0,0,1,0],3)),Ng=new tb(0,.5,1,5,1),Ng.translate(0,-.5,0));this.position.copy(b);this.line=new La(yf,new da({color:d,toneMapped:!1}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ea(Ng,new Pa({color:d,toneMapped:!1}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function re(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new F;a.setAttribute("position",new B(b,
-3));a.setAttribute("color",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new da({vertexColors:!0,toneMapped:!1});ma.call(this,a,b);this.type="AxesHelper"}function Og(a){this._renderer=a;this._pingPongRenderTarget=null;a=new Float32Array(20);var b=new p(0,1,0);a=new ub({defines:{n:20},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:a},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:b},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),
-fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n"+Qg()+"\n\n#define ENVMAP_TYPE_CUBE_UV\n#include <cube_uv_reflection_fragment>\n\nvec3 getSample(float theta, vec3 axis) {\n\tfloat cosTheta = cos(theta);\n\t// Rodrigues' axis-angle rotation\n\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\treturn bilinearCubeUV(envMap, sampleDirection, mipInt);\n}\n\nvoid main() {\n\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\tif (all(equal(axis, vec3(0.0))))\n\t\taxis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);\n\taxis = normalize(axis);\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb += weights[0] * getSample(0.0, axis);\n\tfor (int i = 1; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfloat theta = dTheta * float(i);\n\t\tgl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);\n\t\tgl_FragColor.rgb += weights[i] * getSample(theta, axis);\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
-blending:0,depthTest:!1,depthWrite:!1});a.type="SphericalGaussianBlur";this._blurMaterial=a;this._cubemapShader=this._equirectShader=null;this._compileMaterial(this._blurMaterial)}function oi(a){a=new Ba(3*nb,3*nb,a);a.texture.mapping=306;a.texture.name="PMREM.cubeUv";a.scissorTest=!0;return a}function Rg(a,b,c,d,e){a.viewport.set(b,c,d,e);a.scissor.set(b,c,d,e)}function pi(){var a=new v(1,1);a=new ub({uniforms:{envMap:{value:null},texelSize:{value:a},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},
-vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n"+Qg()+"\n\n#include <common>\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv = equirectUv( outputDirection );\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
-blending:0,depthTest:!1,depthWrite:!1});a.type="EquirectangularToCubeUV";return a}function qi(){var a=new ub({uniforms:{envMap:{value:null},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n"+Qg()+"\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
-blending:0,depthTest:!1,depthWrite:!1});a.type="CubemapToCubeUV";return a}function Pg(){return"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\n\n// RH coordinate system; PMREM face-indexing convention\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\t} else if (face == 2.0) {\n\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\t} else if (face == 5.0) {\n\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\t}\n\treturn direction;\n}\n\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t"}
-function Qg(){return"\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include <encodings_pars_fragment>\n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t"}
-function ri(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom";this.closed=!0}function si(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}function Sg(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,
--52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&(Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=
-Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b});Object.assign(ua.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,
-b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});for(var za=[],se=0;256>se;se++)za[se]=(16>se?"0":"")+se.toString(16);var O={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a=4294967295*Math.random()|0,b=4294967295*Math.random()|0,c=4294967295*Math.random()|
-0,d=4294967295*Math.random()|0;return(za[a&255]+za[a>>8&255]+za[a>>16&255]+za[a>>24&255]+"-"+za[b&255]+za[b>>8&255]+"-"+za[b>>16&15|64]+za[b>>24&255]+"-"+za[c&63|128]+za[c>>8&255]+"-"+za[c>>16&255]+za[c>>24&255]+za[d&255]+za[d>>8&255]+za[d>>16&255]+za[d>>24&255]).toUpperCase()},clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,
-b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*O.DEG2RAD},radToDeg:function(a){return a*O.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,
-Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))},setQuaternionFromProperEuler:function(a,b,c,d,e){var f=Math.cos,g=Math.sin,h=f(c/2);c=g(c/2);var l=f((b+d)/2),m=g((b+d)/2),k=f((b-d)/2),n=g((b-d)/2);f=f((d-b)/2);b=g((d-b)/2);switch(e){case "XYX":a.set(h*m,c*k,c*n,h*l);break;case "YZY":a.set(c*n,h*m,c*k,h*l);break;case "ZXZ":a.set(c*k,c*n,h*m,h*l);break;case "XZX":a.set(h*m,c*b,c*f,h*l);break;case "YXY":a.set(c*f,h*m,c*b,h*l);break;case "ZYZ":a.set(c*
-b,c*f,h*m,h*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+e)}}};Object.defineProperties(v.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(v.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
-a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},
-subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},
-max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);
-return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*
-this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-
-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==
-c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this},random:function(){this.x=Math.random();this.y=Math.random();return this}});Object.assign(ya.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=
-l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},extractBasis:function(a,b,c){a.setFromMatrix3Column(this,0);b.setFromMatrix3Column(this,1);c.setFromMatrix3Column(this,2);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],
-a[5],a[9],a[2],a[6],a[10]);return this},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var n=d[0],t=d[3],p=d[6],q=d[1],u=d[4],v=d[7],x=d[2],w=d[5];d=d[8];b[0]=a*n+e*q+f*x;b[3]=a*t+e*u+f*w;b[6]=a*p+e*v+f*d;b[1]=g*n+h*q+l*x;b[4]=g*t+h*u+l*w;b[7]=g*p+h*v+l*d;b[2]=m*n+k*q+c*x;b[5]=m*t+k*
-u+c*w;b[8]=m*p+k*v+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var c=a.elements;a=this.elements;b=c[0];var d=c[1],
-e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7];c=c[8];var k=c*g-h*m,n=h*l-c*f,p=m*f-g*l,r=b*k+d*n+e*p;if(0===r)return this.set(0,0,0,0,0,0,0,0,0);r=1/r;a[0]=k*r;a[1]=(e*m-c*d)*r;a[2]=(h*d-e*g)*r;a[3]=n*r;a[4]=(c*b-e*l)*r;a[5]=(e*f-h*b)*r;a[6]=p*r;a[7]=(d*l-m*b)*r;a[8]=(g*b-d*f)*r;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},
-transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],
-l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=
-this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var ld,Ob={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;if(!(a instanceof HTMLCanvasElement)){void 0===ld&&(ld=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"));ld.width=a.width;ld.height=a.height;var b=ld.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=ld}return 2048<
-a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},ej=0;W.DEFAULT_IMAGE=void 0;W.DEFAULT_MAPPING=300;W.prototype=Object.assign(Object.create(ua.prototype),{constructor:W,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);
-this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.internalFormat=a.internalFormat;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=
-a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,
-minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=O.generateUUID());if(!b&&void 0===a.images[d.uuid]){if(Array.isArray(d)){var e=[];for(var f=0,g=d.length;f<g;f++)e.push(Ob.getDataURL(d[f]))}else e=Ob.getDataURL(d);a.images[d.uuid]={uuid:d.uuid,url:e}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},
-transformUv:function(a){if(300!==this.mapping)return a;a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y);return a}});Object.defineProperty(W.prototype,
-"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.defineProperties(R.prototype,{width:{get:function(){return this.z},set:function(a){this.z=a}},height:{get:function(){return this.w},set:function(a){this.w=a}}});Object.assign(R.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=
-a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=
-a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*
-b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=
-a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=
-a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var l=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-l)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+l)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+l)/4;b>f&&b>m?.01>b?(l=0,c=h=.707106781):(l=Math.sqrt(b),h=c/l,c=d/l):f>m?.01>f?(l=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),l=c/h,c=g/h):.01>m?(h=l=.707106781,c=0):(c=
-Math.sqrt(m),l=d/c,h=g/c);this.set(l,h,c,a);return this}a=Math.sqrt((l-g)*(l-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(l-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,
-b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));this.w=Math.max(a,Math.min(b,this.w));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=
-Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);
-this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+
-Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;this.w=a.w+(b.w-a.w)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&
-a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this},random:function(){this.x=Math.random();this.y=
-Math.random();this.z=Math.random();this.w=Math.random();return this}});Ba.prototype=Object.assign(Object.create(ua.prototype),{constructor:Ba,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);
-this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Xf.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Xf,isWebGLMultisampleRenderTarget:!0,copy:function(a){Ba.prototype.copy.call(this,a);this.samples=a.samples;return this}});Object.assign(va,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=
-c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==n){f=1-g;var p=h*d+l*k+m*n+c*e,r=0<=p?1:-1,q=1-p*p;q>Number.EPSILON&&(q=Math.sqrt(q),p=Math.atan2(q,p*r),f=Math.sin(f*p)/q,g=Math.sin(g*p)/q);r*=g;h=h*f+d*r;l=l*f+k*r;m=m*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c},multiplyQuaternionsFlat:function(a,b,c,d,e,f){var g=c[d],h=c[d+1],l=c[d+2];c=c[d+3];d=e[f];var m=e[f+1],k=e[f+2];e=
-e[f+3];a[b]=g*e+c*d+h*k-l*m;a[b+1]=h*e+c*m+l*d-g*k;a[b+2]=l*e+c*k+g*m-h*d;a[b+3]=c*e-g*d-h*m-l*k;return a}});Object.defineProperties(va.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this._onChangeCallback()}}});Object.assign(va.prototype,
-{isQuaternion:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this._onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,
-g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);switch(a){case "XYZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "YXZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "ZXY":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "ZYX":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "YZX":this._x=c*l*f+h*d*e;this._y=
-h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f-c*d*e;break;case "XZY":this._x=c*l*f-h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f+c*d*e;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}!1!==b&&this._onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this._onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];
-a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(l-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this._onChangeCallback();return this},setFromUnitVectors:function(a,
-b){var c=a.dot(b)+1;1E-6>c?(c=0,Math.abs(a.x)>Math.abs(a.z)?(this._x=-a.y,this._y=a.x,this._z=0):(this._x=0,this._y=-a.z,this._z=a.y)):(this._x=a.y*b.z-a.z*b.y,this._y=a.z*b.x-a.x*b.z,this._z=a.x*b.y-a.y*b.x);this._w=c;return this.normalize()},angleTo:function(a){return 2*Math.acos(Math.abs(O.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=
--1;this._y*=-1;this._z*=-1;this._onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this._onChangeCallback();return this},
-multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();
-return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,
-g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+
-3]=this._w;return a},fromBufferAttribute:function(a,b){this._x=a.getX(b);this._y=a.getY(b);this._z=a.getZ(b);this._w=a.getW(b);return this},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});var Tg=new p,ti=new va;Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=
-a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;
-return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
-b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(ti.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ti.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyNormalMatrix:function(a){return this.applyMatrix3(a).normalize()},
-applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},
-unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,
-a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||
-1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=
-0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},
-lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;return this},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*
-e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.lengthSq();if(0===b)return this.set(0,0,0);b=a.dot(this)/b;return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Tg.copy(this).projectOnVector(a);return this.sub(Tg)},reflect:function(a){return this.sub(Tg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){var b=Math.sqrt(this.lengthSq()*a.lengthSq());if(0===b)return Math.PI/2;a=this.dot(a)/b;return Math.acos(O.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},
-distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,
-a.y)},setFromCylindricalCoords:function(a,b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},setFromMatrix3Column:function(a,
-b){return this.fromArray(a.elements,3*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this},
-random:function(){this.x=Math.random();this.y=Math.random();this.z=Math.random();return this}});var md=new p,ba=new N,Hk=new p(0,0,0),Ik=new p(1,1,1),Pb=new p,zf=new p,Ea=new p;Object.assign(N.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,n,p,r,q,u){var z=this.elements;z[0]=a;z[4]=b;z[8]=c;z[12]=d;z[1]=e;z[5]=f;z[9]=g;z[13]=h;z[2]=l;z[6]=m;z[10]=k;z[14]=n;z[3]=p;z[7]=r;z[11]=q;z[15]=u;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new N).fromArray(this.elements)},
-copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
-b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=this.elements,c=a.elements,d=1/md.setFromMatrixColumn(a,0).length(),e=1/md.setFromMatrixColumn(a,1).length();a=1/md.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
-var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=
-k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(Hk,
-a,Ik)},lookAt:function(a,b,c){var d=this.elements;Ea.subVectors(a,b);0===Ea.lengthSq()&&(Ea.z=1);Ea.normalize();Pb.crossVectors(c,Ea);0===Pb.lengthSq()&&(1===Math.abs(c.z)?Ea.x+=1E-4:Ea.z+=1E-4,Ea.normalize(),Pb.crossVectors(c,Ea));Pb.normalize();zf.crossVectors(Ea,Pb);d[0]=Pb.x;d[4]=zf.x;d[8]=Ea.x;d[1]=Pb.y;d[5]=zf.y;d[9]=Ea.y;d[2]=Pb.z;d[6]=zf.z;d[10]=Ea.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
-this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],n=c[2],p=c[6],r=c[10],q=c[14],u=c[3],v=c[7],x=c[11];c=c[15];var w=d[0],y=d[4],B=d[8],Z=d[12],C=d[1],A=d[5],D=d[9],F=d[13],G=d[2],H=d[6],K=d[10],L=d[14],M=d[3],N=d[7],O=d[11];d=d[15];b[0]=a*w+e*C+f*G+g*M;b[4]=a*y+e*A+f*H+g*N;b[8]=a*B+e*D+f*K+
-g*O;b[12]=a*Z+e*F+f*L+g*d;b[1]=h*w+l*C+m*G+k*M;b[5]=h*y+l*A+m*H+k*N;b[9]=h*B+l*D+m*K+k*O;b[13]=h*Z+l*F+m*L+k*d;b[2]=n*w+p*C+r*G+q*M;b[6]=n*y+p*A+r*H+q*N;b[10]=n*B+p*D+r*K+q*O;b[14]=n*Z+p*F+r*L+q*d;b[3]=u*w+v*C+x*G+c*M;b[7]=u*y+v*A+x*H+c*N;b[11]=u*B+v*D+x*K+c*O;b[15]=u*Z+v*F+x*L+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},determinant:function(){var a=
-this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],l=a[13],m=a[2],k=a[6],n=a[10],p=a[14];return a[3]*(+e*h*k-d*l*k-e*g*n+c*l*n+d*g*p-c*h*p)+a[7]*(+b*h*p-b*l*n+e*f*n-d*f*p+d*l*m-e*h*m)+a[11]*(+b*l*k-b*g*p-e*f*k+c*f*p+e*g*m-c*l*m)+a[15]*(-d*g*m-b*h*k+b*g*n+d*f*k-c*f*n+c*h*m)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a,
-b,c){var d=this.elements;a.isVector3?(d[12]=a.x,d[13]=a.y,d[14]=a.z):(d[12]=a,d[13]=b,d[14]=c);return this},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");b=this.elements;var c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=c[13],v=c[14];c=c[15];var x=n*v*m-u*p*m+u*l*r-h*v*r-n*l*c+h*p*c,w=q*p*m-k*v*m-q*l*r+g*v*r+k*l*c-g*p*c,y=k*u*m-q*n*m+q*h*r-g*u*
-r-k*h*c+g*n*c,B=q*n*l-k*u*l-q*h*p+g*u*p+k*h*v-g*n*v,A=a*x+d*w+e*y+f*B;if(0===A)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);A=1/A;b[0]=x*A;b[1]=(u*p*f-n*v*f-u*e*r+d*v*r+n*e*c-d*p*c)*A;b[2]=(h*v*f-u*l*f+u*e*m-d*v*m-h*e*c+d*l*c)*A;b[3]=(n*l*f-h*p*f-n*e*m+d*p*m+h*e*r-d*l*r)*A;b[4]=w*A;b[5]=(k*v*f-q*p*f+q*e*r-a*v*r-k*e*c+a*p*c)*A;b[6]=(q*l*f-g*v*f-q*e*m+a*v*m+g*e*c-a*l*c)*A;b[7]=(g*p*f-k*l*f+k*e*m-a*p*m-g*e*r+a*l*r)*A;b[8]=y*A;b[9]=(q*n*f-k*u*f-q*d*r+a*u*r+k*d*c-a*n*c)*A;b[10]=(g*u*f-q*h*f+q*d*m-
-a*u*m-g*d*c+a*h*c)*A;b[11]=(k*h*f-g*n*f-k*d*m+a*n*m+g*d*r-a*h*r)*A;b[12]=B*A;b[13]=(k*u*e-q*n*e+q*d*p-a*u*p-k*d*v+a*n*v)*A;b[14]=(q*h*e-g*u*e-q*d*l+a*u*l+g*d*v-a*h*v)*A;b[15]=(g*n*e-k*h*e+k*d*l-a*n*l-g*d*p+a*h*p)*A;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*
-a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,
-b){var c=Math.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){var d=this.elements,e=b._x,f=b._y,g=b._z,h=b._w,l=e+e,m=f+f,k=g+g;b=e*l;var n=e*m;e*=k;var p=f*m;f*=k;g*=k;l*=h;m*=h;h*=k;k=c.x;var r=
-c.y;c=c.z;d[0]=(1-(p+g))*k;d[1]=(n+h)*k;d[2]=(e-m)*k;d[3]=0;d[4]=(n-h)*r;d[5]=(1-(b+g))*r;d[6]=(f+l)*r;d[7]=0;d[8]=(e+m)*c;d[9]=(f-l)*c;d[10]=(1-(b+p))*c;d[11]=0;d[12]=a.x;d[13]=a.y;d[14]=a.z;d[15]=1;return this},decompose:function(a,b,c){var d=this.elements,e=md.set(d[0],d[1],d[2]).length(),f=md.set(d[4],d[5],d[6]).length(),g=md.set(d[8],d[9],d[10]).length();0>this.determinant()&&(e=-e);a.x=d[12];a.y=d[13];a.z=d[14];ba.copy(this);a=1/e;d=1/f;var h=1/g;ba.elements[0]*=a;ba.elements[1]*=a;ba.elements[2]*=
-a;ba.elements[4]*=d;ba.elements[5]*=d;ba.elements[6]*=d;ba.elements[8]*=h;ba.elements[9]*=h;ba.elements[10]*=h;b.setFromRotationMatrix(ba);c.x=e;c.y=f;c.z=g;return this},makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);
-g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},
-toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});var ui=new N,vi=new va;Ub.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");Ub.DefaultOrder="XYZ";Object.defineProperties(Ub.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},
-y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this._onChangeCallback()}}});Object.assign(Ub.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},
-copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this._onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=O.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],l=e[5],m=e[9],k=e[2],n=e[6];e=e[10];b=b||this._order;switch(b){case "XYZ":this._y=Math.asin(d(g,-1,1));.9999999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,l),this._z=0);break;case "YXZ":this._x=Math.asin(-d(m,-1,1));.9999999>Math.abs(m)?(this._y=
-Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-k,a),this._z=0);break;case "ZXY":this._x=Math.asin(d(n,-1,1));.9999999>Math.abs(n)?(this._y=Math.atan2(-k,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a));break;case "ZYX":this._y=Math.asin(-d(k,-1,1));.9999999>Math.abs(k)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,l));break;case "YZX":this._z=Math.asin(d(h,-1,1));.9999999>Math.abs(h)?(this._x=Math.atan2(-m,l),this._y=Math.atan2(-k,
-a)):(this._x=0,this._y=Math.atan2(g,e));break;case "XZY":this._z=Math.asin(-d(f,-1,1));.9999999>Math.abs(f)?(this._x=Math.atan2(n,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+b)}this._order=b;!1!==c&&this._onChangeCallback();return this},setFromQuaternion:function(a,b,c){ui.makeRotationFromQuaternion(a);return this.setFromRotationMatrix(ui,b,c)},setFromVector3:function(a,b){return this.set(a.x,
-a.y,a.z,b||this._order)},reorder:function(a){vi.setFromEuler(this);return this.setFromQuaternion(vi,a)},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,
-this._y,this._z):new p(this._x,this._y,this._z)},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});Object.assign(De.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},enableAll:function(){this.mask=-1},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},disableAll:function(){this.mask=0},test:function(a){return 0!==(this.mask&a.mask)}});var fj=0,wi=new p,nd=new va,yb=new N,Af=new p,te=new p,
-Jk=new p,Kk=new va,xi=new p(1,0,0),yi=new p(0,1,0),zi=new p(0,0,1),Lk={type:"added"},Mk={type:"removed"};y.DefaultUp=new p(0,1,0);y.DefaultMatrixAutoUpdate=!0;y.prototype=Object.assign(Object.create(ua.prototype),{constructor:y,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(a){this.matrixAutoUpdate&&this.updateMatrix();this.matrix.premultiply(a);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);
-return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.multiply(nd);return this},rotateOnWorldAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.premultiply(nd);return this},rotateX:function(a){return this.rotateOnAxis(xi,
-a)},rotateY:function(a){return this.rotateOnAxis(yi,a)},rotateZ:function(a){return this.rotateOnAxis(zi,a)},translateOnAxis:function(a,b){wi.copy(a).applyQuaternion(this.quaternion);this.position.add(wi.multiplyScalar(b));return this},translateX:function(a){return this.translateOnAxis(xi,a)},translateY:function(a){return this.translateOnAxis(yi,a)},translateZ:function(a){return this.translateOnAxis(zi,a)},localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(a){return a.applyMatrix4(yb.getInverse(this.matrixWorld))},
-lookAt:function(a,b,c){a.isVector3?Af.copy(a):Af.set(a,b,c);a=this.parent;this.updateWorldMatrix(!0,!1);te.setFromMatrixPosition(this.matrixWorld);this.isCamera||this.isLight?yb.lookAt(te,Af,this.up):yb.lookAt(Af,te,this.up);this.quaternion.setFromRotationMatrix(yb);a&&(yb.extractRotation(a.matrixWorld),nd.setFromRotationMatrix(yb),this.quaternion.premultiply(nd.inverse()))},add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",
-a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,this.children.push(a),a.dispatchEvent(Lk)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,this.children.splice(b,1),a.dispatchEvent(Mk));return this},attach:function(a){this.updateWorldMatrix(!0,!1);yb.getInverse(this.matrixWorld);
-null!==a.parent&&(a.parent.updateWorldMatrix(!0,!1),yb.multiply(a.parent.matrixWorld));a.applyMatrix4(yb);a.updateWorldMatrix(!1,!1);this.add(a);return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){void 0===
-a&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),a=new p);this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),a=new va);this.updateMatrixWorld(!0);this.matrixWorld.decompose(te,a,Jk);return a},getWorldScale:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),a=new p);this.updateMatrixWorld(!0);
-this.matrixWorld.decompose(te,Kk,a);return a},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(b[8],b[9],b[10]).normalize()},raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},
-traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=
-0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},updateWorldMatrix:function(a,b){var c=this.parent;!0===a&&null!==c&&c.updateWorldMatrix(!0,!1);this.matrixAutoUpdate&&this.updateMatrix();null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);if(!0===b)for(a=this.children,b=0,c=a.length;b<c;b++)a[b].updateWorldMatrix(!1,!0)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=
-[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);!1===this.frustumCulled&&(f.frustumCulled=!1);0!==this.renderOrder&&
-(f.renderOrder=this.renderOrder);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.layers=this.layers.mask;f.matrix=this.matrix.toArray();!1===this.matrixAutoUpdate&&(f.matrixAutoUpdate=!1);this.isInstancedMesh&&(f.type="InstancedMesh",f.count=this.count,f.instanceMatrix=this.instanceMatrix.toJSON());if(this.isMesh||this.isLine||this.isPoints){f.geometry=b(a.geometries,this.geometry);var g=this.geometry.parameters;if(void 0!==g&&void 0!==g.shapes)if(g=g.shapes,Array.isArray(g))for(var h=
-0,l=g.length;h<l;h++)b(a.shapes,g[h]);else b(a.shapes,g)}if(void 0!==this.material)if(Array.isArray(this.material)){g=[];h=0;for(l=this.material.length;h<l;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);if(d){d=c(a.geometries);h=c(a.materials);l=c(a.textures);var m=c(a.images);g=c(a.shapes);0<d.length&&(e.geometries=d);
-0<h.length&&(e.materials=h);0<l.length&&(e.textures=l);0<m.length&&(e.images=m);0<g.length&&(e.shapes=g)}e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;
-this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});zc.prototype=Object.assign(Object.create(y.prototype),{constructor:zc,isScene:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());
-null!==a.environment&&(this.environment=a.environment.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=y.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.environment&&(b.object.environment=this.environment.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());
-return b},dispose:function(){this.dispatchEvent({type:"dispose"})}});var zb=[new p,new p,new p,new p,new p,new p,new p,new p],ue=new p,Ug=new Va,od=new p,pd=new p,qd=new p,Qb=new p,Rb=new p,qc=new p,ve=new p,Bf=new p,Cf=new p,Vb=new p;Object.assign(Va.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;h<l;h+=3){var m=a[h],k=a[h+1],n=a[h+2];m<b&&(b=
-m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.count;h<l;h++){var m=a.getX(h),k=a.getY(h),n=a.getZ(h);m<b&&(b=m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);
-return this},setFromCenterAndSize:function(a,b){b=ue.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<
-this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){void 0===a&&(console.warn("THREE.Box3: .getCenter() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box3: .getSize() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);
-this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(a){a.updateWorldMatrix(!1,!1);var b=a.geometry;void 0!==b&&(null===b.boundingBox&&b.computeBoundingBox(),Ug.copy(b.boundingBox),Ug.applyMatrix4(a.matrixWorld),this.union(Ug));a=a.children;b=0;for(var c=a.length;b<c;b++)this.expandByObject(a[b]);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||
-a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||
-a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(a){this.clampPoint(a.center,ue);return ue.distanceToSquared(a.center)<=a.radius*a.radius},intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*
-this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=-a.constant&&c>=-a.constant},intersectsTriangle:function(a){if(this.isEmpty())return!1;this.getCenter(ve);Bf.subVectors(this.max,ve);od.subVectors(a.a,ve);pd.subVectors(a.b,ve);qd.subVectors(a.c,ve);Qb.subVectors(pd,od);Rb.subVectors(qd,pd);qc.subVectors(od,qd);a=[0,-Qb.z,Qb.y,0,-Rb.z,Rb.y,0,-qc.z,qc.y,Qb.z,0,-Qb.x,Rb.z,0,-Rb.x,qc.z,0,-qc.x,-Qb.y,Qb.x,0,-Rb.y,Rb.x,0,-qc.y,qc.x,0];if(!Yf(a,od,pd,qd,Bf))return!1;
-a=[1,0,0,0,1,0,0,0,1];if(!Yf(a,od,pd,qd,Bf))return!1;Cf.crossVectors(Qb,Rb);a=[Cf.x,Cf.y,Cf.z];return Yf(a,od,pd,qd,Bf)},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return ue.copy(a).clamp(this.min,this.max).sub(a).length()},getBoundingSphere:function(a){void 0===a&&console.error("THREE.Box3: .getBoundingSphere() target is now required");this.getCenter(a.center);
-a.radius=.5*this.getSize(ue).length();return a},intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;zb[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(a);zb[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(a);zb[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(a);zb[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(a);
-zb[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(a);zb[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(a);zb[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(a);zb[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(a);this.setFromPoints(zb);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Nk=new Va;Object.assign(eb.prototype,{set:function(a,b){this.center.copy(a);this.radius=
-b;return this},setFromPoints:function(a,b){var c=this.center;void 0!==b?c.copy(b):Nk.setFromPoints(a).getCenter(c);for(var d=b=0,e=a.length;d<e;d++)b=Math.max(b,c.distanceToSquared(a[d]));this.radius=Math.sqrt(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},isEmpty:function(){return 0>this.radius},makeEmpty:function(){this.center.set(0,0,0);this.radius=-1;return this},containsPoint:function(a){return a.distanceToSquared(this.center)<=
-this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),
-b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Va);if(this.isEmpty())return a.makeEmpty(),a;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);
-return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});var Ab=new p,Vg=new p,Df=new p,Sb=new p,Wg=new p,Ef=new p,Xg=new p;Object.assign(Wb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){void 0===b&&(console.warn("THREE.Ray: .at() target is now required"),b=new p);
-return b.copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(a){this.origin.copy(this.at(a,Ab));return this},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),b=new p);b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},
-distanceSqToPoint:function(a){var b=Ab.subVectors(a,this.origin).dot(this.direction);if(0>b)return this.origin.distanceToSquared(a);Ab.copy(this.direction).multiplyScalar(b).add(this.origin);return Ab.distanceToSquared(a)},distanceSqToSegment:function(a,b,c,d){Vg.copy(a).add(b).multiplyScalar(.5);Df.copy(b).sub(a).normalize();Sb.copy(this.origin).sub(Vg);var e=.5*a.distanceTo(b),f=-this.direction.dot(Df),g=Sb.dot(this.direction),h=-Sb.dot(Df),l=Sb.lengthSq(),m=Math.abs(1-f*f);if(0<m){a=f*h-g;b=f*
-g-h;var k=e*m;0<=a?b>=-k?b<=k?(e=1/m,a*=e,b*=e,f=a*(a+f*b+2*g)+b*(f*a+b+2*h)+l):(b=e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):(b=-e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):b<=-k?(a=Math.max(0,-(-f*e+g)),b=0<a?-e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l):b<=k?(a=0,b=Math.min(Math.max(-e,-h),e),f=b*(b+2*h)+l):(a=Math.max(0,-(f*e+g)),b=0<a?e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l)}else b=0<f?-e:e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l;c&&c.copy(this.direction).multiplyScalar(a).add(this.origin);
-d&&d.copy(Df).multiplyScalar(b).add(Vg);return f},intersectSphere:function(a,b){Ab.subVectors(a.center,this.origin);var c=Ab.dot(this.direction),d=Ab.dot(Ab)-c*c;a=a.radius*a.radius;if(d>a)return null;a=Math.sqrt(a-d);d=c-a;c+=a;return 0>d&&0>c?null:0>d?this.at(c,b):this.at(d,b)},intersectsSphere:function(a){return this.distanceSqToPoint(a.center)<=a.radius*a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+
-a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-
-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(a){return null!==this.intersectBox(a,Ab)},intersectTriangle:function(a,b,c,d,e){Wg.subVectors(b,a);Ef.subVectors(c,a);Xg.crossVectors(Wg,Ef);b=this.direction.dot(Xg);if(0<b){if(d)return null;d=1}else if(0>b)d=-1,b=-b;else return null;
-Sb.subVectors(this.origin,a);a=d*this.direction.dot(Ef.crossVectors(Sb,Ef));if(0>a)return null;c=d*this.direction.dot(Wg.cross(Sb));if(0>c||a+c>b)return null;a=-d*Sb.dot(Xg);return 0>a?null:this.at(a/b,e)},applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});var Yg=new p,Ok=new p,Pk=new ya;Object.assign(Wa.prototype,{isPlane:!0,set:function(a,b){this.normal.copy(a);
-this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(a,b,c){b=Yg.subVectors(c,b).cross(Ok.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(b,a);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;
-return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},
-intersectLine:function(a,b){void 0===b&&(console.warn("THREE.Plane: .intersectLine() target is now required"),b=new p);var c=a.delta(Yg),d=this.normal.dot(c);if(0===d){if(0===this.distanceToPoint(a.start))return b.copy(a.start)}else if(d=-(a.start.dot(this.normal)+this.constant)/d,!(0>d||1<d))return b.copy(c).multiplyScalar(d).add(a.start)},intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},
-intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){void 0===a&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),a=new p);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(a,b){b=b||Pk.getNormalMatrix(a);a=this.coplanarPoint(Yg).applyMatrix4(a);b=this.normal.applyMatrix3(b).normalize();this.constant=-a.dot(b);return this},translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&
-a.constant===this.constant}});var cb=new p,Bb=new p,Zg=new p,Cb=new p,rd=new p,sd=new p,Ai=new p,$g=new p,ah=new p,bh=new p;Object.assign(pa,{getNormal:function(a,b,c,d){void 0===d&&(console.warn("THREE.Triangle: .getNormal() target is now required"),d=new p);d.subVectors(c,b);cb.subVectors(a,b);d.cross(cb);a=d.lengthSq();return 0<a?d.multiplyScalar(1/Math.sqrt(a)):d.set(0,0,0)},getBarycoord:function(a,b,c,d,e){cb.subVectors(d,b);Bb.subVectors(c,b);Zg.subVectors(a,b);a=cb.dot(cb);b=cb.dot(Bb);c=cb.dot(Zg);
-var f=Bb.dot(Bb);d=Bb.dot(Zg);var g=a*f-b*b;void 0===e&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),e=new p);if(0===g)return e.set(-2,-1,-1);g=1/g;f=(f*c-b*d)*g;a=(a*d-b*c)*g;return e.set(1-f-a,a,f)},containsPoint:function(a,b,c,d){pa.getBarycoord(a,b,c,d,Cb);return 0<=Cb.x&&0<=Cb.y&&1>=Cb.x+Cb.y},getUV:function(a,b,c,d,e,f,g,h){this.getBarycoord(a,b,c,d,Cb);h.set(0,0);h.addScaledVector(e,Cb.x);h.addScaledVector(f,Cb.y);h.addScaledVector(g,Cb.z);return h},isFrontFacing:function(a,
-b,c,d){cb.subVectors(c,b);Bb.subVectors(a,b);return 0>cb.cross(Bb).dot(d)?!0:!1}});Object.assign(pa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){cb.subVectors(this.c,this.b);Bb.subVectors(this.a,
-this.b);return.5*cb.cross(Bb).length()},getMidpoint:function(a){void 0===a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),a=new p);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return pa.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new Wa);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return pa.getBarycoord(a,
-this.a,this.b,this.c,b)},getUV:function(a,b,c,d,e){return pa.getUV(a,this.a,this.b,this.c,b,c,d,e)},containsPoint:function(a){return pa.containsPoint(a,this.a,this.b,this.c)},isFrontFacing:function(a){return pa.isFrontFacing(this.a,this.b,this.c,a)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),b=new p);var c=this.a,d=this.b,e=this.c;rd.subVectors(d,c);sd.subVectors(e,
-c);$g.subVectors(a,c);var f=rd.dot($g),g=sd.dot($g);if(0>=f&&0>=g)return b.copy(c);ah.subVectors(a,d);var h=rd.dot(ah),l=sd.dot(ah);if(0<=h&&l<=h)return b.copy(d);var m=f*l-h*g;if(0>=m&&0<=f&&0>=h)return d=f/(f-h),b.copy(c).addScaledVector(rd,d);bh.subVectors(a,e);a=rd.dot(bh);var k=sd.dot(bh);if(0<=k&&a<=k)return b.copy(e);f=a*g-f*k;if(0>=f&&0<=g&&0>=k)return m=g/(g-k),b.copy(c).addScaledVector(sd,m);g=h*k-a*l;if(0>=g&&0<=l-h&&0<=a-k)return Ai.subVectors(e,d),m=(l-h)/(l-h+(a-k)),b.copy(d).addScaledVector(Ai,
-m);e=1/(g+f+m);d=f*e;m*=e;return b.copy(c).addScaledVector(rd,d).addScaledVector(sd,m)},equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});var Bi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,
-crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,
-floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,
-lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,
-moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,
-sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Fa={h:0,s:0,l:0},Ff={h:0,s:0,l:0};Object.assign(D.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===
-typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){a=O.euclideanModulo(a,1);b=O.clamp(b,0,1);c=O.clamp(c,0,1);0===b?this.r=this.g=this.b=c:(b=.5>=c?c*(1+b):c+b-c*b,c=2*c-b,this.r=Zf(c,b,a+1/3),this.g=Zf(c,b,a),this.b=Zf(c,b,a-1/3));return this},setStyle:function(a){function b(b){void 0!==
-b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
-Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+
-c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}return a&&0<a.length?this.setColorName(a):this},setColorName:function(a){var b=Bi[a];void 0!==b?this.setHex(b):console.warn("THREE.Color: Unknown color "+a);return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;
-this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(a){this.copyGammaToLinear(this,a);return this},convertLinearToGamma:function(a){this.copyLinearToGamma(this,a);return this},copySRGBToLinear:function(a){this.r=
-$f(a.r);this.g=$f(a.g);this.b=$f(a.b);return this},copyLinearToSRGB:function(a){this.r=ag(a.r);this.g=ag(a.g);this.b=ag(a.b);return this},convertSRGBToLinear:function(){this.copySRGBToLinear(this);return this},convertLinearToSRGB:function(){this.copyLinearToSRGB(this);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){void 0===a&&(console.warn("THREE.Color: .getHSL() target is now required"),
-a={h:0,s:0,l:0});var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var l=e-f;f=.5>=h?l/(e+f):l/(2-e-f);switch(e){case b:g=(c-d)/l+(c<d?6:0);break;case c:g=(d-b)/l+2;break;case d:g=(b-c)/l+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){this.getHSL(Fa);Fa.h+=a;Fa.s+=b;Fa.l+=c;this.setHSL(Fa.h,Fa.s,Fa.l);return this},add:function(a){this.r+=a.r;this.g+=
-a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=
-(a.b-this.b)*b;return this},lerpHSL:function(a,b){this.getHSL(Fa);a.getHSL(Ff);a=O.lerp(Fa.h,Ff.h,b);var c=O.lerp(Fa.s,Ff.s,b);b=O.lerp(Fa.l,Ff.l,b);this.setHSL(a,c,b);return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});D.NAMES=
-Bi;Object.assign(Ac.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var gj=0;K.prototype=Object.assign(Object.create(ua.prototype),{constructor:K,isMaterial:!0,
-onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=
-c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.sheen&&
-this.sheen.isColor&&(d.sheen=this.sheen.getHex());this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.emissiveIntensity&&1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearcoat&&(d.clearcoat=this.clearcoat);void 0!==this.clearcoatRoughness&&(d.clearcoatRoughness=this.clearcoatRoughness);this.clearcoatMap&&
-this.clearcoatMap.isTexture&&(d.clearcoatMap=this.clearcoatMap.toJSON(a).uuid);this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(d.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(a).uuid);this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(d.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(a).uuid,d.clearcoatNormalScale=this.clearcoatNormalScale.toArray());this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.matcap&&this.matcap.isTexture&&(d.matcap=
-this.matcap.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.aoMap&&this.aoMap.isTexture&&(d.aoMap=this.aoMap.toJSON(a).uuid,d.aoMapIntensity=this.aoMapIntensity);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalMapType=
-this.normalMapType,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=
-this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity,d.refractionRatio=this.refractionRatio,void 0!==this.combine&&(d.combine=this.combine),void 0!==this.envMapIntensity&&(d.envMapIntensity=this.envMapIntensity));this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&
-(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);this.vertexColors&&(d.vertexColors=!0);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;d.stencilWrite=this.stencilWrite;d.stencilWriteMask=this.stencilWriteMask;
-d.stencilFunc=this.stencilFunc;d.stencilRef=this.stencilRef;d.stencilFuncMask=this.stencilFuncMask;d.stencilFail=this.stencilFail;d.stencilZFail=this.stencilZFail;d.stencilZPass=this.stencilZPass;this.rotation&&0!==this.rotation&&(d.rotation=this.rotation);!0===this.polygonOffset&&(d.polygonOffset=!0);0!==this.polygonOffsetFactor&&(d.polygonOffsetFactor=this.polygonOffsetFactor);0!==this.polygonOffsetUnits&&(d.polygonOffsetUnits=this.polygonOffsetUnits);this.linewidth&&1!==this.linewidth&&(d.linewidth=
-this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);
-"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.morphNormals&&(d.morphNormals=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);!1===this.toneMapped&&(d.toneMapped=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=
-a.name;this.fog=a.fog;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.stencilWriteMask=a.stencilWriteMask;
-this.stencilFunc=a.stencilFunc;this.stencilRef=a.stencilRef;this.stencilFuncMask=a.stencilFuncMask;this.stencilFail=a.stencilFail;this.stencilZFail=a.stencilZFail;this.stencilZPass=a.stencilZPass;this.stencilWrite=a.stencilWrite;var b=a.clippingPlanes,c=null;if(null!==b){var d=b.length;c=Array(d);for(var e=0;e!==d;++e)c[e]=b[e].clone()}this.clippingPlanes=c;this.clipIntersection=a.clipIntersection;this.clipShadows=a.clipShadows;this.shadowSide=a.shadowSide;this.colorWrite=a.colorWrite;this.precision=
-a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.visible=a.visible;this.toneMapped=a.toneMapped;this.userData=JSON.parse(JSON.stringify(a.userData));return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(K.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});
-Pa.prototype=Object.create(K.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshBasicMaterial=!0;Pa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=
-a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};var Y=new p;Object.defineProperty(G.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(G.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.name=a.name;this.array=new a.array.constructor(a.array);
-this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new D);b[c++]=f.r;b[c++]=f.g;b[c++]=
-f.b}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new v);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=
-this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new R);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},applyMatrix3:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix3(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyMatrix4:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix4(a),
-this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyNormalMatrix:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyNormalMatrix(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},transformDirection:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.transformDirection(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*
-this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+
-1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),
-normalized:this.normalized}}});yd.prototype=Object.create(G.prototype);yd.prototype.constructor=yd;zd.prototype=Object.create(G.prototype);zd.prototype.constructor=zd;Ad.prototype=Object.create(G.prototype);Ad.prototype.constructor=Ad;Bd.prototype=Object.create(G.prototype);Bd.prototype.constructor=Bd;Xb.prototype=Object.create(G.prototype);Xb.prototype.constructor=Xb;Cd.prototype=Object.create(G.prototype);Cd.prototype.constructor=Cd;Yb.prototype=Object.create(G.prototype);Yb.prototype.constructor=
-Yb;B.prototype=Object.create(G.prototype);B.prototype.constructor=B;Dd.prototype=Object.create(G.prototype);Dd.prototype.constructor=Dd;Object.assign(rh.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,
-e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var l=[];for(var m=0;m<h;m++)l[m]={name:g[m].name,data:[]};this.morphTargets.position=l}var k=a.morphNormals,n=k.length;if(0<n){var p=[];for(m=0;m<n;m++)p[m]={name:k[m].name,data:[]};this.morphTargets.normal=p}var r=a.skinIndices,q=a.skinWeights,u=r.length===c.length,E=q.length===c.length;0<c.length&&0===b.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(m=0;m<b.length;m++){var x=
-b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var w=x.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=x.normal,this.normals.push(w,w,w));w=x.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=x.color,this.colors.push(w,w,w));!0===e&&(w=d[0][m],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new v,new v,new v)));!0===f&&(w=d[1][m],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",
-m),this.uvs2.push(new v,new v,new v)));for(w=0;w<h;w++){var y=g[w].vertices;l[w].data.push(y[x.a],y[x.b],y[x.c])}for(w=0;w<n;w++)y=k[w].vertexNormals[m],p[w].data.push(y.a,y.b,y.c);u&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);E&&this.skinWeights.push(q[x.a],q[x.b],q[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;
-null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this}});var hj=1,ob=new N,ch=new y,td=new p,Oa=new Va,we=new Va,oa=new p;F.prototype=Object.assign(Object.create(ua.prototype),{constructor:F,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<sh(a)?Yb:Xb)(a,1):this.index=a},getAttribute:function(a){return this.attributes[a]},setAttribute:function(a,
-b){this.attributes[a]=b;return this},deleteAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix4:function(a){var b=this.attributes.position;void 0!==b&&(b.applyMatrix4(a),b.needsUpdate=!0);b=this.attributes.normal;if(void 0!==b){var c=(new ya).getNormalMatrix(a);b.applyNormalMatrix(c);
-b.needsUpdate=!0}b=this.attributes.tangent;void 0!==b&&(b.transformDirection(a),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(a){ob.makeRotationX(a);this.applyMatrix4(ob);return this},rotateY:function(a){ob.makeRotationY(a);this.applyMatrix4(ob);return this},rotateZ:function(a){ob.makeRotationZ(a);this.applyMatrix4(ob);return this},translate:function(a,b,c){ob.makeTranslation(a,b,c);this.applyMatrix4(ob);
-return this},scale:function(a,b,c){ob.makeScale(a,b,c);this.applyMatrix4(ob);return this},lookAt:function(a){ch.lookAt(a);ch.updateMatrix();this.applyMatrix4(ch.matrix);return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(td).negate();this.translate(td.x,td.y,td.z);return this},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.setAttribute("position",a.copyVector3sArray(b.vertices));
-this.setAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,1),this.setAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,
-e.y,e.z||0)}this.setAttribute("position",new B(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=
-!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==
-c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new rh).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*
-a.vertices.length);this.setAttribute("position",(new G(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.setAttribute("normal",(new G(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.setAttribute("color",(new G(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.setAttribute("uv",(new G(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*
-a.uvs2.length),this.setAttribute("uv2",(new G(b,2)).copyVector2sArray(a.uvs2)));this.groups=a.groups;for(var c in a.morphTargets){b=[];for(var d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new B(3*g.data.length,3);h.name=g.name;b.push(h.copyVector3sArray(g.data))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.setAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.setAttribute("skinWeight",
-c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Va);var a=this.attributes.position,b=this.morphAttributes.position;if(void 0!==a){if(this.boundingBox.setFromBufferAttribute(a),b){a=0;for(var c=b.length;a<c;a++)Oa.setFromBufferAttribute(b[a]),this.morphTargetsRelative?(oa.addVectors(this.boundingBox.min,
-Oa.min),this.boundingBox.expandByPoint(oa),oa.addVectors(this.boundingBox.max,Oa.max),this.boundingBox.expandByPoint(oa)):(this.boundingBox.expandByPoint(Oa.min),this.boundingBox.expandByPoint(Oa.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===
-this.boundingSphere&&(this.boundingSphere=new eb);var a=this.attributes.position,b=this.morphAttributes.position;if(a){var c=this.boundingSphere.center;Oa.setFromBufferAttribute(a);if(b)for(var d=0,e=b.length;d<e;d++){var f=b[d];we.setFromBufferAttribute(f);this.morphTargetsRelative?(oa.addVectors(Oa.min,we.min),Oa.expandByPoint(oa),oa.addVectors(Oa.max,we.max),Oa.expandByPoint(oa)):(Oa.expandByPoint(we.min),Oa.expandByPoint(we.max))}Oa.getCenter(c);var g=0;d=0;for(e=a.count;d<e;d++)oa.fromBufferAttribute(a,
-d),g=Math.max(g,c.distanceToSquared(oa));if(b)for(d=0,e=b.length;d<e;d++){f=b[d];for(var h=this.morphTargetsRelative,l=0,m=f.count;l<m;l++)oa.fromBufferAttribute(f,l),h&&(td.fromBufferAttribute(a,l),oa.add(td)),g=Math.max(g,c.distanceToSquared(oa))}this.boundingSphere.radius=Math.sqrt(g);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},
-computeVertexNormals:function(){var a=this.index,b=this.attributes;if(b.position){var c=b.position.array;if(void 0===b.normal)this.setAttribute("normal",new G(new Float32Array(c.length),3));else for(var d=b.normal.array,e=0,f=d.length;e<f;e++)d[e]=0;d=b.normal.array;var g=new p,h=new p,l=new p,m=new p,k=new p;if(a){var n=a.array;e=0;for(f=a.count;e<f;e+=3){a=3*n[e+0];var t=3*n[e+1];var r=3*n[e+2];g.fromArray(c,a);h.fromArray(c,t);l.fromArray(c,r);m.subVectors(l,h);k.subVectors(g,h);m.cross(k);d[a]+=
-m.x;d[a+1]+=m.y;d[a+2]+=m.z;d[t]+=m.x;d[t+1]+=m.y;d[t+2]+=m.z;d[r]+=m.x;d[r+1]+=m.y;d[r+2]+=m.z}}else for(e=0,f=c.length;e<f;e+=9)g.fromArray(c,e),h.fromArray(c,e+3),l.fromArray(c,e+6),m.subVectors(l,h),k.subVectors(g,h),m.cross(k),d[e]=m.x,d[e+1]=m.y,d[e+2]=m.z,d[e+3]=m.x,d[e+4]=m.y,d[e+5]=m.z,d[e+6]=m.x,d[e+7]=m.y,d[e+8]=m.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
-var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d]){var e=c[d].array,f=a.attributes[d],g=f.array,h=f.itemSize*b;f=Math.min(g.length,e.length-h);for(var l=0;l<f;l++,h++)e[h]=g[l]}return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b=0,c=a.count;b<c;b++)oa.x=a.getX(b),oa.y=a.getY(b),oa.z=a.getZ(b),oa.normalize(),a.setXYZ(b,oa.x,oa.y,oa.z)},toNonIndexed:function(){function a(a,
-b){var c=a.array,d=a.itemSize;a=a.normalized;for(var e=new c.constructor(b.length*d),f,g=0,h=0,l=b.length;h<l;h++){f=b[h]*d;for(var m=0;m<d;m++)e[g++]=c[f++]}return new G(e,d,a)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var b=new F,c=this.index.array,d=this.attributes,e;for(e in d){var f=d[e];f=a(f,c);b.setAttribute(e,f)}var g=this.morphAttributes;for(e in g){var h=[],l=g[e];d=0;for(var m=l.length;d<m;d++)f=l[d],f=a(f,c),
-h.push(f);b.morphAttributes[e]=h}b.morphTargetsRelative=this.morphTargetsRelative;c=this.groups;d=0;for(e=c.length;d<e;d++)f=c[d],b.addGroup(f.start,f.count,f.materialIndex);return b},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);0<Object.keys(this.userData).length&&(a.userData=this.userData);if(void 0!==this.parameters){var b=this.parameters;for(m in b)void 0!==b[m]&&(a[m]=
-b[m]);return a}a.data={attributes:{}};b=this.index;null!==b&&(a.data.index={type:b.array.constructor.name,array:Array.prototype.slice.call(b.array)});var c=this.attributes;for(m in c){b=c[m];var d=b.toJSON();""!==b.name&&(d.name=b.name);a.data.attributes[m]=d}c={};var e=!1;for(m in this.morphAttributes){for(var f=this.morphAttributes[m],g=[],h=0,l=f.length;h<l;h++)b=f[h],d=b.toJSON(),""!==b.name&&(d.name=b.name),g.push(d);0<g.length&&(c[m]=g,e=!0)}e&&(a.data.morphAttributes=c,a.data.morphTargetsRelative=
-this.morphTargetsRelative);var m=this.groups;0<m.length&&(a.data.groups=JSON.parse(JSON.stringify(m)));m=this.boundingSphere;null!==m&&(a.data.boundingSphere={center:m.center.toArray(),radius:m.radius});return a},clone:function(){return(new F).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.setAttribute(g,
-c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}this.morphTargetsRelative=a.morphTargetsRelative;var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;
-return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var Ci=new N,rc=new Wb,dh=new eb,Db=new p,Eb=new p,Fb=new p,bg=new p,cg=new p,dg=new p,Ge=new p,He=new p,Ie=new p,Bc=new v,Cc=new v,Dc=new v,Ed=new p,Ee=new p;ea.prototype=Object.assign(Object.create(y.prototype),{constructor:ea,isMesh:!0,copy:function(a){y.prototype.copy.call(this,a);void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=
-Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},
-raycast:function(a,b){var c=this.geometry,d=this.material,e=this.matrixWorld;if(void 0!==d&&(null===c.boundingSphere&&c.computeBoundingSphere(),dh.copy(c.boundingSphere),dh.applyMatrix4(e),!1!==a.ray.intersectsSphere(dh)&&(Ci.getInverse(e),rc.copy(a.ray).applyMatrix4(Ci),null===c.boundingBox||!1!==rc.intersectsBox(c.boundingBox))))if(c.isBufferGeometry){var f=c.index;e=c.attributes.position;var g=c.morphAttributes.position,h=c.morphTargetsRelative,l=c.attributes.uv,m=c.attributes.uv2,k=c.groups,n=
-c.drawRange,p,r;if(null!==f)if(Array.isArray(d)){var q=0;for(p=k.length;q<p;q++){var u=k[q];var E=d[u.materialIndex];var x=Math.max(u.start,n.start);for(r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){c=f.getX(x);var w=f.getX(x+1);var y=f.getX(x+2);if(c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}}}else for(x=Math.max(0,n.start),c=Math.min(f.count,n.start+n.count),q=x,p=c;q<p;q+=3){if(c=f.getX(q),w=f.getX(q+1),y=f.getX(q+2),c=
-Fe(this,d,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(void 0!==e)if(Array.isArray(d))for(q=0,p=k.length;q<p;q++)for(u=k[q],E=d[u.materialIndex],x=Math.max(u.start,n.start),r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){if(c=x,w=x+1,y=x+2,c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}else for(x=Math.max(0,n.start),c=Math.min(e.count,n.start+n.count),q=x,p=c;q<p;q+=3)if(c=q,w=q+1,y=q+2,c=Fe(this,d,a,rc,e,
-g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(c.isGeometry)for(e=Array.isArray(d),g=c.vertices,h=c.faces,c=c.faceVertexUvs[0],0<c.length&&(f=c),n=0,q=h.length;n<q;n++)if(p=h[n],c=e?d[p.materialIndex]:d,void 0!==c&&(l=g[p.a],m=g[p.b],k=g[p.c],c=th(this,c,a,rc,l,m,k,Ed)))f&&f[n]&&(u=f[n],Bc.copy(u[0]),Cc.copy(u[1]),Dc.copy(u[2]),c.uv=pa.getUV(Ed,l,m,k,Bc,Cc,Dc,new v)),c.face=p,c.faceIndex=n,b.push(c)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
-var ij=0,pb=new N,eh=new y,Gf=new p;L.prototype=Object.assign(Object.create(ua.prototype),{constructor:L,isGeometry:!0,applyMatrix4:function(a){for(var b=(new ya).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&
-this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(a){pb.makeRotationX(a);this.applyMatrix4(pb);return this},rotateY:function(a){pb.makeRotationY(a);this.applyMatrix4(pb);return this},rotateZ:function(a){pb.makeRotationZ(a);this.applyMatrix4(pb);return this},translate:function(a,b,c){pb.makeTranslation(a,b,c);this.applyMatrix4(pb);return this},scale:function(a,b,c){pb.makeScale(a,b,c);this.applyMatrix4(pb);return this},lookAt:function(a){eh.lookAt(a);
-eh.updateMatrix();this.applyMatrix4(eh.matrix);return this},fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0===h?[]:[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()],k=void 0===g?[]:[(new p).fromArray(g,3*a),(new p).fromArray(g,3*b),(new p).fromArray(g,3*d)];e=new Ac(a,b,d,k,f,e);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([(new v).fromArray(l,2*a),(new v).fromArray(l,2*b),(new v).fromArray(l,2*d)]);void 0!==m&&c.faceVertexUvs[1].push([(new v).fromArray(m,2*a),(new v).fromArray(m,
-2*b),(new v).fromArray(m,2*d)])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes;if(void 0===e.position)return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."),this;var f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(e=0;e<f.length;e+=3)c.vertices.push((new p).fromArray(f,
-e)),void 0!==h&&c.colors.push((new D).fromArray(h,e));var k=a.groups;if(0<k.length)for(e=0;e<k.length;e++){f=k[e];var n=f.start,t=n;for(n+=f.count;t<n;t+=3)void 0!==d?b(d[t],d[t+1],d[t+2],f.materialIndex):b(t,t+1,t+2,f.materialIndex)}else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());
-return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(Gf).negate();this.translate(Gf.x,Gf.y,Gf.z);return this},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius;b=0===b?1:1/b;var c=new N;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix4(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];
-a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var l=this.vertices[b.c];e.subVectors(l,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),
-a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<
-a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);
-var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new L;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=
-new p;var l={a:new p,b:new p,c:new p};d.push(h);g.push(l)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],l=g.vertexNormals[c],h.copy(d.normal),l.a.copy(d.vertexNormals[0]),l.b.copy(d.vertexNormals[1]),l.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Va);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new eb);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,l=a.faces,m=this.colors,k=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ya).getNormalMatrix(b));for(var n=0,p=g.length;n<p;n++){var r=g[n].clone();void 0!==
-b&&r.applyMatrix4(b);f.push(r)}n=0;for(p=k.length;n<p;n++)m.push(k[n].clone());n=0;for(p=l.length;n<p;n++){g=l[n];var q=g.vertexNormals;k=g.vertexColors;m=new Ac(g.a+e,g.b+e,g.c+e);m.normal.copy(g.normal);void 0!==d&&m.normal.applyMatrix3(d).normalize();b=0;for(f=q.length;b<f;b++)r=q[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),m.vertexNormals.push(r);m.color.copy(g.color);b=0;for(f=k.length;b<f;b++)r=k[b],m.vertexColors.push(r.clone());m.materialIndex=g.materialIndex+c;h.push(m)}n=0;for(p=
-a.faceVertexUvs.length;n<p;n++)for(c=a.faceVertexUvs[n],void 0===this.faceVertexUvs[n]&&(this.faceVertexUvs[n]=[]),b=0,f=c.length;b<f;b++){d=c[b];e=[];h=0;for(l=d.length;h<l;h++)e.push(d[h].clone());this.faceVertexUvs[n].push(e)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",
-a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=
-this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&
-e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==m[b])return m[b];m[b]=l.length/3;l.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=k.length;k.push(a.getHex());return n[b]}function d(a){var b=
-a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}h=[];var l=[],m={},k=[],n={},p=[],r={};for(g=0;g<this.faces.length;g++){var q=
-this.faces[g],u=void 0!==this.faceVertexUvs[0][g],v=0<q.normal.length(),x=0<q.vertexNormals.length,w=1!==q.color.r||1!==q.color.g||1!==q.color.b,y=0<q.vertexColors.length,A=0;A=a(A,0,0);A=a(A,1,!0);A=a(A,2,!1);A=a(A,3,u);A=a(A,4,v);A=a(A,5,x);A=a(A,6,w);A=a(A,7,y);h.push(A);h.push(q.a,q.b,q.c);h.push(q.materialIndex);u&&(u=this.faceVertexUvs[0][g],h.push(d(u[0]),d(u[1]),d(u[2])));v&&h.push(b(q.normal));x&&(v=q.vertexNormals,h.push(b(v[0]),b(v[1]),b(v[2])));w&&h.push(c(q.color));y&&(q=q.vertexColors,
-h.push(c(q[0]),c(q[1]),c(q[2])))}e.data={};e.data.vertices=f;e.data.normals=l;0<k.length&&(e.data.colors=k);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new L).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<
-b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],l=[];var m=0;for(d=h.length;m<d;m++)l.push(h[m].clone());this.faceVertexUvs[f].push(l)}}m=a.morphTargets;f=0;for(b=m.length;f<b;f++){d={};d.name=m[f].name;if(void 0!==
-m[f].vertices)for(d.vertices=[],e=0,c=m[f].vertices.length;e<c;e++)d.vertices.push(m[f].vertices[e].clone());if(void 0!==m[f].normals)for(d.normals=[],e=0,c=m[f].normals.length;e<c;e++)d.normals.push(m[f].normals[e].clone());this.morphTargets.push(d)}m=a.morphNormals;f=0;for(b=m.length;f<b;f++){d={};if(void 0!==m[f].vertexNormals)for(d.vertexNormals=[],e=0,c=m[f].vertexNormals.length;e<c;e++)g=m[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==
-m[f].faceNormals)for(d.faceNormals=[],e=0,c=m[f].faceNormals.length;e<c;e++)d.faceNormals.push(m[f].faceNormals[e].clone());this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=
-a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var fh=function(a){function b(b,d,e,f,g,h){a.call(this);this.type="BoxGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,
-depthSegments:h};this.fromBufferGeometry(new Gd(b,d,e,f,g,h));this.mergeVertices()}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(L),Gd=function(a){function b(b,d,e,f,g,h){function c(a,b,c,d,e,f,g,h,l,z,v){var w=f/l,x=g/z,y=f/2,A=g/2,E=h/2;g=l+1;for(var C=z+1,B=f=0,D=new p,F=0;F<C;F++)for(var G=F*x-A,H=0;H<g;H++)D[a]=(H*w-y)*d,D[b]=G*e,D[c]=E,n.push(D.x,D.y,D.z),D[a]=0,D[b]=0,D[c]=0<h?1:-1,t.push(D.x,D.y,D.z),r.push(H/l),r.push(1-F/z),f+=1;for(a=0;a<
-z;a++)for(b=0;b<l;b++)c=q+b+g*(a+1),d=q+(b+1)+g*(a+1),e=q+(b+1)+g*a,k.push(q+b+g*a,c,e),k.push(c,d,e),B+=6;m.addGroup(u,B,v);u+=B;q+=f}a.call(this);this.type="BoxBufferGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,depthSegments:h};var m=this;b=b||1;d=d||1;e=e||1;f=Math.floor(f)||1;g=Math.floor(g)||1;h=Math.floor(h)||1;var k=[],n=[],t=[],r=[],q=0,u=0;c("z","y","x",-1,-1,e,d,b,h,g,0);c("z","y","x",1,-1,e,d,-b,h,g,1);c("x","z","y",1,1,b,e,d,f,h,2);c("x","z","y",
-1,-1,b,e,-d,f,h,3);c("x","y","z",1,-1,b,d,e,f,g,4);c("x","y","z",-1,-1,b,d,-e,f,g,5);this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(F),Oh={clone:Ec,merge:wa};Ca.prototype=Object.create(K.prototype);Ca.prototype.constructor=Ca;Ca.prototype.isShaderMaterial=!0;Ca.prototype.copy=function(a){K.prototype.copy.call(this,a);this.fragmentShader=
-a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ec(a.uniforms);this.defines=Object.assign({},a.defines);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=Object.assign({},a.extensions);return this};Ca.prototype.toJSON=function(a){var b=K.prototype.toJSON.call(this,a);b.uniforms={};for(var c in this.uniforms){var d=
-this.uniforms[c].value;b.uniforms[c]=d&&d.isTexture?{type:"t",value:d.toJSON(a).uuid}:d&&d.isColor?{type:"c",value:d.getHex()}:d&&d.isVector2?{type:"v2",value:d.toArray()}:d&&d.isVector3?{type:"v3",value:d.toArray()}:d&&d.isVector4?{type:"v4",value:d.toArray()}:d&&d.isMatrix3?{type:"m3",value:d.toArray()}:d&&d.isMatrix4?{type:"m4",value:d.toArray()}:{value:d}}0<Object.keys(this.defines).length&&(b.defines=this.defines);b.vertexShader=this.vertexShader;b.fragmentShader=this.fragmentShader;a={};for(var e in this.extensions)!0===
-this.extensions[e]&&(a[e]=!0);0<Object.keys(a).length&&(b.extensions=a);return b};fb.prototype=Object.assign(Object.create(y.prototype),{constructor:fb,isCamera:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);this.projectionMatrixInverse.copy(a.projectionMatrixInverse);return this},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),
-a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(-b[8],-b[9],-b[10]).normalize()},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(a,b){y.prototype.updateWorldMatrix.call(this,a,b);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});P.prototype=Object.assign(Object.create(fb.prototype),{constructor:P,
-isPerspectiveCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*O.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*O.DEG2RAD*this.fov);return.5*this.getFilmHeight()/
-a},getEffectiveFOV:function(){return 2*O.RAD2DEG*Math.atan(Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=
-d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled){var g=f.fullWidth,h=f.fullHeight;e+=f.offsetX*d/g;b-=f.offsetY*c/h;d*=f.width/g;c*=f.height/h}f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,
-e+d,b,b-c,a,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Fc.prototype=Object.create(y.prototype);Fc.prototype.constructor=Fc;Zb.prototype=
-Object.create(Ba.prototype);Zb.prototype.constructor=Zb;Zb.prototype.isWebGLCubeRenderTarget=!0;Zb.prototype.fromEquirectangularTexture=function(a,b){this.texture.type=b.type;this.texture.format=b.format;this.texture.encoding=b.encoding;var c=new zc,d=new Ca({type:"CubemapFromEquirect",uniforms:Ec({tEquirect:{value:null}}),vertexShader:"varying vec3 vWorldDirection;\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
-fragmentShader:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}",side:1,blending:0});d.uniforms.tEquirect.value=b;b=new ea(new Gd(5,5,5),d);c.add(b);(new Fc(1,10,this)).update(a,c);b.geometry.dispose();b.material.dispose();return this};$b.prototype=Object.create(W.prototype);$b.prototype.constructor=$b;$b.prototype.isDataTexture=
-!0;var ud=new eb,Hf=new p;Object.assign(Gc.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromProjectionMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=
-c[13],v=c[14];c=c[15];b[0].setComponents(f-a,m-g,r-k,c-q).normalize();b[1].setComponents(f+a,m+g,r+k,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+u).normalize();b[3].setComponents(f-d,m-h,r-n,c-u).normalize();b[4].setComponents(f-e,m-l,r-p,c-v).normalize();b[5].setComponents(f+e,m+l,r+p,c+v).normalize();return this},intersectsObject:function(a){var b=a.geometry;null===b.boundingSphere&&b.computeBoundingSphere();ud.copy(b.boundingSphere).applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},
-intersectsSprite:function(a){ud.center.set(0,0,0);ud.radius=.7071067811865476;ud.applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(a){for(var b=this.planes,c=0;6>c;c++){var d=b[c];Hf.x=0<d.normal.x?a.max.x:a.min.x;Hf.y=0<d.normal.y?a.max.y:a.min.y;Hf.z=0<d.normal.z?a.max.z:a.min.z;if(0>d.distanceToPoint(Hf))return!1}return!0},
-containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var A={common:{diffuse:{value:new D(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ya},uv2Transform:{value:new ya},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},
-lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new v(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new D(16777215)}},
-lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},
-spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new D(15658734)},opacity:{value:1},
-size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}},sprite:{diffuse:{value:new D(15658734)},opacity:{value:1},center:{value:new v(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}}};Fd.prototype=Object.create(L.prototype);Fd.prototype.constructor=Fd;ac.prototype=Object.create(F.prototype);ac.prototype.constructor=ac;var M={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
-alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",
-aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha  = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",
-bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",
-clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",
-clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",
-color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n  return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",
-cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n    vec3 absDirection = abs(direction);\n    float face = -1.0;\n    if (absDirection.x > absDirection.z) {\n      if (absDirection.x > absDirection.y)\n        face = direction.x > 0.0 ? 0.0 : 3.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    } else {\n      if (absDirection.z > absDirection.y)\n        face = direction.z > 0.0 ? 2.0 : 5.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    }\n    return face;\n}\nvec2 getUV(vec3 direction, float face) {\n    vec2 uv;\n    if (face == 0.0) {\n      uv = vec2(direction.z, direction.y) / abs(direction.x);    } else if (face == 1.0) {\n      uv = vec2(-direction.x, -direction.z) / abs(direction.y);    } else if (face == 2.0) {\n      uv = vec2(-direction.x, direction.y) / abs(direction.z);    } else if (face == 3.0) {\n      uv = vec2(-direction.z, direction.y) / abs(direction.x);    } else if (face == 4.0) {\n      uv = vec2(-direction.x, direction.z) / abs(direction.y);    } else {\n      uv = vec2(direction.x, direction.y) / abs(direction.z);    }\n    return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n  float face = getFace(direction);\n  float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n  mipInt = max(mipInt, cubeUV_minMipLevel);\n  float faceSize = exp2(mipInt);\n  float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n  vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n  vec2 f = fract(uv);\n  uv += 0.5 - f;\n  if (face > 2.0) {\n    uv.y += faceSize;\n    face -= 3.0;\n  }\n  uv.x += face * faceSize;\n  if(mipInt < cubeUV_maxMipLevel){\n    uv.y += 2.0 * cubeUV_maxTileSize;\n  }\n  uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n  uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n  uv *= texelSize;\n  vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x += texelSize;\n  vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.y += texelSize;\n  vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x -= texelSize;\n  vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  vec3 tm = mix(tl, tr, f.x);\n  vec3 bm = mix(bl, br, f.x);\n  return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n  float mip = 0.0;\n  if (roughness >= r1) {\n    mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n  } else if (roughness >= r4) {\n    mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n  } else if (roughness >= r5) {\n    mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n  } else if (roughness >= r6) {\n    mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n  } else {\n    mip = -2.0 * log2(1.16 * roughness);  }\n  return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n  float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n  float mipF = fract(mip);\n  float mipInt = floor(mip);\n  vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n  if (mipF == 0.0) {\n    return vec4(color0, 1.0);\n  } else {\n    vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n    return vec4(mix(color0, color1, mipF), 1.0);\n  }\n}\n#endif",
-defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",
-displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",
-emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t}  else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",
-envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",
-envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t  vec3 reflectVec = reflect( -viewDir, normal );\n\t\t  reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t  vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",
-envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",
-fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
-gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",
-lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",
-lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",
-lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",
-lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",
-lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",
-lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",
-lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",
-lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",
-lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",
-logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",
-map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",
-map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",
-morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
-morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",
-normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",
-normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",
-normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",
-clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",
-premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",
-roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",
-shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",
-shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",
-skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",
-skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",
-specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",
-uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
-background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
-cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",
-depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",
-distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",
-distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",
-equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
-linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
-linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
-meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
-meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",
-meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
-meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
-meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
-meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
-normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",
-normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
-points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
-points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
-shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
-sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
-sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
-gb={basic:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.fog]),vertexShader:M.meshbasic_vert,fragmentShader:M.meshbasic_frag},lambert:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.fog,A.lights,{emissive:{value:new D(0)}}]),vertexShader:M.meshlambert_vert,fragmentShader:M.meshlambert_frag},phong:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.fog,A.lights,{emissive:{value:new D(0)},
-specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshphong_vert,fragmentShader:M.meshphong_frag},standard:{uniforms:wa([A.common,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.roughnessmap,A.metalnessmap,A.fog,A.lights,{emissive:{value:new D(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag},toon:{uniforms:wa([A.common,A.specularmap,A.aomap,A.lightmap,
-A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.gradientmap,A.fog,A.lights,{emissive:{value:new D(0)},specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshtoon_vert,fragmentShader:M.meshtoon_frag},matcap:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,A.fog,{matcap:{value:null}}]),vertexShader:M.meshmatcap_vert,fragmentShader:M.meshmatcap_frag},points:{uniforms:wa([A.points,A.fog]),vertexShader:M.points_vert,fragmentShader:M.points_frag},dashed:{uniforms:wa([A.common,
-A.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:M.linedashed_vert,fragmentShader:M.linedashed_frag},depth:{uniforms:wa([A.common,A.displacementmap]),vertexShader:M.depth_vert,fragmentShader:M.depth_frag},normal:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,{opacity:{value:1}}]),vertexShader:M.normal_vert,fragmentShader:M.normal_frag},sprite:{uniforms:wa([A.sprite,A.fog]),vertexShader:M.sprite_vert,fragmentShader:M.sprite_frag},background:{uniforms:{uvTransform:{value:new ya},
-t2D:{value:null}},vertexShader:M.background_vert,fragmentShader:M.background_frag},cube:{uniforms:wa([A.envmap,{opacity:{value:1}}]),vertexShader:M.cube_vert,fragmentShader:M.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:M.equirect_vert,fragmentShader:M.equirect_frag},distanceRGBA:{uniforms:wa([A.common,A.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:M.distanceRGBA_vert,fragmentShader:M.distanceRGBA_frag},shadow:{uniforms:wa([A.lights,
-A.fog,{color:{value:new D(0)},opacity:{value:1}}]),vertexShader:M.shadow_vert,fragmentShader:M.shadow_frag}};gb.physical={uniforms:wa([gb.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new v(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new D(0)},transparency:{value:0}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag};qb.prototype=Object.create(W.prototype);qb.prototype.constructor=
-qb;qb.prototype.isCubeTexture=!0;Object.defineProperty(qb.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});Hc.prototype=Object.create(W.prototype);Hc.prototype.constructor=Hc;Hc.prototype.isDataTexture2DArray=!0;Ic.prototype=Object.create(W.prototype);Ic.prototype.constructor=Ic;Ic.prototype.isDataTexture3D=!0;var Bh=new W,Ej=new Hc,Gj=new Ic,Ch=new qb,vh=[],xh=[],Ah=new Float32Array(16),zh=new Float32Array(9),yh=new Float32Array(4);Dh.prototype.updateCache=function(a){var b=
-this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));Ja(b,a)};Eh.prototype.setValue=function(a,b,c){for(var d=this.seq,e=0,f=d.length;e!==f;++e){var g=d[e];g.setValue(a,b[g.id],c)}};var eg=/([\w\d_]+)(\])?(\[|\.)?/g;Gb.prototype.setValue=function(a,b,c,d){b=this.map[b];void 0!==b&&b.setValue(a,c,d)};Gb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],
-h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lk=0,gg=/^[ \t]*#include +<([\w\d./]+)>/gm,Nh=/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Mh=/#pragma unroll_loop_start[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}[\s]+?#pragma unroll_loop_end/g,vk=0;Hb.prototype=Object.create(K.prototype);Hb.prototype.constructor=
-Hb;Hb.prototype.isMeshDepthMaterial=!0;Hb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Ib.prototype=Object.create(K.prototype);Ib.prototype.constructor=
-Ib;Ib.prototype.isMeshDistanceMaterial=!0;Ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Le.prototype=Object.assign(Object.create(P.prototype),
-{constructor:Le,isArrayCamera:!0});Kc.prototype=Object.assign(Object.create(y.prototype),{constructor:Kc,isGroup:!0});Object.assign(Me.prototype,{constructor:Me,getTargetRaySpace:function(){null===this._targetRay&&(this._targetRay=new Kc,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1);return this._targetRay},getGripSpace:function(){null===this._grip&&(this._grip=new Kc,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1);return this._grip},dispatchEvent:function(a){null!==this._targetRay&&
-this._targetRay.dispatchEvent(a);null!==this._grip&&this._grip.dispatchEvent(a);return this},disconnect:function(a){this.dispatchEvent({type:"disconnected",data:a});null!==this._targetRay&&(this._targetRay.visible=!1);null!==this._grip&&(this._grip.visible=!1);return this},update:function(a,b,c){var d=null,e=null,f=this._targetRay,g=this._grip;a&&(null!==f&&(d=b.getPose(a.targetRaySpace,c),null!==d&&(f.matrix.fromArray(d.transform.matrix),f.matrix.decompose(f.position,f.rotation,f.scale))),null!==
-g&&a.gripSpace&&(e=b.getPose(a.gripSpace,c),null!==e&&(g.matrix.fromArray(e.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale))));null!==f&&(f.visible=null!==d);null!==g&&(g.visible=null!==e);return this}});Object.assign(Uh.prototype,ua.prototype);Object.assign(Ne.prototype,{isFogExp2:!0,clone:function(){return new Ne(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}});Object.assign(Oe.prototype,{isFog:!0,clone:function(){return new Oe(this.color,
-this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}});Object.defineProperty(rb.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(rb.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.stride;
-c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});var sc=new p;Object.defineProperties(Kd.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(Kd.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(a){for(var b=
-0,c=this.data.count;b<c;b++)sc.x=this.getX(b),sc.y=this.getY(b),sc.z=this.getZ(b),sc.applyMatrix4(a),this.setXYZ(b,sc.x,sc.y,sc.z);return this},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*
-this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},
-setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this},clone:function(){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return new G(new this.array.constructor(a),this.itemSize,this.normalized)},
-toJSON:function(){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return{itemSize:this.itemSize,type:this.array.constructor.name,array:a,normalized:this.normalized}}});Kb.prototype=Object.create(K.prototype);Kb.prototype.constructor=Kb;Kb.prototype.isSpriteMaterial=!0;Kb.prototype.copy=function(a){K.prototype.copy.call(this,
-a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.rotation=a.rotation;this.sizeAttenuation=a.sizeAttenuation;return this};var Lc,xe=new p,vd=new p,wd=new p,Mc=new v,Md=new v,Wh=new N,If=new p,ye=new p,Jf=new p,Di=new v,gh=new v,Ei=new v;Ld.prototype=Object.assign(Object.create(y.prototype),{constructor:Ld,isSprite:!0,raycast:function(a,b){null===a.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');vd.setFromMatrixScale(this.matrixWorld);
-Wh.copy(a.camera.matrixWorld);this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse,this.matrixWorld);wd.setFromMatrixPosition(this.modelViewMatrix);a.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&vd.multiplyScalar(-wd.z);var c=this.material.rotation;if(0!==c){var d=Math.cos(c);var e=Math.sin(c)}c=this.center;Pe(If.set(-.5,-.5,0),wd,c,vd,e,d);Pe(ye.set(.5,-.5,0),wd,c,vd,e,d);Pe(Jf.set(.5,.5,0),wd,c,vd,e,d);Di.set(0,0);gh.set(1,0);Ei.set(1,1);var f=a.ray.intersectTriangle(If,
-ye,Jf,!1,xe);if(null===f&&(Pe(ye.set(-.5,.5,0),wd,c,vd,e,d),gh.set(0,1),f=a.ray.intersectTriangle(If,Jf,ye,!1,xe),null===f))return;e=a.ray.origin.distanceTo(xe);e<a.near||e>a.far||b.push({distance:e,point:xe.clone(),uv:pa.getUV(xe,If,ye,Jf,Di,gh,Ei,new v),face:null,object:this})},clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){y.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});var Kf=new p,Fi=new p;Nd.prototype=Object.assign(Object.create(y.prototype),
-{constructor:Nd,isLOD:!0,copy:function(a){y.prototype.copy.call(this,a,!1);for(var b=a.levels,c=0,d=b.length;c<d;c++){var e=b[c];this.addLevel(e.object.clone(),e.distance)}this.autoUpdate=a.autoUpdate;return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a);return this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(a){var b=this.levels;if(0<
-b.length){for(var c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object}return null},raycast:function(a,b){if(0<this.levels.length){Kf.setFromMatrixPosition(this.matrixWorld);var c=a.ray.origin.distanceTo(Kf);this.getObjectForDistance(c).raycast(a,b)}},update:function(a){var b=this.levels;if(1<b.length){Kf.setFromMatrixPosition(a.matrixWorld);Fi.setFromMatrixPosition(this.matrixWorld);a=Kf.distanceTo(Fi)/a.zoom;b[0].object.visible=!0;for(var c=1,d=b.length;c<d;c++)if(a>=b[c].distance)b[c-
-1].object.visible=!1,b[c].object.visible=!0;else break;for(this._currentLevel=c-1;c<d;c++)b[c].object.visible=!1}},toJSON:function(a){a=y.prototype.toJSON.call(this,a);!1===this.autoUpdate&&(a.object.autoUpdate=!1);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Qe.prototype=Object.assign(Object.create(ea.prototype),{constructor:Qe,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&
-(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var a=new R,b=this.geometry.attributes.skinWeight,c=0,d=b.count;c<d;c++){a.x=b.getX(c);a.y=b.getY(c);a.z=b.getZ(c);a.w=b.getW(c);var e=1/a.manhattanLength();Infinity!==e?a.multiplyScalar(e):a.set(1,0,0,0);b.setXYZW(c,a.x,a.y,a.z,a.w)}},updateMatrixWorld:function(a){ea.prototype.updateMatrixWorld.call(this,
-a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)},boneTransform:function(){var a=new p,b=new R,c=new R,d=new p,e=new N;return function(f,g){var h=this.skeleton,l=this.geometry;b.fromBufferAttribute(l.attributes.skinIndex,f);c.fromBufferAttribute(l.attributes.skinWeight,
-f);a.fromBufferAttribute(l.attributes.position,f).applyMatrix4(this.bindMatrix);g.set(0,0,0);for(f=0;4>f;f++)if(l=c.getComponent(f),0!==l){var m=b.getComponent(f);e.multiplyMatrices(h.bones[m].matrixWorld,h.boneInverses[m]);g.addScaledVector(d.copy(a).applyMatrix4(e),l)}return g.applyMatrix4(this.bindMatrixInverse)}}()});var Gi=new N,Qk=new N;Object.assign(Re.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new N;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);
-this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){for(var a=this.bones,b=this.boneInverses,c=this.boneMatrices,d=this.boneTexture,e=0,f=
-a.length;e<f;e++)Gi.multiplyMatrices(a[e]?a[e].matrixWorld:Qk,b[e]),Gi.toArray(c,16*e);void 0!==d&&(d.needsUpdate=!0)},clone:function(){return new Re(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}},dispose:function(){this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=void 0)}});kg.prototype=Object.assign(Object.create(y.prototype),{constructor:kg,isBone:!0});var Hi=new N,Ii=new N,Lf=[],ze=new ea;
-Se.prototype=Object.assign(Object.create(ea.prototype),{constructor:Se,isInstancedMesh:!0,getMatrixAt:function(a,b){b.fromArray(this.instanceMatrix.array,16*a)},raycast:function(a,b){var c=this.matrixWorld,d=this.count;ze.geometry=this.geometry;ze.material=this.material;if(void 0!==ze.material)for(var e=0;e<d;e++){this.getMatrixAt(e,Hi);Ii.multiplyMatrices(c,Hi);ze.matrixWorld=Ii;ze.raycast(a,Lf);for(var f=0,g=Lf.length;f<g;f++){var h=Lf[f];h.instanceId=e;h.object=this;b.push(h)}Lf.length=0}},setMatrixAt:function(a,
-b){b.toArray(this.instanceMatrix.array,16*a)},updateMorphTargets:function(){}});da.prototype=Object.create(K.prototype);da.prototype.constructor=da;da.prototype.isLineBasicMaterial=!0;da.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;this.morphTargets=a.morphTargets;return this};var Ji=new p,Ki=new p,Li=new N,Mf=new Wb,Ae=new eb;La.prototype=Object.assign(Object.create(y.prototype),{constructor:La,
-isLine:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[0],d=1,e=b.count;d<e;d++)Ji.fromBufferAttribute(b,d-1),Ki.fromBufferAttribute(b,d),c[d]=c[d-1],c[d]+=Ji.distanceTo(Ki);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,c[0]=0,d=1,e=b.length;d<e;d++)c[d]=
-c[d-1],c[d]+=b[d-1].distanceTo(b[d]);return this},raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Line.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Ae.copy(c.boundingSphere);Ae.applyMatrix4(d);Ae.radius+=e;if(!1!==a.ray.intersectsSphere(Ae)){Li.getInverse(d);Mf.copy(a.ray).applyMatrix4(Li);d=e/((this.scale.x+this.scale.y+this.scale.z)/3);d*=d;var f=new p,g=new p;e=new p;var h=new p,l=this&&this.isLineSegments?2:1;if(c.isBufferGeometry){var m=c.index,k=c.attributes.position.array;
-if(null!==m){m=m.array;c=0;for(var n=m.length-1;c<n;c+=l){var t=m[c+1];f.fromArray(k,3*m[c]);g.fromArray(k,3*t);t=Mf.distanceSqToSegment(f,g,h,e);t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}}else for(c=0,n=k.length/3-1;c<n;c+=l)f.fromArray(k,3*c),g.fromArray(k,3*c+3),t=Mf.distanceSqToSegment(f,g,h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),
-t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}else if(c.isGeometry)for(f=c.vertices,g=f.length,c=0;c<g-1;c+=l)t=Mf.distanceSqToSegment(f[c],f[c+1],h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=
-a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
-var Nf=new p,Of=new p;ma.prototype=Object.assign(Object.create(La.prototype),{constructor:ma,isLineSegments:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[],d=0,e=b.count;d<e;d+=2)Nf.fromBufferAttribute(b,d),Of.fromBufferAttribute(b,d+1),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
-else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,d=0,e=b.length;d<e;d+=2)Nf.copy(b[d]),Of.copy(b[d+1]),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);return this}});Te.prototype=Object.assign(Object.create(La.prototype),{constructor:Te,isLineLoop:!0});Xa.prototype=Object.create(K.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isPointsMaterial=!0;Xa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.size=a.size;
-this.sizeAttenuation=a.sizeAttenuation;this.morphTargets=a.morphTargets;return this};var Mi=new N,mg=new Wb,Be=new eb,Pf=new p;Nc.prototype=Object.assign(Object.create(y.prototype),{constructor:Nc,isPoints:!0,raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Points.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Be.copy(c.boundingSphere);Be.applyMatrix4(d);Be.radius+=e;if(!1!==a.ray.intersectsSphere(Be))if(Mi.getInverse(d),mg.copy(a.ray).applyMatrix4(Mi),e/=(this.scale.x+
-this.scale.y+this.scale.z)/3,e*=e,c.isBufferGeometry){var f=c.index;c=c.attributes.position.array;if(null!==f){var g=f.array;f=0;for(var h=g.length;f<h;f++){var l=g[f];Pf.fromArray(c,3*l);lg(Pf,l,e,d,a,b,this)}}else for(f=0,g=c.length/3;f<g;f++)Pf.fromArray(c,3*f),lg(Pf,f,e,d,a,b,this)}else for(c=c.vertices,f=0,g=c.length;f<g;f++)lg(c[f],f,e,d,a,b,this)},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==
-c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ng.prototype=Object.assign(Object.create(W.prototype),{constructor:ng,
-isVideoTexture:!0,update:function(){var a=this.image;a.readyState>=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Oc.prototype=Object.create(W.prototype);Oc.prototype.constructor=Oc;Oc.prototype.isCompressedTexture=!0;Od.prototype=Object.create(W.prototype);Od.prototype.constructor=Od;Od.prototype.isCanvasTexture=!0;Pd.prototype=Object.create(W.prototype);Pd.prototype.constructor=Pd;Pd.prototype.isDepthTexture=!0;Pc.prototype=Object.create(F.prototype);Pc.prototype.constructor=Pc;Qd.prototype=Object.create(L.prototype);
-Qd.prototype.constructor=Qd;Qc.prototype=Object.create(F.prototype);Qc.prototype.constructor=Qc;Rd.prototype=Object.create(L.prototype);Rd.prototype.constructor=Rd;Ga.prototype=Object.create(F.prototype);Ga.prototype.constructor=Ga;Sd.prototype=Object.create(L.prototype);Sd.prototype.constructor=Sd;Rc.prototype=Object.create(Ga.prototype);Rc.prototype.constructor=Rc;Td.prototype=Object.create(L.prototype);Td.prototype.constructor=Td;bc.prototype=Object.create(Ga.prototype);bc.prototype.constructor=
-bc;Ud.prototype=Object.create(L.prototype);Ud.prototype.constructor=Ud;Sc.prototype=Object.create(Ga.prototype);Sc.prototype.constructor=Sc;Vd.prototype=Object.create(L.prototype);Vd.prototype.constructor=Vd;Tc.prototype=Object.create(Ga.prototype);Tc.prototype.constructor=Tc;Wd.prototype=Object.create(L.prototype);Wd.prototype.constructor=Wd;cc.prototype=Object.create(F.prototype);cc.prototype.constructor=cc;cc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);a.path=this.parameters.path.toJSON();
-return a};Xd.prototype=Object.create(L.prototype);Xd.prototype.constructor=Xd;Uc.prototype=Object.create(F.prototype);Uc.prototype.constructor=Uc;Yd.prototype=Object.create(L.prototype);Yd.prototype.constructor=Yd;Vc.prototype=Object.create(F.prototype);Vc.prototype.constructor=Vc;var Rk={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Xh(a,0,e,c,!0),g=[];if(!f||f.next===f.prev)return g;var h;if(d){var l=c;d=[];var m;var k=0;for(m=b.length;k<m;k++){var n=b[k]*l;var p=k<
-m-1?b[k+1]*l:a.length;n=Xh(a,n,p,l,!1);n===n.next&&(n.steiner=!0);d.push(Dk(n))}d.sort(Bk);for(k=0;k<d.length;k++){l=d[k];b=f;if(b=Ck(l,b))l=$h(b,l),Lb(b,b.next),Lb(l,l.next);f=Lb(f,f.next)}}if(a.length>80*c){var r=h=a[0];var q=d=a[1];for(l=c;l<e;l+=c)k=a[l],b=a[l+1],k<r&&(r=k),b<q&&(q=b),k>h&&(h=k),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}$d(f,g,c,r,q,h);return g}},sb={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>
-sb.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ai(a);bi(c,a);var f=a.length;b.forEach(ai);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,bi(c,b[a]);b=Rk.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};dc.prototype=Object.create(L.prototype);dc.prototype.constructor=dc;dc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};hb.prototype=Object.create(F.prototype);hb.prototype.constructor=
-hb;hb.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};var Ek={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new v(b[3*c],b[3*c+1]),new v(a,d),new v(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],l=b[3*d+1];d=b[3*d+2];var k=b[3*e],p=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-l)?[new v(a,1-c),new v(h,1-d),
-new v(k,1-e),new v(n,1-b)]:[new v(g,1-c),new v(l,1-d),new v(p,1-e),new v(t,1-b)]}};be.prototype=Object.create(L.prototype);be.prototype.constructor=be;Xc.prototype=Object.create(hb.prototype);Xc.prototype.constructor=Xc;ce.prototype=Object.create(L.prototype);ce.prototype.constructor=ce;ec.prototype=Object.create(F.prototype);ec.prototype.constructor=ec;de.prototype=Object.create(L.prototype);de.prototype.constructor=de;Yc.prototype=Object.create(F.prototype);Yc.prototype.constructor=Yc;ee.prototype=
-Object.create(L.prototype);ee.prototype.constructor=ee;Zc.prototype=Object.create(F.prototype);Zc.prototype.constructor=Zc;fc.prototype=Object.create(L.prototype);fc.prototype.constructor=fc;fc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};gc.prototype=Object.create(F.prototype);gc.prototype.constructor=gc;gc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};$c.prototype=Object.create(F.prototype);
-$c.prototype.constructor=$c;hc.prototype=Object.create(L.prototype);hc.prototype.constructor=hc;tb.prototype=Object.create(F.prototype);tb.prototype.constructor=tb;fe.prototype=Object.create(hc.prototype);fe.prototype.constructor=fe;ge.prototype=Object.create(tb.prototype);ge.prototype.constructor=ge;he.prototype=Object.create(L.prototype);he.prototype.constructor=he;ad.prototype=Object.create(F.prototype);ad.prototype.constructor=ad;var ra=Object.freeze({__proto__:null,WireframeGeometry:Pc,ParametricGeometry:Qd,
-ParametricBufferGeometry:Qc,TetrahedronGeometry:Sd,TetrahedronBufferGeometry:Rc,OctahedronGeometry:Td,OctahedronBufferGeometry:bc,IcosahedronGeometry:Ud,IcosahedronBufferGeometry:Sc,DodecahedronGeometry:Vd,DodecahedronBufferGeometry:Tc,PolyhedronGeometry:Rd,PolyhedronBufferGeometry:Ga,TubeGeometry:Wd,TubeBufferGeometry:cc,TorusKnotGeometry:Xd,TorusKnotBufferGeometry:Uc,TorusGeometry:Yd,TorusBufferGeometry:Vc,TextGeometry:be,TextBufferGeometry:Xc,SphereGeometry:ce,SphereBufferGeometry:ec,RingGeometry:de,
-RingBufferGeometry:Yc,PlaneGeometry:Fd,PlaneBufferGeometry:ac,LatheGeometry:ee,LatheBufferGeometry:Zc,ShapeGeometry:fc,ShapeBufferGeometry:gc,ExtrudeGeometry:dc,ExtrudeBufferGeometry:hb,EdgesGeometry:$c,ConeGeometry:fe,ConeBufferGeometry:ge,CylinderGeometry:hc,CylinderBufferGeometry:tb,CircleGeometry:he,CircleBufferGeometry:ad,BoxGeometry:fh,BoxBufferGeometry:Gd});ic.prototype=Object.create(K.prototype);ic.prototype.constructor=ic;ic.prototype.isShadowMaterial=!0;ic.prototype.copy=function(a){K.prototype.copy.call(this,
-a);this.color.copy(a.color);return this};ub.prototype=Object.create(Ca.prototype);ub.prototype.constructor=ub;ub.prototype.isRawShaderMaterial=!0;ib.prototype=Object.create(K.prototype);ib.prototype.constructor=ib;ib.prototype.isMeshStandardMaterial=!0;ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;
-this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=
-a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.vertexTangents=a.vertexTangents;return this};jc.prototype=Object.create(ib.prototype);jc.prototype.constructor=jc;jc.prototype.isMeshPhysicalMaterial=
-!0;jc.prototype.copy=function(a){ib.prototype.copy.call(this,a);this.defines={STANDARD:"",PHYSICAL:""};this.clearcoat=a.clearcoat;this.clearcoatMap=a.clearcoatMap;this.clearcoatRoughness=a.clearcoatRoughness;this.clearcoatRoughnessMap=a.clearcoatRoughnessMap;this.clearcoatNormalMap=a.clearcoatNormalMap;this.clearcoatNormalScale.copy(a.clearcoatNormalScale);this.reflectivity=a.reflectivity;this.sheen=a.sheen?(this.sheen||new D).copy(a.sheen):null;this.transparency=a.transparency;return this};Mb.prototype=
-Object.create(K.prototype);Mb.prototype.constructor=Mb;Mb.prototype.isMeshPhongMaterial=!0;Mb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;
-this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=
-a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};kc.prototype=Object.create(K.prototype);kc.prototype.constructor=kc;kc.prototype.isMeshToonMaterial=!0;kc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.gradientMap=a.gradientMap;this.lightMap=a.lightMap;this.lightMapIntensity=
-a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;
-this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};lc.prototype=Object.create(K.prototype);lc.prototype.constructor=lc;lc.prototype.isMeshNormalMaterial=!0;lc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;
-this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};mc.prototype=Object.create(K.prototype);mc.prototype.constructor=mc;mc.prototype.isMeshLambertMaterial=!0;mc.prototype.copy=function(a){K.prototype.copy.call(this,
-a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;
-this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nc.prototype=Object.create(K.prototype);nc.prototype.constructor=nc;nc.prototype.isMeshMatcapMaterial=!0;nc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={MATCAP:""};this.color.copy(a.color);this.matcap=a.matcap;this.map=a.map;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=
-a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.alphaMap=a.alphaMap;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};oc.prototype=Object.create(da.prototype);oc.prototype.constructor=oc;oc.prototype.isLineDashedMaterial=!0;oc.prototype.copy=function(a){da.prototype.copy.call(this,a);
-this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Sk=Object.freeze({__proto__:null,ShadowMaterial:ic,SpriteMaterial:Kb,RawShaderMaterial:ub,ShaderMaterial:Ca,PointsMaterial:Xa,MeshPhysicalMaterial:jc,MeshStandardMaterial:ib,MeshPhongMaterial:Mb,MeshToonMaterial:kc,MeshNormalMaterial:lc,MeshLambertMaterial:mc,MeshDepthMaterial:Hb,MeshDistanceMaterial:Ib,MeshBasicMaterial:Pa,MeshMatcapMaterial:nc,LineDashedMaterial:oc,LineBasicMaterial:da,Material:K}),ka={arraySlice:function(a,
-b,c){return ka.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
-new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,l=0;l!==b;++l)e[g++]=a[h+l];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
-while(void 0!==f)}}},subclip:function(a,b,c,d,e){e=e||30;a=a.clone();a.name=b;var f=[];for(b=0;b<a.tracks.length;++b){for(var g=a.tracks[b],h=g.getValueSize(),l=[],k=[],p=0;p<g.times.length;++p){var n=g.times[p]*e;if(!(n<c||n>=d))for(l.push(g.times[p]),n=0;n<h;++n)k.push(g.values[p*h+n])}0!==l.length&&(g.times=ka.convertArray(l,g.times.constructor),g.values=ka.convertArray(k,g.values.constructor),f.push(g))}a.tracks=f;c=Infinity;for(b=0;b<a.tracks.length;++b)c>a.tracks[b].times[0]&&(c=a.tracks[b].times[0]);
-for(b=0;b<a.tracks.length;++b)a.tracks[b].shift(-1*c);a.resetDuration();return a},makeClipAdditive:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=a);if(void 0===d||0>=d)d=30;var e=a.tracks.length;b/=d;for(d=0;d<e;++d){var f=c.tracks[d],g=f.ValueTypeName;if("bool"!==g&&"string"!==g){var h=a.tracks.find(function(a){return a.name===f.name&&a.ValueTypeName===g});if(void 0!==h){var l=f.getValueSize(),k=f.times.length-1;b<=f.times[0]?k=ka.arraySlice(f.values,0,f.valueSize):b>=f.times[k]?k=ka.arraySlice(f.values,
-k*l):(k=f.createInterpolant(),k.evaluate(b),k=k.resultBuffer);"quaternion"===g&&(new va(k[0],k[1],k[2],k[3])).normalize().conjugate().toArray(k);for(var p=h.times.length,n=0;n<p;++n){var t=n*l;if("quaternion"===g)va.multiplyQuaternionsFlat(h.values,t,k,0,h.values,t);else for(var r=0;r<l;++r)h.values[t+r]-=k[r]}}}}a.blendMode=2501;return a}};Object.assign(Ma.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===
-d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-
-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(Ma.prototype,{beforeStart_:Ma.prototype.copySampleValue_,
-afterEnd_:Ma.prototype.copySampleValue_});Xe.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Xe,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];
-break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,l=this._offsetPrev,k=this._offsetNext,p=this._weightPrev,n=this._weightNext,t=(c-b)/(d-b);c=t*t;d=c*t;b=-p*d+2*p*c-p*t;p=(1+p)*d+(-1.5-2*p)*c+(-.5+p)*t+1;t=(-1-n)*d+(1.5+n)*c+.5*t;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[l+c]+p*f[h+c]+t*f[a+c]+n*f[k+c];
-return e}});ie.prototype=Object.assign(Object.create(Ma.prototype),{constructor:ie,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Ye.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Ye,interpolate_:function(a){return this.copySampleValue_(a-1)}});Object.assign(ta,{toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{b={name:a.name,
-times:ka.convertArray(a.times,Array),values:ka.convertArray(a.values,Array)};var c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b}});Object.assign(ta.prototype,{constructor:ta,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Ye(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new ie(this.times,this.values,this.getValueSize(),
-a)},InterpolantFactoryMethodSmooth:function(a){return new Xe(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);
-else throw Error(b);console.warn("THREE.KeyframeTrack:",b);return this}this.createInterpolant=b;return this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==
-a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ka.arraySlice(c,e,f),this.values=ka.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;
-b=this.values;var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ka.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",
-this,f,d);a=!1;break}return a},optimize:function(){for(var a=ka.arraySlice(this.times),b=ka.arraySlice(this.values),c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,l=a[g];if(l!==a[g+1]&&(1!==g||l!==l[0]))if(d)h=!0;else{var k=g*c,p=k-c,n=k+c;for(l=0;l!==c;++l){var t=b[k+l];if(t!==b[p+l]||t!==b[n+l]){h=!0;break}}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,k=e*c,l=0;l!==c;++l)b[k+l]=b[h+l];++e}}if(0<f){a[e]=a[f];h=f*c;k=e*c;for(l=0;l!==c;++l)b[k+l]=b[h+l];++e}e!==
-a.length?(this.times=ka.arraySlice(a,0,e),this.values=ka.arraySlice(b,0,e*c)):(this.times=a,this.values=b);return this},clone:function(){var a=ka.arraySlice(this.times,0),b=ka.arraySlice(this.values,0);a=new this.constructor(this.name,a,b);a.createInterpolant=this.createInterpolant;return a}});Ze.prototype=Object.assign(Object.create(ta.prototype),{constructor:Ze,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});
-$e.prototype=Object.assign(Object.create(ta.prototype),{constructor:$e,ValueTypeName:"color"});bd.prototype=Object.assign(Object.create(ta.prototype),{constructor:bd,ValueTypeName:"number"});af.prototype=Object.assign(Object.create(Ma.prototype),{constructor:af,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)va.slerpFlat(e,0,f,a-g,f,a,b);return e}});je.prototype=Object.assign(Object.create(ta.prototype),{constructor:je,
-ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new af(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});bf.prototype=Object.assign(Object.create(ta.prototype),{constructor:bf,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});cd.prototype=Object.assign(Object.create(ta.prototype),{constructor:cd,ValueTypeName:"vector"});
-Object.assign(Sa,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(Gk(c[e]).scale(d));return new Sa(a.name,a.duration,b,a.blendMode)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid,blendMode:a.blendMode};for(var d=0,e=c.length;d!==e;++d)b.push(ta.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var k=
-ka.getKeyframeOrder(h);h=ka.sortedArray(h,1,k);l=ka.sortedArray(l,1,k);d||0!==h[0]||(h.push(e),l.push(l[0]));f.push((new bd(".morphTargetInfluences["+b[g].name+"]",h,l)).scale(1/c))}return new Sa(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],l=h.name.match(e);
-if(l&&1<l.length){var k=l[1];(l=d[k])||(d[k]=l=[]);l.push(h)}}a=[];for(k in d)a.push(Sa.CreateFromMorphTargetSequence(k,d[k],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ka.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.blendMode;a=a.hierarchy||[];for(var l=0;l<a.length;l++){var k=a[l].keys;
-if(k&&0!==k.length)if(k[0].morphTargets){f={};for(var p=0;p<k.length;p++)if(k[p].morphTargets)for(var n=0;n<k[p].morphTargets.length;n++)f[k[p].morphTargets[n]]=-1;for(var t in f){var r=[],q=[];for(n=0;n!==k[p].morphTargets.length;++n){var u=k[p];r.push(u.time);q.push(u.morphTarget===t?1:0)}d.push(new bd(".morphTargetInfluence["+t+"]",r,q))}f=f.length*(g||1)}else p=".bones["+b[l].name+"]",c(cd,p+".position",k,"pos",d),c(je,p+".quaternion",k,"rot",d),c(cd,p+".scale",k,"scl",d)}return 0===d.length?
-null:new Sa(e,f,d,h)}});Object.assign(Sa.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=a;return this},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},validate:function(){for(var a=!0,b=0;b<this.tracks.length;b++)a=a&&this.tracks[b].validate();return a},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();
-return this},clone:function(){for(var a=[],b=0;b<this.tracks.length;b++)a.push(this.tracks[b].clone());return new Sa(this.name,this.duration,a,this.blendMode)}});var tc={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},ei=new qg;Object.assign(V.prototype,{load:function(){},loadAsync:function(a,b){var c=this;return new Promise(function(d,e){c.load(a,
-d,b,e)})},parse:function(){},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this},setResourcePath:function(a){this.resourcePath=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});var db={};Ta.prototype=Object.assign(Object.create(V.prototype),{constructor:Ta,load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),
-setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==db[a])db[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=decodeURIComponent(g);h&&(g=atob(g));try{var l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":var k=new Uint8Array(g.length);for(h=0;h<g.length;h++)k[h]=g.charCodeAt(h);var p="blob"===l?new Blob([k.buffer],{type:c}):k.buffer;break;case "document":p=(new DOMParser).parseFromString(g,
-c);break;case "json":p=JSON.parse(g);break;default:p=g}setTimeout(function(){b&&b(p);e.manager.itemEnd(a)},0)}catch(t){setTimeout(function(){d&&d(t);e.manager.itemError(a);e.manager.itemEnd(a)},0)}}else{db[a]=[];db[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=this.response,d=db[a];delete db[a];if(200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");tc.add(a,
-c);for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemError(a)}e.manager.itemEnd(a)},!1);n.addEventListener("progress",function(b){for(var c=db[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);n.addEventListener("abort",
-function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setResponseType:function(a){this.responseType=
-a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this}});rg.prototype=Object.assign(Object.create(V.prototype),{constructor:rg,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){for(var b=[],c=0;c<a.length;c++){var d=Sa.parse(a[c]);b.push(d)}return b}});sg.prototype=
-Object.assign(Object.create(V.prototype),{constructor:sg,load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=f.parse(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};k+=1;6===k&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Oc;h.image=g;var l=new Ta(this.manager);l.setPath(this.path);l.setResponseType("arraybuffer");if(Array.isArray(a))for(var k=0,p=0,n=a.length;p<n;++p)e(p);else l.load(a,function(a){a=
-f.parse(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h}});cf.prototype=Object.assign(Object.create(V.prototype),{constructor:cf,load:function(a,b,c,
-d){var e=this,f=new $b,g=new Ta(this.manager);g.setResponseType("arraybuffer");g.setPath(this.path);g.load(a,function(a){if(a=e.parse(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1006,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=
-a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps,f.minFilter=1008),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});dd.prototype=Object.assign(Object.create(V.prototype),{constructor:dd,load:function(a,b,c,d){function e(){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);tc.add(a,this);b&&b(this);g.manager.itemEnd(a)}function f(b){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);d&&d(b);
-g.manager.itemError(a);g.manager.itemEnd(a)}void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var g=this,h=tc.get(a);if(void 0!==h)return g.manager.itemStart(a),setTimeout(function(){b&&b(h);g.manager.itemEnd(a)},0),h;var l=document.createElementNS("http://www.w3.org/1999/xhtml","img");l.addEventListener("load",e,!1);l.addEventListener("error",f,!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(l.crossOrigin=this.crossOrigin);g.manager.itemStart(a);l.src=a;return l}});df.prototype=
-Object.assign(Object.create(V.prototype),{constructor:df,load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new qb,g=new dd(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f}});ef.prototype=Object.assign(Object.create(V.prototype),{constructor:ef,load:function(a,b,c,d){var e=new W,f=new dd(this.manager);f.setCrossOrigin(this.crossOrigin);f.setPath(this.path);
-f.load(a,function(c){e.image=c;c=0<a.search(/\.jpe?g($|\?)/i)||0===a.search(/^data:image\/jpeg/);e.format=c?1022:1023;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e}});Object.assign(H.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===
-a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=
-!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a,b){var c=a-1E-4;a+=1E-4;0>c&&(c=0);1<a&&(a=1);c=this.getPoint(c);a=this.getPoint(a);b=b||(c.isVector2?new v:new p);b.copy(a).sub(c).normalize();return b},getTangentAt:function(a,b){a=this.getUtoTmapping(a);
-return this.getTangent(a,b)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=[],g=new p,h=new N,l;for(l=0;l<=a;l++){var k=l/a;d[l]=this.getTangentAt(k,new p);d[l].normalize()}e[0]=new p;f[0]=new p;l=Number.MAX_VALUE;k=Math.abs(d[0].x);var v=Math.abs(d[0].y),n=Math.abs(d[0].z);k<=l&&(l=k,c.set(1,0,0));v<=l&&(l=v,c.set(0,1,0));n<=l&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(l=1;l<=a;l++)e[l]=e[l-1].clone(),f[l]=f[l-1].clone(),
-g.crossVectors(d[l-1],d[l]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(O.clamp(d[l-1].dot(d[l]),-1,1)),e[l].applyMatrix4(h.makeRotationAxis(g,c))),f[l].crossVectors(d[l],e[l]);if(!0===b)for(c=Math.acos(O.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),l=1;l<=a;l++)e[l].applyMatrix4(h.makeRotationAxis(d[l],c*l)),f[l].crossVectors(d[l],e[l]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=
-a.arcLengthDivisions;return this},toJSON:function(){var a={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};a.arcLengthDivisions=this.arcLengthDivisions;a.type=this.type;return a},fromJSON:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Na.prototype=Object.create(H.prototype);Na.prototype.constructor=Na;Na.prototype.isEllipseCurve=!0;Na.prototype.getPoint=function(a,b){b=b||new v;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>
-d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Na.prototype.copy=function(a){H.prototype.copy.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;
-this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};Na.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.aX=this.aX;a.aY=this.aY;a.xRadius=this.xRadius;a.yRadius=this.yRadius;a.aStartAngle=this.aStartAngle;a.aEndAngle=this.aEndAngle;a.aClockwise=this.aClockwise;a.aRotation=this.aRotation;return a};Na.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=
-a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ed.prototype=Object.create(Na.prototype);ed.prototype.constructor=ed;ed.prototype.isArcCurve=!0;var Qf=new p,hh=new tg,ih=new tg,jh=new tg;qa.prototype=Object.create(H.prototype);qa.prototype.constructor=qa;qa.prototype.isCatmullRomCurve3=!0;qa.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/
-d)+1)*d:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Qf.subVectors(c[0],c[1]).add(c[0]),f=Qf;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Qf.subVectors(c[d-1],c[d-2]).add(c[d-1]),c=Qf);if("centripetal"===this.curveType||"chordal"===this.curveType){var l="chordal"===this.curveType?.5:.25;d=Math.pow(f.distanceToSquared(g),l);e=Math.pow(g.distanceToSquared(h),l);l=Math.pow(h.distanceToSquared(c),l);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>l&&(l=e);hh.initNonuniformCatmullRom(f.x,
-g.x,h.x,c.x,d,e,l);ih.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,l);jh.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,l)}else"catmullrom"===this.curveType&&(hh.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),ih.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),jh.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(hh.calc(a),ih.calc(a),jh.calc(a));return b};qa.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());
-this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};qa.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());a.closed=this.closed;a.curveType=this.curveType;a.tension=this.tension;return a};qa.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new p).fromArray(d))}this.closed=
-a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Ya.prototype=Object.create(H.prototype);Ya.prototype.constructor=Ya;Ya.prototype.isCubicBezierCurve=!0;Ya.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y));return b};Ya.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Ya.prototype.toJSON=function(){var a=
-H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Ya.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};jb.prototype=Object.create(H.prototype);jb.prototype.constructor=jb;jb.prototype.isCubicBezierCurve3=!0;jb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;
-b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y),le(a,c.z,d.z,e.z,f.z));return b};jb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};jb.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};jb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);
-this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};Ia.prototype=Object.create(H.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isLineCurve=!0;Ia.prototype.getPoint=function(a,b){b=b||new v;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ia.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ia.prototype.getTangent=function(a,b){a=b||new v;return a=a.copy(this.v2).sub(this.v1).normalize()};Ia.prototype.copy=function(a){H.prototype.copy.call(this,
-a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ia.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ia.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Za.prototype=Object.create(H.prototype);Za.prototype.constructor=Za;Za.prototype.isLineCurve3=!0;Za.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),
-b.multiplyScalar(a).add(this.v1));return b};Za.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Za.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Za.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Za.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};$a.prototype=Object.create(H.prototype);
-$a.prototype.constructor=$a;$a.prototype.isQuadraticBezierCurve=!0;$a.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y));return b};$a.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};$a.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};$a.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
-a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};kb.prototype=Object.create(H.prototype);kb.prototype.constructor=kb;kb.prototype.isQuadraticBezierCurve3=!0;kb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y),ke(a,c.z,d.z,e.z));return b};kb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};kb.prototype.toJSON=function(){var a=
-H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};kb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};ab.prototype=Object.create(H.prototype);ab.prototype.constructor=ab;ab.prototype.isSplineCurve=!0;ab.prototype.getPoint=function(a,b){b=b||new v;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-
-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(fi(d,e.x,f.x,g.x,c.x),fi(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};ab.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};ab.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
-a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new v).fromArray(d))}return this};var kh=Object.freeze({__proto__:null,ArcCurve:ed,CatmullRomCurve3:qa,CubicBezierCurve:Ya,CubicBezierCurve3:jb,EllipseCurve:Na,LineCurve:Ia,LineCurve3:Za,QuadraticBezierCurve:$a,QuadraticBezierCurve3:kb,SplineCurve:ab});vb.prototype=Object.assign(Object.create(H.prototype),{constructor:vb,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),
-b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new Ia(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&
-this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++){var f=e[d];f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&(f.isLineCurve||f.isLineCurve3)?1:f&&f.isSplineCurve?
-a*f.points.length:a);for(var g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){H.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this},toJSON:function(){var a=H.prototype.toJSON.call(this);a.autoClose=this.autoClose;a.curves=[];for(var b=0,c=this.curves.length;b<c;b++)a.curves.push(this.curves[b].toJSON());
-return a},fromJSON:function(a){H.prototype.fromJSON.call(this,a);this.autoClose=a.autoClose;this.curves=[];for(var b=0,c=a.curves.length;b<c;b++){var d=a.curves[b];this.curves.push((new kh[d.type]).fromJSON(d))}return this}});bb.prototype=Object.assign(Object.create(vb.prototype),{constructor:bb,setFromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y);return this},moveTo:function(a,b){this.currentPoint.set(a,b);return this},lineTo:function(a,b){var c=
-new Ia(this.currentPoint.clone(),new v(a,b));this.curves.push(c);this.currentPoint.set(a,b);return this},quadraticCurveTo:function(a,b,c,d){a=new $a(this.currentPoint.clone(),new v(a,b),new v(c,d));this.curves.push(a);this.currentPoint.set(c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){a=new Ya(this.currentPoint.clone(),new v(a,b),new v(c,d),new v(e,f));this.curves.push(a);this.currentPoint.set(e,f);return this},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new ab(b);
-this.curves.push(b);this.currentPoint.copy(a[a.length-1]);return this},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f);return this},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f);return this},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h);return this},absellipse:function(a,b,c,d,e,f,g,h){a=new Na(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,
-b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a);return this},copy:function(a){vb.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a=vb.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){vb.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});Nb.prototype=Object.assign(Object.create(bb.prototype),{constructor:Nb,getPointsHoles:function(a){for(var b=
-[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){bb.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=bb.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());return a},fromJSON:function(a){bb.prototype.fromJSON.call(this,
-a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new bb).fromJSON(d))}return this}});S.prototype=Object.assign(Object.create(y.prototype),{constructor:S,isLight:!0,copy:function(a){y.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=
-this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});ff.prototype=Object.assign(Object.create(S.prototype),{constructor:ff,isHemisphereLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});
-Object.assign(lb.prototype,{_projScreenMatrix:new N,_lightPositionWorld:new p,_lookTarget:new p,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(a){var b=this.camera,c=this.matrix,d=this._projScreenMatrix,e=this._lookTarget,f=this._lightPositionWorld;f.setFromMatrixPosition(a.matrixWorld);b.position.copy(f);e.setFromMatrixPosition(a.target.matrixWorld);b.lookAt(e);b.updateMatrixWorld();d.multiplyMatrices(b.projectionMatrix,
-b.matrixWorldInverse);this._frustum.setFromProjectionMatrix(d);c.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);c.multiply(b.projectionMatrix);c.multiply(b.matrixWorldInverse)},getViewport:function(a){return this._viewports[a]},getFrameExtents:function(){return this._frameExtents},copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&
-(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});gf.prototype=Object.assign(Object.create(lb.prototype),{constructor:gf,isSpotLightShadow:!0,updateMatrices:function(a){var b=this.camera,c=2*O.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height,e=a.distance||b.far;if(c!==b.fov||d!==b.aspect||e!==b.far)b.fov=c,b.aspect=d,b.far=e,b.updateProjectionMatrix();
-lb.prototype.updateMatrices.call(this,a)}});hf.prototype=Object.assign(Object.create(S.prototype),{constructor:hf,isSpotLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});ug.prototype=Object.assign(Object.create(lb.prototype),{constructor:ug,isPointLightShadow:!0,updateMatrices:function(a,b){void 0===b&&(b=0);var c=this.camera,d=this.matrix,
-e=this._lightPositionWorld,f=this._lookTarget,g=this._projScreenMatrix;e.setFromMatrixPosition(a.matrixWorld);c.position.copy(e);f.copy(c.position);f.add(this._cubeDirections[b]);c.up.copy(this._cubeUps[b]);c.lookAt(f);c.updateMatrixWorld();d.makeTranslation(-e.x,-e.y,-e.z);g.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);this._frustum.setFromProjectionMatrix(g)}});jf.prototype=Object.assign(Object.create(S.prototype),{constructor:jf,isPointLight:!0,copy:function(a){S.prototype.copy.call(this,
-a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});fd.prototype=Object.assign(Object.create(fb.prototype),{constructor:fd,isOrthographicCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,
-fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/
-2,e=c-a;c+=a;a=d+b;b=d-b;null!==this.view&&this.view.enabled&&(d=(this.right-this.left)/this.view.fullWidth/this.zoom,b=(this.top-this.bottom)/this.view.fullHeight/this.zoom,e+=d*this.view.offsetX,c=e+d*this.view.width,a-=b*this.view.offsetY,b=a-b*this.view.height);this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=
-this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});kf.prototype=Object.assign(Object.create(lb.prototype),{constructor:kf,isDirectionalLightShadow:!0,updateMatrices:function(a){lb.prototype.updateMatrices.call(this,a)}});lf.prototype=Object.assign(Object.create(S.prototype),{constructor:lf,isDirectionalLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.target=
-a.target.clone();this.shadow=a.shadow.clone();return this}});mf.prototype=Object.assign(Object.create(S.prototype),{constructor:mf,isAmbientLight:!0});nf.prototype=Object.assign(Object.create(S.prototype),{constructor:nf,isRectAreaLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});Object.assign(of.prototype,{isSphericalHarmonics3:!0,
-set:function(a){for(var b=0;9>b;b++)this.coefficients[b].copy(a[b]);return this},zero:function(){for(var a=0;9>a;a++)this.coefficients[a].set(0,0,0);return this},getAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.282095);b.addScaledVector(e[1],.488603*d);b.addScaledVector(e[2],.488603*a);b.addScaledVector(e[3],.488603*c);b.addScaledVector(e[4],1.092548*c*d);b.addScaledVector(e[5],1.092548*d*a);b.addScaledVector(e[6],.315392*(3*a*a-1));b.addScaledVector(e[7],
-1.092548*c*a);b.addScaledVector(e[8],.546274*(c*c-d*d));return b},getIrradianceAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.886227);b.addScaledVector(e[1],1.023328*d);b.addScaledVector(e[2],1.023328*a);b.addScaledVector(e[3],1.023328*c);b.addScaledVector(e[4],.858086*c*d);b.addScaledVector(e[5],.858086*d*a);b.addScaledVector(e[6],.743125*a*a-.247708);b.addScaledVector(e[7],.858086*c*a);b.addScaledVector(e[8],.429043*(c*c-d*d));return b},add:function(a){for(var b=
-0;9>b;b++)this.coefficients[b].add(a.coefficients[b]);return this},addScaledSH:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].addScaledVector(a.coefficients[c],b);return this},scale:function(a){for(var b=0;9>b;b++)this.coefficients[b].multiplyScalar(a);return this},lerp:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].lerp(a.coefficients[c],b);return this},equals:function(a){for(var b=0;9>b;b++)if(!this.coefficients[b].equals(a.coefficients[b]))return!1;return!0},copy:function(a){return this.set(a.coefficients)},
-clone:function(){return(new this.constructor).copy(this)},fromArray:function(a,b){void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].fromArray(a,b+3*d);return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].toArray(a,b+3*d);return a}});Object.assign(of,{getBasisAt:function(a,b){var c=a.x,d=a.y;a=a.z;b[0]=.282095;b[1]=.488603*d;b[2]=.488603*a;b[3]=.488603*c;b[4]=1.092548*c*d;b[5]=1.092548*d*a;b[6]=.315392*(3*a*a-1);b[7]=1.092548*
-c*a;b[8]=.546274*(c*c-d*d)}});Ua.prototype=Object.assign(Object.create(S.prototype),{constructor:Ua,isLightProbe:!0,copy:function(a){S.prototype.copy.call(this,a);this.sh.copy(a.sh);return this},fromJSON:function(a){this.intensity=a.intensity;this.sh.fromArray(a.sh);return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.sh=this.sh.toArray();return a}});pf.prototype=Object.assign(Object.create(V.prototype),{constructor:pf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);
-f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Sk[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.sheen&&(d.sheen=(new D).setHex(a.sheen));
-void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearcoat&&(d.clearcoat=a.clearcoat);void 0!==a.clearcoatRoughness&&(d.clearcoatRoughness=a.clearcoatRoughness);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.combine&&(d.combine=a.combine);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=
-a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.stencilWrite&&(d.stencilWrite=a.stencilWrite);void 0!==a.stencilWriteMask&&(d.stencilWriteMask=a.stencilWriteMask);void 0!==a.stencilFunc&&(d.stencilFunc=a.stencilFunc);void 0!==a.stencilRef&&(d.stencilRef=a.stencilRef);void 0!==
-a.stencilFuncMask&&(d.stencilFuncMask=a.stencilFuncMask);void 0!==a.stencilFail&&(d.stencilFail=a.stencilFail);void 0!==a.stencilZFail&&(d.stencilZFail=a.stencilZFail);void 0!==a.stencilZPass&&(d.stencilZPass=a.stencilZPass);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&
-(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.polygonOffset&&(d.polygonOffset=a.polygonOffset);void 0!==a.polygonOffsetFactor&&(d.polygonOffsetFactor=a.polygonOffsetFactor);void 0!==a.polygonOffsetUnits&&(d.polygonOffsetUnits=a.polygonOffsetUnits);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);
-void 0!==a.morphNormals&&(d.morphNormals=a.morphNormals);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.vertexTangents&&(d.vertexTangents=a.vertexTangents);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.toneMapped&&(d.toneMapped=a.toneMapped);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.vertexColors&&(d.vertexColors="number"===typeof a.vertexColors?0<a.vertexColors?!0:!1:a.vertexColors);if(void 0!==a.uniforms)for(var e in a.uniforms){var f=a.uniforms[e];d.uniforms[e]=
-{};switch(f.type){case "t":d.uniforms[e].value=b(f.value);break;case "c":d.uniforms[e].value=(new D).setHex(f.value);break;case "v2":d.uniforms[e].value=(new v).fromArray(f.value);break;case "v3":d.uniforms[e].value=(new p).fromArray(f.value);break;case "v4":d.uniforms[e].value=(new R).fromArray(f.value);break;case "m3":d.uniforms[e].value=(new ya).fromArray(f.value);case "m4":d.uniforms[e].value=(new N).fromArray(f.value);break;default:d.uniforms[e].value=f.value}}void 0!==a.defines&&(d.defines=
-a.defines);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);if(void 0!==a.extensions)for(var g in a.extensions)d.extensions[g]=a.extensions[g];void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.matcap&&(d.matcap=b(a.matcap));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap));void 0!==a.bumpMap&&
-(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));void 0!==a.normalMapType&&(d.normalMapType=a.normalMapType);void 0!==a.normalScale&&(e=a.normalScale,!1===Array.isArray(e)&&(e=[e,e]),d.normalScale=(new v).fromArray(e));void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);
-void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.envMapIntensity&&(d.envMapIntensity=a.envMapIntensity);void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.refractionRatio&&(d.refractionRatio=
-a.refractionRatio);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));void 0!==a.clearcoatMap&&(d.clearcoatMap=b(a.clearcoatMap));void 0!==a.clearcoatRoughnessMap&&(d.clearcoatRoughnessMap=b(a.clearcoatRoughnessMap));void 0!==a.clearcoatNormalMap&&(d.clearcoatNormalMap=b(a.clearcoatNormalMap));
-void 0!==a.clearcoatNormalScale&&(d.clearcoatNormalScale=(new v).fromArray(a.clearcoatNormalScale));return d},setTextures:function(a){this.textures=a;return this}});var lh={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;c<d;c++)b+=String.fromCharCode(a[c]);try{return decodeURIComponent(escape(b))}catch(e){return b}},extractUrlBase:function(a){var b=a.lastIndexOf("/");return-1===b?"./":a.substr(0,b+1)}};me.prototype=Object.assign(Object.create(F.prototype),
-{constructor:me,isInstancedBufferGeometry:!0,copy:function(a){F.prototype.copy.call(this,a);this.instanceCount=a.instanceCount;return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a=F.prototype.toJSON.call(this);a.instanceCount=this.instanceCount;a.isInstancedBufferGeometry=!0;return a}});qf.prototype=Object.assign(Object.create(G.prototype),{constructor:qf,isInstancedBufferAttribute:!0,copy:function(a){G.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
-return this},toJSON:function(){var a=G.prototype.toJSON.call(this);a.meshPerAttribute=this.meshPerAttribute;a.isInstancedBufferAttribute=!0;return a}});rf.prototype=Object.assign(Object.create(V.prototype),{constructor:rf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){var b=a.isInstancedBufferGeometry?new me:new F,c=a.data.index;if(void 0!==
-c){var d=new mh[c.type](c.array);b.setIndex(new G(d,1))}c=a.data.attributes;for(var e in c){var f=c[e];d=new mh[f.type](f.array);d=new (f.isInstancedBufferAttribute?qf:G)(d,f.itemSize,f.normalized);void 0!==f.name&&(d.name=f.name);b.setAttribute(e,d)}var g=a.data.morphAttributes;if(g)for(e in g){var h=g[e],l=[];c=0;for(var k=h.length;c<k;c++)f=h[c],d=new mh[f.type](f.array),d=new G(d,f.itemSize,f.normalized),void 0!==f.name&&(d.name=f.name),l.push(d);b.morphAttributes[e]=l}a.data.morphTargetsRelative&&
-(b.morphTargetsRelative=!0);e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,f=e.length;c!==f;++c)d=e[c],b.addGroup(d.start,d.count,d.materialIndex);c=a.data.boundingSphere;void 0!==c&&(e=new p,void 0!==c.center&&e.fromArray(c.center),b.boundingSphere=new eb(e,c.radius));a.name&&(b.name=a.name);a.userData&&(b.userData=a.userData);return b}});var mh={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,
-Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};sf.prototype=Object.assign(Object.create(V.prototype),{constructor:sf,load:function(a,b,c,d){var e=this,f=""===this.path?lh.extractUrlBase(a):this.path;this.resourcePath=this.resourcePath||f;f=new Ta(e.manager);f.setPath(this.path);f.load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(l){void 0!==d&&d(l);console.error("THREE:ObjectLoader: Can't parse "+
-a+".",l.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+a):e.parse(f,b)},c,d)},parse:function(a,b){var c=this.parseShape(a.shapes);c=this.parseGeometries(a.geometries,c);var d=this.parseImages(a.images,function(){void 0!==b&&b(e)});d=this.parseTextures(a.textures,d);d=this.parseMaterials(a.materials,d);var e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==
-a.images&&0!==a.images.length||void 0===b||b(e);return e},parseShape:function(a){var b={};if(void 0!==a)for(var c=0,d=a.length;c<d;c++){var e=(new Nb).fromJSON(a[c]);b[e.uuid]=e}return b},parseGeometries:function(a,b){var c={};if(void 0!==a)for(var d=new rf,e=0,f=a.length;e<f;e++){var g=a[e];switch(g.type){case "PlaneGeometry":case "PlaneBufferGeometry":var h=new ra[g.type](g.width,g.height,g.widthSegments,g.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":h=new ra[g.type](g.width,
-g.height,g.depth,g.widthSegments,g.heightSegments,g.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":h=new ra[g.type](g.radius,g.segments,g.thetaStart,g.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":h=new ra[g.type](g.radiusTop,g.radiusBottom,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":h=new ra[g.type](g.radius,g.height,g.radialSegments,g.heightSegments,g.openEnded,
-g.thetaStart,g.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":h=new ra[g.type](g.radius,g.widthSegments,g.heightSegments,g.phiStart,g.phiLength,g.thetaStart,g.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":h=new ra[g.type](g.radius,g.detail);break;case "RingGeometry":case "RingBufferGeometry":h=
-new ra[g.type](g.innerRadius,g.outerRadius,g.thetaSegments,g.phiSegments,g.thetaStart,g.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.radialSegments,g.tubularSegments,g.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.tubularSegments,g.radialSegments,g.p,g.q);break;case "TubeGeometry":case "TubeBufferGeometry":h=new ra[g.type]((new kh[g.path.type]).fromJSON(g.path),g.tubularSegments,g.radius,
-g.radialSegments,g.closed);break;case "LatheGeometry":case "LatheBufferGeometry":h=new ra[g.type](g.points,g.segments,g.phiStart,g.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":h=new ra[g.type](g.vertices,g.indices,g.radius,g.details);break;case "ShapeGeometry":case "ShapeBufferGeometry":h=[];for(var l=0,k=g.shapes.length;l<k;l++){var p=b[g.shapes[l]];h.push(p)}h=new ra[g.type](h,g.curveSegments);break;case "ExtrudeGeometry":case "ExtrudeBufferGeometry":h=[];l=0;for(k=
-g.shapes.length;l<k;l++)p=b[g.shapes[l]],h.push(p);l=g.options.extrudePath;void 0!==l&&(g.options.extrudePath=(new kh[l.type]).fromJSON(l));h=new ra[g.type](h,g.options);break;case "BufferGeometry":case "InstancedBufferGeometry":h=d.parse(g);break;case "Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+g.type+'"');continue}h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);!0===h.isBufferGeometry&&
-void 0!==g.userData&&(h.userData=g.userData);c[g.uuid]=h}return c},parseMaterials:function(a,b){var c={},d={};if(void 0!==a){var e=new pf;e.setTextures(b);b=0;for(var f=a.length;b<f;b++){var g=a[b];if("MultiMaterial"===g.type){for(var h=[],l=0;l<g.materials.length;l++){var k=g.materials[l];void 0===c[k.uuid]&&(c[k.uuid]=e.parse(k));h.push(c[k.uuid])}d[g.uuid]=h}else void 0===c[g.uuid]&&(c[g.uuid]=e.parse(g)),d[g.uuid]=c[g.uuid]}}return d},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=
-a[c],e=Sa.parse(d);void 0!==d.uuid&&(e.uuid=d.uuid);b.push(e)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a);d.manager.itemEnd(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new qg(b);var f=new dd(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],l=h.url;if(Array.isArray(l)){e[h.uuid]=[];for(var k=0,p=l.length;k<p;k++){var n=l[k];n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(n)?
-n:d.resourcePath+n;e[h.uuid].push(c(n))}}else n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:d.resourcePath+h.url,e[h.uuid]=c(n)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",
-g.image);var h=Array.isArray(b[g.image])?new qb(b[g.image]):new W(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Tk));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],Ni),h.wrapT=c(g.wrap[1],Ni));void 0!==g.format&&(h.format=g.format);void 0!==g.type&&
-(h.type=g.type);void 0!==g.encoding&&(h.encoding=g.encoding);void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Oi));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Oi));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);void 0!==g.premultiplyAlpha&&(h.premultiplyAlpha=g.premultiplyAlpha);void 0!==g.unpackAlignment&&(h.unpackAlignment=g.unpackAlignment);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",
-a);return b[a]}function e(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new zc;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new D(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Oe(a.fog.color,a.fog.near,a.fog.far):
-"FogExp2"===a.fog.type&&(f.fog=new Ne(a.fog.color,a.fog.density)));break;case "PerspectiveCamera":f=new P(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new fd(a.left,a.right,a.top,a.bottom,a.near,a.far);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.view&&(f.view=Object.assign({},
-a.view));break;case "AmbientLight":f=new mf(a.color,a.intensity);break;case "DirectionalLight":f=new lf(a.color,a.intensity);break;case "PointLight":f=new jf(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new nf(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new hf(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new ff(a.color,a.groundColor,a.intensity);break;case "LightProbe":f=(new Ua).fromJSON(a);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
-case "Mesh":f=d(a.geometry);var g=e(a.material);f=new ea(f,g);break;case "InstancedMesh":f=d(a.geometry);g=e(a.material);var h=a.instanceMatrix;f=new Se(f,g,a.count);f.instanceMatrix=new G(new Float32Array(h.array),16);break;case "LOD":f=new Nd;break;case "Line":f=new La(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new Te(d(a.geometry),e(a.material));break;case "LineSegments":f=new ma(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Nc(d(a.geometry),e(a.material));
-break;case "Sprite":f=new Ld(e(a.material));break;case "Group":f=new Kc;break;default:f=new y}f.uuid=a.uuid;void 0!==a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),void 0!==a.matrixAutoUpdate&&(f.matrixAutoUpdate=a.matrixAutoUpdate),f.matrixAutoUpdate&&f.matrix.decompose(f.position,f.quaternion,f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==
-a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=a.castShadow);void 0!==a.receiveShadow&&(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize),void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.frustumCulled&&(f.frustumCulled=
-a.frustumCulled);void 0!==a.renderOrder&&(f.renderOrder=a.renderOrder);void 0!==a.userData&&(f.userData=a.userData);void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children)for(h=a.children,g=0;g<h.length;g++)f.add(this.parseObject(h[g],b,c));if("LOD"===a.type)for(void 0!==a.autoUpdate&&(f.autoUpdate=a.autoUpdate),a=a.levels,h=0;h<a.length;h++){g=a[h];var l=f.getObjectByProperty("uuid",g.object);void 0!==l&&f.addLevel(l,g.distance)}return f}});var Tk={UVMapping:300,CubeReflectionMapping:301,
-CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Ni={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Oi={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};vg.prototype=Object.assign(Object.create(V.prototype),{constructor:vg,
-setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return void 0===e.options?createImageBitmap(a):createImageBitmap(a,e.options)}).then(function(c){tc.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&
-d(b);e.manager.itemError(a);e.manager.itemEnd(a)});e.manager.itemStart(a)}});Object.assign(wg.prototype,{moveTo:function(a,b){this.currentPath=new bb;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b);return this},lineTo:function(a,b){this.currentPath.lineTo(a,b);return this},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f);return this},splineThru:function(a){this.currentPath.splineThru(a);
-return this},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Nb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],l=h.x-g.x,k=h.y-g.y;if(Math.abs(k)>Number.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}
-var e=sb.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Nb;h.curves=g.curves;b.push(h);return b}var l=!e(f[0].getPoints());l=a?!l:l;h=[];var k=[],p=[],n=0;k[n]=void 0;p[n]=[];for(var t=0,r=f.length;t<r;t++){g=f[t];var q=g.getPoints();var u=e(q);(u=a?!u:u)?(!l&&k[n]&&n++,k[n]={s:new Nb,p:q},k[n].s.curves=g.curves,l&&n++,p[n]=[]):p[n].push({h:g,p:q[0]})}if(!k[0])return c(f);if(1<k.length){t=!1;a=[];e=0;for(f=k.length;e<f;e++)h[e]=
-[];e=0;for(f=k.length;e<f;e++)for(g=p[e],u=0;u<g.length;u++){l=g[u];n=!0;for(q=0;q<k.length;q++)d(l.p,k[q].p)&&(e!==q&&a.push({froms:e,tos:q,hole:u}),n?(n=!1,h[q].push(l)):t=!0);n&&h[e].push(l)}0<a.length&&(t||(p=h))}t=0;for(e=k.length;t<e;t++)for(h=k[t].s,b.push(h),a=p[t],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(xg.prototype,{isFont:!0,generateShapes:function(a,b){void 0===b&&(b=100);var c=[],d=b;b=this.data;var e=Array.from?Array.from(a):String(a).split("");d/=b.resolution;
-var f=(b.boundingBox.yMax-b.boundingBox.yMin+b.underlineThickness)*d;a=[];for(var g=0,h=0,l=0;l<e.length;l++){var k=e[l];if("\n"===k)g=0,h-=f;else{var p=k;k=d;var n=g,t=h,r=b,q=r.glyphs[p]||r.glyphs["?"];if(q){p=new wg;if(q.o){r=q._cachedOutline||(q._cachedOutline=q.o.split(" "));for(var u=0,v=r.length;u<v;)switch(r[u++]){case "m":var x=r[u++]*k+n;var w=r[u++]*k+t;p.moveTo(x,w);break;case "l":x=r[u++]*k+n;w=r[u++]*k+t;p.lineTo(x,w);break;case "q":var y=r[u++]*k+n;var A=r[u++]*k+t;var B=r[u++]*k+n;
-var C=r[u++]*k+t;p.quadraticCurveTo(B,C,y,A);break;case "b":y=r[u++]*k+n,A=r[u++]*k+t,B=r[u++]*k+n,C=r[u++]*k+t,x=r[u++]*k+n,w=r[u++]*k+t,p.bezierCurveTo(B,C,x,w,y,A)}}k={offsetX:q.ha*k,path:p}}else console.error('THREE.Font: character "'+p+'" does not exists in font family '+r.familyName+"."),k=void 0;g+=k.offsetX;a.push(k.path)}}b=0;for(e=a.length;b<e;b++)Array.prototype.push.apply(c,a[b].toShapes());return c}});yg.prototype=Object.assign(Object.create(V.prototype),{constructor:yg,load:function(a,
-b,c,d){var e=this,f=new Ta(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(l){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new xg(a)}});var Rf,Dg={getContext:function(){void 0===Rf&&(Rf=new (window.AudioContext||window.webkitAudioContext));return Rf},setContext:function(a){Rf=a}};tf.prototype=Object.assign(Object.create(V.prototype),
-{constructor:tf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setResponseType("arraybuffer");f.setPath(e.path);f.load(a,function(c){try{var f=c.slice(0);Dg.getContext().decodeAudioData(f,function(a){b(a)})}catch(l){d?d(l):console.error(l),e.manager.itemError(a)}},c,d)}});zg.prototype=Object.assign(Object.create(Ua.prototype),{constructor:zg,isHemisphereLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});
-Ag.prototype=Object.assign(Object.create(Ua.prototype),{constructor:Ag,isAmbientLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});var Pi=new N,Qi=new N;Object.assign(gi.prototype,{update:function(a){var b=this._cache;if(b.focus!==a.focus||b.fov!==a.fov||b.aspect!==a.aspect*this.aspect||b.near!==a.near||b.far!==a.far||b.zoom!==a.zoom||b.eyeSep!==this.eyeSep){b.focus=a.focus;b.fov=a.fov;b.aspect=a.aspect*this.aspect;
-b.near=a.near;b.far=a.far;b.zoom=a.zoom;b.eyeSep=this.eyeSep;var c=a.projectionMatrix.clone(),d=b.eyeSep/2,e=d*b.near/b.focus,f=b.near*Math.tan(O.DEG2RAD*b.fov*.5)/b.zoom;Qi.elements[12]=-d;Pi.elements[12]=d;d=-f*b.aspect+e;var g=f*b.aspect+e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraL.projectionMatrix.copy(c);d=-f*b.aspect-e;g=f*b.aspect-e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraR.projectionMatrix.copy(c)}this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Qi);
-this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Pi)}});Object.assign(Bg.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?
-Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});var uc=new p,Ri=new va,Uk=new p,vc=new p;Cg.prototype=Object.assign(Object.create(y.prototype),{constructor:Cg,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null);return this},getFilter:function(){return this.filter},setFilter:function(a){null!==
-this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);a=this.context.listener;
-var b=this.up;this.timeDelta=this._clock.getDelta();this.matrixWorld.decompose(uc,Ri,Uk);vc.set(0,0,-1).applyQuaternion(Ri);if(a.positionX){var c=this.context.currentTime+this.timeDelta;a.positionX.linearRampToValueAtTime(uc.x,c);a.positionY.linearRampToValueAtTime(uc.y,c);a.positionZ.linearRampToValueAtTime(uc.z,c);a.forwardX.linearRampToValueAtTime(vc.x,c);a.forwardY.linearRampToValueAtTime(vc.y,c);a.forwardZ.linearRampToValueAtTime(vc.z,c);a.upX.linearRampToValueAtTime(b.x,c);a.upY.linearRampToValueAtTime(b.y,
-c);a.upZ.linearRampToValueAtTime(b.z,c)}else a.setPosition(uc.x,uc.y,uc.z),a.setOrientation(vc.x,vc.y,vc.z,b.x,b.y,b.z)}});gd.prototype=Object.assign(Object.create(y.prototype),{constructor:gd,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setMediaElementSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaNode";this.source=this.context.createMediaElementSource(a);this.connect();
-return this},setMediaStreamSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaStreamNode";this.source=this.context.createMediaStreamSource(a);this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(a){void 0===a&&(a=0);if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this._startedAt=this.context.currentTime+a,a=this.context.createBufferSource(),a.buffer=this.buffer,a.loop=this.loop,a.loopStart=this.loopStart,a.loopEnd=this.loopEnd,a.onended=this.onEnded.bind(this),a.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=a,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress%=this.duration||this.buffer.duration),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);
-for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},
-getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},setDetune:function(a){this.detune=a;if(void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===
-this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},setLoopStart:function(a){this.loopStart=a;return this},setLoopEnd:function(a){this.loopEnd=a;return this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});var wc=new p,Si=new va,Vk=new p,xc=new p;Eg.prototype=Object.assign(Object.create(gd.prototype),{constructor:Eg,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},
-setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=
-a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);if(!0!==this.hasPlaybackControl||!1!==this.isPlaying)if(this.matrixWorld.decompose(wc,Si,Vk),xc.set(0,0,1).applyQuaternion(Si),a=this.panner,a.positionX){var b=this.context.currentTime+this.listener.timeDelta;a.positionX.linearRampToValueAtTime(wc.x,b);a.positionY.linearRampToValueAtTime(wc.y,b);a.positionZ.linearRampToValueAtTime(wc.z,b);a.orientationX.linearRampToValueAtTime(xc.x,
-b);a.orientationY.linearRampToValueAtTime(xc.y,b);a.orientationZ.linearRampToValueAtTime(xc.z,b)}else a.setPosition(wc.x,wc.y,wc.z),a.setOrientation(xc.x,xc.y,xc.z)}});Object.assign(Fg.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(Gg.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;
-var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},accumulateAdditive:function(a){var b=this.buffer,c=this.valueSize,d=c*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity();this._mixBufferRegionAdditive(b,d,0,a,c);this.cumulativeWeightAdditive+=a},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.cumulativeWeightAdditive,f=this.binding;this.cumulativeWeightAdditive=
-this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,b*this._origIndex,1-d,b);0<e&&this._mixBufferRegionAdditive(c,a,this._addIndex*b,1,b);d=b;for(e=b+b;d!==e;++d)if(c[d]!==c[d+b]){f.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=b*this._origIndex;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this._setIdentity();this.cumulativeWeightAdditive=this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},
-_setAdditiveIdentityNumeric:function(){for(var a=this._addIndex*this.valueSize,b=a+this.valueSize;a<b;a++)this.buffer[a]=0},_setAdditiveIdentityQuaternion:function(){this._setAdditiveIdentityNumeric();this.buffer[4*this._addIndex+3]=1},_setAdditiveIdentityOther:function(){for(var a=this._origIndex*this.valueSize,b=this._addIndex*this.valueSize,c=0;c<this.valueSize;c++)this.buffer[b+c]=this.buffer[a+c]},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){va.slerpFlat(a,
-b,a,b,a,c,d)},_slerpAdditive:function(a,b,c,d,e){e*=this._workIndex;va.multiplyQuaternionsFlat(a,e,a,b,a,c);va.slerpFlat(a,b,a,b,a,e,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}},_lerpAdditive:function(a,b,c,d,e){for(var f=0;f!==e;++f){var g=b+f;a[g]+=a[c+f]*d}}});var Wk=/[\[\]\.:\/]/g,Xk="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Yk=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Zk=/(WCOD+)?/.source.replace("WCOD",Xk),$k=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",
-"[^\\[\\]\\.:\\/]"),al=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),bl=new RegExp("^"+Yk+Zk+$k+al+"$"),cl=["material","materials","bones"];Object.assign(hi.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
-c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(Aa,{Composite:hi,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new Aa.Composite(a,b,c):new Aa(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(Wk,"")},parseTrackName:function(a){var b=bl.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],
-propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==cl.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b},findNode:function(a,b){if(!b||""===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==
-c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(Aa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=
-this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,
-d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];
-this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=
-a=Aa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);return}a=a.material.materials;
-break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,a);return}a=
-a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;this.targetObject=a;void 0!==a.needsUpdate?b=this.Versioning.NeedsUpdate:void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
-this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}void 0!==a.morphTargetDictionary[e]&&(e=a.morphTargetDictionary[e])}else{console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);return}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=
-e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=
-this._setValue_unbound}});Object.assign(Aa.prototype,{_getValue_unbound:Aa.prototype.getValue,_setValue_unbound:Aa.prototype.setValue});Object.assign(ii.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=void 0,m=0,p=arguments.length;m!==p;++m){var n=arguments[m],t=n.uuid,r=d[t];if(void 0===r){r=b++;d[t]=r;a.push(n);t=0;for(var q=h;t!==q;++t)g[t].push(new Aa(n,
-e[t],f[t]))}else if(r<c){k=a[r];var u=--c;q=a[u];d[q.uuid]=r;a[r]=q;d[t]=u;a[u]=n;t=0;for(q=h;t!==q;++t){var v=g[t],x=v[r];v[r]=v[u];void 0===x&&(x=new Aa(n,e[t],f[t]));v[u]=x}}else a[r]!==k&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=
-arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,m=c[k];if(void 0!==m&&m>=b){var p=b++,n=a[p];c[n.uuid]=m;a[m]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[m];n[m]=n[p];n[p]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g].uuid,m=d[k];if(void 0!==m)if(delete d[k],m<c){k=--c;var p=a[k],n=--b,t=a[n];d[p.uuid]=m;a[m]=p;d[t.uuid]=
-k;a[k]=t;a.pop();p=0;for(t=f;p!==t;++p){var r=e[p],q=r[n];r[m]=r[k];r[k]=q;r.pop()}}else for(n=--b,t=a[n],d[t.uuid]=m,a[m]=t,a.pop(),p=0,t=f;p!==t;++p)r=e[p],r[m]=r[n],r.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,m=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(m);c=k;for(d=h.length;c!==d;++c)m[c]=new Aa(h[c],a,b);
-return m},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(ji.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},
-isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,
-0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=
-this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());
-d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=
-null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a)switch(b=this._interpolants,e=this._propertyBindings,this.blendMode){case 2501:for(var f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulateAdditive(a);break;default:for(f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){b=this.weight;var c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&
-(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a,c=this._clip.duration,d=this.loop,e=this._loopCount,f=2202===d;if(0===a)return-1===e?b:f&&1===(e&1)?c-b:b;if(2200===
-d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else{this.time=b;break a}this.clampWhenFinished?this.paused=!0:this.enabled=!1;this.time=b;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,f)):this._setEndings(0===this.repetitions,!0,f));if(b>=c||0>b){d=Math.floor(b/c);b-=c*d;e+=Math.abs(d);var g=this.repetitions-e;0>=g?(this.clampWhenFinished?this.paused=!0:this.enabled=
-!1,this.time=b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(1===g?(a=0>a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this.time=b,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}else this.time=b;if(f&&1===(e&1))return c-b}return b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?
-2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Hg.prototype=Object.assign(Object.create(ua.prototype),{constructor:Hg,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===
-k&&(k={},h[g]=k);for(h=0;h!==e;++h){var m=d[h],p=m.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new Gg(Aa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),m.ValueTypeName,m.getValueSize());++n.referenceCount;this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,
-d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=
-[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},
-_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;b=a._clip.uuid;
-c=this._actionsByClip;d=c[b];var e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,
-d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,
-f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];0===Object.keys(f).length&&delete e[d]},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,
-c=a[b];void 0===c&&(c=new ie(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b,c){var d=b||this._root,e=d.uuid;d="string"===typeof a?Sa.findByName(d,a):a;a=null!==d?d.uuid:a;var f=
-this._actionsByClip[a],g=null;void 0===c&&(c=null!==d?d.blendMode:2500);if(void 0!==f){g=f.actionByRoot[e];if(void 0!==g&&g.blendMode===c)return g;g=f.knownActions[0];null===d&&(d=g._clip)}if(null===d)return null;b=new ji(this,d,b,c);this._bindAction(b,g);this._addInactiveAction(b,a,e);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Sa.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=
-this._actions,b=this._nActiveActions-1;0<=b;--b)a[b].stop();return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},setTime:function(a){for(var b=this.time=0;b<this._actions.length;b++)this._actions[b].time=0;return this.update(a)},getRoot:function(){return this._root},uncacheClip:function(a){var b=
-this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];
-if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});uf.prototype.clone=function(){return new uf(void 0===this.value.clone?this.value:this.value.clone())};Ig.prototype=Object.assign(Object.create(rb.prototype),{constructor:Ig,isInstancedInterleavedBuffer:!0,copy:function(a){rb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
-return this}});Object.assign(Jg.prototype,{set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize(),this.camera=b):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld),this.camera=b):console.error("THREE.Raycaster: Unsupported camera type.")},
-intersectObject:function(a,b,c){c=c||[];Kg(a,this,c,b);c.sort(ki);return c},intersectObjects:function(a,b,c){c=c||[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Kg(a[d],this,c,b);c.sort(ki);return c}});Object.assign(li.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=
-a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+b*b+c*c);0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a,c),this.phi=Math.acos(O.clamp(b/this.radius,-1,1)));return this}});Object.assign(mi.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},
-clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+c*c);this.theta=Math.atan2(a,c);this.y=b;return this}});var Ti=new v;Object.assign(Lg.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<
-c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(a,b){b=Ti.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===
-a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);
-this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new v);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<
-this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new v);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return Ti.copy(a).clamp(this.min,this.max).sub(a).length()},intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);
-this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Ui=new p,Sf=new p;Object.assign(Mg.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new p);return a.addVectors(this.start,this.end).multiplyScalar(.5)},
-delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new p);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new p);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(a,b){Ui.subVectors(a,this.start);Sf.subVectors(this.end,
-this.start);a=Sf.dot(Sf);a=Sf.dot(Ui)/a;b&&(a=O.clamp(a,0,1));return a},closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new p);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});ne.prototype=Object.create(y.prototype);
-ne.prototype.constructor=ne;ne.prototype.isImmediateRenderObject=!0;var Vi=new p;hd.prototype=Object.create(y.prototype);hd.prototype.constructor=hd;hd.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};hd.prototype.update=function(){this.light.updateMatrixWorld();var a=this.light.distance?this.light.distance:1E3,b=a*Math.tan(this.light.angle);this.cone.scale.set(b,b,a);Vi.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(Vi);void 0!==this.color?
-this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Tb=new p,Tf=new N,nh=new N;pc.prototype=Object.create(ma.prototype);pc.prototype.constructor=pc;pc.prototype.isSkeletonHelper=!0;pc.prototype.updateMatrixWorld=function(a){var b=this.bones,c=this.geometry,d=c.getAttribute("position");nh.getInverse(this.root.matrixWorld);for(var e=0,f=0;e<b.length;e++){var g=b[e];g.parent&&g.parent.isBone&&(Tf.multiplyMatrices(nh,g.matrixWorld),Tb.setFromMatrixPosition(Tf),
-d.setXYZ(f,Tb.x,Tb.y,Tb.z),Tf.multiplyMatrices(nh,g.parent.matrixWorld),Tb.setFromMatrixPosition(Tf),d.setXYZ(f+1,Tb.x,Tb.y,Tb.z),f+=2)}c.getAttribute("position").needsUpdate=!0;y.prototype.updateMatrixWorld.call(this,a)};id.prototype=Object.create(ea.prototype);id.prototype.constructor=id;id.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};id.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};
-var dl=new p,Wi=new D,Xi=new D;jd.prototype=Object.create(y.prototype);jd.prototype.constructor=jd;jd.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};jd.prototype.update=function(){var a=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var b=a.geometry.getAttribute("color");Wi.copy(this.light.color);Xi.copy(this.light.groundColor);for(var c=0,d=b.count;c<d;c++){var e=c<d/2?Wi:Xi;b.setXYZ(c,e.r,e.g,e.b)}b.needsUpdate=
-!0}a.lookAt(dl.setFromMatrixPosition(this.light.matrixWorld).negate())};vf.prototype=Object.assign(Object.create(ma.prototype),{constructor:vf,copy:function(a){ma.prototype.copy.call(this,a);this.geometry.copy(a.geometry);this.material.copy(a.material);return this},clone:function(){return(new this.constructor).copy(this)}});wf.prototype=Object.create(ma.prototype);wf.prototype.constructor=wf;var Yi=new p,Uf=new p,Zi=new p;kd.prototype=Object.create(y.prototype);kd.prototype.constructor=kd;kd.prototype.dispose=
-function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};kd.prototype.update=function(){Yi.setFromMatrixPosition(this.light.matrixWorld);Uf.setFromMatrixPosition(this.light.target.matrixWorld);Zi.subVectors(Uf,Yi);this.lightPlane.lookAt(Uf);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),
-this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(Uf);this.targetLine.scale.z=Zi.length()};var xf=new p,la=new fb;oe.prototype=Object.create(ma.prototype);oe.prototype.constructor=oe;oe.prototype.update=function(){var a=this.geometry,b=this.pointMap;la.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);fa("c",b,a,la,0,0,-1);fa("t",b,a,la,0,0,1);fa("n1",b,a,la,-1,-1,-1);fa("n2",b,a,la,1,-1,-1);fa("n3",b,a,la,-1,1,-1);fa("n4",b,a,la,1,1,-1);fa("f1",b,a,la,
--1,-1,1);fa("f2",b,a,la,1,-1,1);fa("f3",b,a,la,-1,1,1);fa("f4",b,a,la,1,1,1);fa("u1",b,a,la,.7,1.1,-1);fa("u2",b,a,la,-.7,1.1,-1);fa("u3",b,a,la,0,2,-1);fa("cf1",b,a,la,-1,0,1);fa("cf2",b,a,la,1,0,1);fa("cf3",b,a,la,0,-1,1);fa("cf4",b,a,la,0,1,1);fa("cn1",b,a,la,-1,0,-1);fa("cn2",b,a,la,1,0,-1);fa("cn3",b,a,la,0,-1,-1);fa("cn4",b,a,la,0,1,-1);a.getAttribute("position").needsUpdate=!0};var Vf=new Va;wb.prototype=Object.create(ma.prototype);wb.prototype.constructor=wb;wb.prototype.update=function(a){void 0!==
-a&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&Vf.setFromObject(this.object);if(!Vf.isEmpty()){a=Vf.min;var b=Vf.max,c=this.geometry.attributes.position,d=c.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=a.x;d[4]=b.y;d[5]=b.z;d[6]=a.x;d[7]=a.y;d[8]=b.z;d[9]=b.x;d[10]=a.y;d[11]=b.z;d[12]=b.x;d[13]=b.y;d[14]=a.z;d[15]=a.x;d[16]=b.y;d[17]=a.z;d[18]=a.x;d[19]=a.y;d[20]=a.z;d[21]=b.x;d[22]=a.y;d[23]=a.z;c.needsUpdate=!0;this.geometry.computeBoundingSphere()}};wb.prototype.setFromObject=
-function(a){this.object=a;this.update();return this};wb.prototype.copy=function(a){ma.prototype.copy.call(this,a);this.object=a.object;return this};wb.prototype.clone=function(){return(new this.constructor).copy(this)};pe.prototype=Object.create(ma.prototype);pe.prototype.constructor=pe;pe.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),y.prototype.updateMatrixWorld.call(this,a))};qe.prototype=Object.create(La.prototype);
-qe.prototype.constructor=qe;qe.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);y.prototype.updateMatrixWorld.call(this,a)};var $i=new p,yf,Ng;xb.prototype=Object.create(y.prototype);xb.prototype.constructor=xb;xb.prototype.setDirection=function(a){.99999<a.y?this.quaternion.set(0,0,0,1):-.99999>a.y?this.quaternion.set(1,0,0,0):($i.set(a.z,
-0,-a.x).normalize(),this.quaternion.setFromAxisAngle($i,Math.acos(a.y)))};xb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(1E-4,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};xb.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};xb.prototype.copy=function(a){y.prototype.copy.call(this,a,!1);this.line.copy(a.line);this.cone.copy(a.cone);
-return this};xb.prototype.clone=function(){return(new this.constructor).copy(this)};re.prototype=Object.create(ma.prototype);re.prototype.constructor=re;var nb=Math.pow(2,8),aj=[.125,.215,.35,.446,.526,.582],bj=5+aj.length,mb={3E3:0,3001:1,3002:2,3004:3,3005:4,3006:5,3007:6},oh=new fd,ph=function(){for(var a=[],b=[],c=[],d=8,e=0;e<bj;e++){var f=Math.pow(2,d);b.push(f);var g=1/f;4<e?g=aj[e-8+4-1]:0==e&&(g=0);c.push(g);g=1/(f-1);f=-g/2;g=1+g/2;var h=[f,f,g,f,g,g,f,f,g,g,f,g];f=new Float32Array(108);
-g=new Float32Array(72);for(var k=new Float32Array(36),m=0;6>m;m++){var p=m%3*2/3-1,n=2<m?0:-1;f.set([p,n,0,p+2/3,n,0,p+2/3,n+1,0,p,n,0,p+2/3,n+1,0,p,n+1,0],18*m);g.set(h,12*m);k.set([m,m,m,m,m,m],6*m)}h=new F;h.setAttribute("position",new G(f,3));h.setAttribute("uv",new G(g,2));h.setAttribute("faceIndex",new G(k,1));a.push(h);4<d&&d--}return{_lodPlanes:a,_sizeLods:b,_sigmas:c}}(),Ce=ph._lodPlanes,cj=ph._sizeLods,Wf=ph._sigmas,qh=null,yc=(1+Math.sqrt(5))/2,xd=1/yc,dj=[new p(1,1,1),new p(-1,1,1),new p(1,
-1,-1),new p(-1,1,-1),new p(0,yc,xd),new p(0,yc,-xd),new p(xd,0,yc),new p(-xd,0,yc),new p(yc,xd,0),new p(-yc,xd,0)];Og.prototype={constructor:Og,fromScene:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=.1);void 0===d&&(d=100);qh=this._renderer.getRenderTarget();var e=this._allocateTargets();this._sceneToCubeUV(a,c,d,e);0<b&&this._blur(e,0,0,b);this._applyPMREM(e);this._cleanup(e);return e},fromEquirectangular:function(a){a.magFilter=1003;a.minFilter=1003;a.generateMipmaps=!1;return this.fromCubemap(a)},
-fromCubemap:function(a){qh=this._renderer.getRenderTarget();var b=this._allocateTargets(a);this._textureToCubeUV(a,b);this._applyPMREM(b);this._cleanup(b);return b},compileCubemapShader:function(){null===this._cubemapShader&&(this._cubemapShader=qi(),this._compileMaterial(this._cubemapShader))},compileEquirectangularShader:function(){null===this._equirectShader&&(this._equirectShader=pi(),this._compileMaterial(this._equirectShader))},dispose:function(){this._blurMaterial.dispose();null!==this._cubemapShader&&
-this._cubemapShader.dispose();null!==this._equirectShader&&this._equirectShader.dispose();for(var a=0;a<Ce.length;a++)Ce[a].dispose()},_cleanup:function(a){this._pingPongRenderTarget.dispose();this._renderer.setRenderTarget(qh);a.scissorTest=!1;a.setSize(a.width,a.height)},_allocateTargets:function(a){var b=void 0===a||1009!==a.type?!1:3E3===a.encoding||3001===a.encoding||3007===a.encoding;b={magFilter:1003,minFilter:1003,generateMipmaps:!1,type:1009,format:1023,encoding:b?a.encoding:3002,depthBuffer:!1,
-stencilBuffer:!1};var c=oi(b);c.depthBuffer=a?!1:!0;this._pingPongRenderTarget=oi(b);return c},_compileMaterial:function(a){a=new ea(Ce[0],a);this._renderer.compile(a,oh)},_sceneToCubeUV:function(a,b,c,d){b=new P(90,1,b,c);c=[1,-1,1,1,1,1];var e=[1,1,1,-1,-1,-1],f=this._renderer,g=f.outputEncoding,h=f.toneMapping,k=f.toneMappingExposure,m=f.getClearColor(),p=f.getClearAlpha();f.toneMapping=1;f.toneMappingExposure=1;f.outputEncoding=3E3;var n=a.background;if(n&&n.isColor){n.convertSRGBToLinear();var t=
-Math.min(Math.max(Math.ceil(Math.log2(Math.max(n.r,n.g,n.b))),-128),127);n=n.multiplyScalar(Math.pow(2,-t));f.setClearColor(n,(t+128)/255);a.background=null}for(n=0;6>n;n++)t=n%3,0==t?(b.up.set(0,c[n],0),b.lookAt(e[n],0,0)):1==t?(b.up.set(0,0,c[n]),b.lookAt(0,e[n],0)):(b.up.set(0,c[n],0),b.lookAt(0,0,e[n])),Rg(d,t*nb,2<n?nb:0,nb,nb),f.setRenderTarget(d),f.render(a,b);f.toneMapping=h;f.toneMappingExposure=k;f.outputEncoding=g;f.setClearColor(m,p)},_textureToCubeUV:function(a,b){var c=this._renderer;
-a.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=qi()):null==this._equirectShader&&(this._equirectShader=pi());var d=a.isCubeTexture?this._cubemapShader:this._equirectShader,e=new ea(Ce[0],d);d=d.uniforms;d.envMap.value=a;a.isCubeTexture||d.texelSize.value.set(1/a.image.width,1/a.image.height);d.inputEncoding.value=mb[a.encoding];d.outputEncoding.value=mb[b.texture.encoding];Rg(b,0,0,3*nb,2*nb);c.setRenderTarget(b);c.render(e,oh)},_applyPMREM:function(a){var b=this._renderer,c=b.autoClear;
-b.autoClear=!1;for(var d=1;d<bj;d++)this._blur(a,d-1,d,Math.sqrt(Wf[d]*Wf[d]-Wf[d-1]*Wf[d-1]),dj[(d-1)%dj.length]);b.autoClear=c},_blur:function(a,b,c,d,e){var f=this._pingPongRenderTarget;this._halfBlur(a,f,b,c,d,"latitudinal",e);this._halfBlur(f,a,c,c,d,"longitudinal",e)},_halfBlur:function(a,b,c,d,e,f,g){var h=this._renderer,k=this._blurMaterial;"latitudinal"!==f&&"longitudinal"!==f&&console.error("blur direction must be either latitudinal or longitudinal!");var m=new ea(Ce[d],k);k=k.uniforms;
-var p=cj[c]-1;p=isFinite(e)?Math.PI/(2*p):2*Math.PI/39;var n=e/p,t=isFinite(e)?1+Math.floor(3*n):20;20<t&&console.warn("sigmaRadians, "+e+", is too large and will clip, as it requested "+t+" samples when the maximum is set to 20");e=[];for(var r=0,q=0;20>q;++q){var u=q/n;u=Math.exp(-u*u/2);e.push(u);0==q?r+=u:q<t&&(r+=2*u)}for(q=0;q<e.length;q++)e[q]/=r;k.envMap.value=a.texture;k.samples.value=t;k.weights.value=e;k.latitudinal.value="latitudinal"===f;g&&(k.poleAxis.value=g);k.dTheta.value=p;k.mipInt.value=
-8-c;k.inputEncoding.value=mb[a.texture.encoding];k.outputEncoding.value=mb[a.texture.encoding];a=cj[d];u=3*Math.max(0,nb-2*a);Rg(b,u,(0===d?0:2*nb)+2*a*(4<d?d-8+4:0),3*a,2*a);h.setRenderTarget(b);h.render(m,oh)}};H.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(H.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(vb.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
-a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new L,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,
-e.y,e.z||0))}return b}});Object.assign(bb.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");return this.setFromPoints(a)}});ri.prototype=Object.create(qa.prototype);si.prototype=Object.create(qa.prototype);Sg.prototype=Object.create(qa.prototype);Object.assign(Sg.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},
-reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});vf.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};pc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(V.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");
-return lh.extractUrlBase(a)}});V.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};Object.assign(sf.prototype,{setTexturePath:function(a){console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");return this.setResourcePath(a)}});Object.assign(Lg.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Va.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");
-return this.getSize(a)}});Object.assign(eb.prototype,{empty:function(){console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty().");return this.isEmpty()}});Gc.prototype.setFromMatrix=function(a){console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().");return this.setFromProjectionMatrix(a)};Mg.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(O,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");
-return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return O.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return O.ceilPowerOfTwo(a)}});Object.assign(ya.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},
-multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});
-Object.assign(N.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return(new p).setFromMatrixColumn(this,
-3)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
-return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
-rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},
-applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Wa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};va.prototype.multiplyVector3=
-function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(Wb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)}});Object.assign(pa.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
-return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(pa,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return pa.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return pa.getNormal(a,b,c,d)}});Object.assign(Nb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
-return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new dc(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new fc(this,a)}});Object.assign(v.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
-return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},
-getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,
-a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");
-return this.manhattanLength()}});Object.assign(R.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(L.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")},
-applyMatrix:function(a){console.warn("THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");
-return this.translateOnAxis(b,a)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(a){console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.defineProperties(y.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
-this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.assign(ea.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}});
-Object.defineProperties(ea.prototype,{drawMode:{get:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.");return 0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}});Object.defineProperties(Nd.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");
-return this.levels}}});Object.defineProperty(Re.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Qe.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};Object.defineProperty(H.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},
-set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});P.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(S.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
-this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
-this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
-this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(G.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");
-return this.array.length}},dynamic:{get:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");return 35048===this.usage},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");this.setUsage(35048)}}});Object.assign(G.prototype,{setDynamic:function(a){console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},
-setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});Object.assign(F.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addAttribute:function(a,b,c){console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().");return b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute?"index"===
-a?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b),this):this.setAttribute(a,b):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(a,new G(b,c)))},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");
-this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(a){console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().");return this.deleteAttribute(a)},applyMatrix:function(a){console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});
-Object.defineProperties(F.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(me.prototype,{maxInstancedCount:{get:function(){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");return this.instanceCount},set:function(a){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");
-this.instanceCount=a}}});Object.defineProperties(Jg.prototype,{linePrecision:{get:function(){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");return this.params.Line.threshold},set:function(a){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");this.params.Line.threshold=a}}});Object.defineProperties(rb.prototype,{dynamic:{get:function(){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");
-return 35048===this.usage},set:function(a){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");this.setUsage(a)}}});Object.assign(rb.prototype,{setDynamic:function(a){console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});
-Object.assign(hb.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}});Object.defineProperties(uf.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
-return this}}});Object.defineProperties(K.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new D}},shading:{get:function(){console.error("THREE."+
-this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");this.flatShading=1===a}},stencilMask:{get:function(){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");return this.stencilFuncMask},set:function(a){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");this.stencilFuncMask=
-a}}});Object.defineProperties(Mb.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(Ca.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},
-set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(jg.prototype,{clearTarget:function(a,b,c,d){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.");this.setRenderTarget(a);this.clear(b,c,d)},animate:function(a){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop().");this.setAnimationLoop(a)},getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");
-return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
-return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
-return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
-return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
-addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},
-setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().");return this.getActiveMipmapLevel()}});Object.defineProperties(jg.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},
-set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");return this.getContext()}},
-vr:{get:function(){console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr");return this.xr}},gammaInput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.");return!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");
-return!1},set:function(a){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");this.outputEncoding=!0===a?3001:3E3}}});Object.defineProperties(Rh.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},
-set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(Ba.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
-return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
-this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
-return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.defineProperties(gd.prototype,{load:{value:function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new tf).load(a,function(a){b.setBuffer(a)});return this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}});Fg.prototype.getData=
-function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};Fc.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};Ob.crossOrigin=void 0;Ob.loadTexture=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new ef;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};
-Ob.loadTextureCube=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new df;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};Ob.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};Ob.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};
-"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"117"}}));k.ACESFilmicToneMapping=5;k.AddEquation=100;k.AddOperation=2;k.AdditiveAnimationBlendMode=2501;k.AdditiveBlending=2;k.AlphaFormat=1021;k.AlwaysDepth=1;k.AlwaysStencilFunc=519;k.AmbientLight=mf;k.AmbientLightProbe=Ag;k.AnimationClip=Sa;k.AnimationLoader=rg;k.AnimationMixer=Hg;k.AnimationObjectGroup=ii;k.AnimationUtils=ka;k.ArcCurve=ed;k.ArrayCamera=Le;k.ArrowHelper=xb;k.Audio=
-gd;k.AudioAnalyser=Fg;k.AudioContext=Dg;k.AudioListener=Cg;k.AudioLoader=tf;k.AxesHelper=re;k.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new re(a)};k.BackSide=1;k.BasicDepthPacking=3200;k.BasicShadowMap=0;k.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new cf(a)};k.Bone=kg;k.BooleanKeyframeTrack=Ze;k.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");
-return new wb(a,b)};k.Box2=Lg;k.Box3=Va;k.Box3Helper=pe;k.BoxBufferGeometry=Gd;k.BoxGeometry=fh;k.BoxHelper=wb;k.BufferAttribute=G;k.BufferGeometry=F;k.BufferGeometryLoader=rf;k.ByteType=1010;k.Cache=tc;k.Camera=fb;k.CameraHelper=oe;k.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")};k.CanvasTexture=Od;k.CatmullRomCurve3=qa;k.CineonToneMapping=4;k.CircleBufferGeometry=ad;k.CircleGeometry=he;k.ClampToEdgeWrapping=1001;k.Clock=Bg;k.ClosedSplineCurve3=ri;k.Color=D;k.ColorKeyframeTrack=
-$e;k.CompressedTexture=Oc;k.CompressedTextureLoader=sg;k.ConeBufferGeometry=ge;k.ConeGeometry=fe;k.CubeCamera=Fc;k.CubeGeometry=fh;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.CubeTexture=qb;k.CubeTextureLoader=df;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.CubicBezierCurve=Ya;k.CubicBezierCurve3=jb;k.CubicInterpolant=Xe;k.CullFaceBack=1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.CullFaceNone=0;k.Curve=H;k.CurvePath=vb;k.CustomBlending=5;k.CylinderBufferGeometry=tb;k.CylinderGeometry=
-hc;k.Cylindrical=mi;k.DataTexture=$b;k.DataTexture2DArray=Hc;k.DataTexture3D=Ic;k.DataTextureLoader=cf;k.DecrementStencilOp=7683;k.DecrementWrapStencilOp=34056;k.DefaultLoadingManager=ei;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.DepthTexture=Pd;k.DirectionalLight=lf;k.DirectionalLightHelper=kd;k.DirectionalLightShadow=kf;k.DiscreteInterpolant=Ye;k.DodecahedronBufferGeometry=Tc;k.DodecahedronGeometry=Vd;k.DoubleSide=2;k.DstAlphaFactor=206;k.DstColorFactor=208;k.DynamicBufferAttribute=function(a,
-b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.");return(new G(a,b)).setUsage(35048)};k.DynamicCopyUsage=35050;k.DynamicDrawUsage=35048;k.DynamicReadUsage=35049;k.EdgesGeometry=$c;k.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new ma(new $c(a.geometry),new da({color:void 0!==b?b:16777215}))};k.EllipseCurve=Na;k.EqualDepth=4;k.EqualStencilFunc=
-514;k.EquirectangularReflectionMapping=303;k.EquirectangularRefractionMapping=304;k.Euler=Ub;k.EventDispatcher=ua;k.ExtrudeBufferGeometry=hb;k.ExtrudeGeometry=dc;k.Face3=Ac;k.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Ac(a,b,c,e,f,g)};k.FaceColors=1;k.FileLoader=Ta;k.FlatShading=1;k.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
-return new B(a,b)};k.Float32BufferAttribute=B;k.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new Dd(a,b)};k.Float64BufferAttribute=Dd;k.FloatType=1015;k.Fog=Oe;k.FogExp2=Ne;k.Font=xg;k.FontLoader=yg;k.FrontFaceDirectionCCW=1;k.FrontFaceDirectionCW=0;k.FrontSide=0;k.Frustum=Gc;k.GammaEncoding=3007;k.Geometry=L;k.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
-if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};k.GreaterDepth=6;k.GreaterEqualDepth=5;k.GreaterEqualStencilFunc=518;k.GreaterStencilFunc=516;k.GridHelper=vf;k.Group=Kc;k.HalfFloatType=1016;k.HemisphereLight=ff;k.HemisphereLightHelper=jd;k.HemisphereLightProbe=zg;k.IcosahedronBufferGeometry=Sc;k.IcosahedronGeometry=
-Ud;k.ImageBitmapLoader=vg;k.ImageLoader=dd;k.ImageUtils=Ob;k.ImmediateRenderObject=ne;k.IncrementStencilOp=7682;k.IncrementWrapStencilOp=34055;k.InstancedBufferAttribute=qf;k.InstancedBufferGeometry=me;k.InstancedInterleavedBuffer=Ig;k.InstancedMesh=Se;k.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new Bd(a,b)};k.Int16BufferAttribute=Bd;k.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");
-return new Cd(a,b)};k.Int32BufferAttribute=Cd;k.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new yd(a,b)};k.Int8BufferAttribute=yd;k.IntType=1013;k.InterleavedBuffer=rb;k.InterleavedBufferAttribute=Kd;k.Interpolant=Ma;k.InterpolateDiscrete=2300;k.InterpolateLinear=2301;k.InterpolateSmooth=2302;k.InvertStencilOp=5386;k.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")};k.KeepStencilOp=7680;
-k.KeyframeTrack=ta;k.LOD=Nd;k.LatheBufferGeometry=Zc;k.LatheGeometry=ee;k.Layers=De;k.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")};k.LessDepth=2;k.LessEqualDepth=3;k.LessEqualStencilFunc=515;k.LessStencilFunc=513;k.Light=S;k.LightProbe=Ua;k.LightShadow=lb;k.Line=La;k.Line3=Mg;k.LineBasicMaterial=da;k.LineCurve=Ia;k.LineCurve3=Za;k.LineDashedMaterial=oc;k.LineLoop=Te;k.LinePieces=1;k.LineSegments=ma;k.LineStrip=0;k.LinearEncoding=3E3;k.LinearFilter=
-1006;k.LinearInterpolant=ie;k.LinearMipMapLinearFilter=1008;k.LinearMipMapNearestFilter=1007;k.LinearMipmapLinearFilter=1008;k.LinearMipmapNearestFilter=1007;k.LinearToneMapping=1;k.Loader=V;k.LoaderUtils=lh;k.LoadingManager=qg;k.LogLuvEncoding=3003;k.LoopOnce=2200;k.LoopPingPong=2202;k.LoopRepeat=2201;k.LuminanceAlphaFormat=1025;k.LuminanceFormat=1024;k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};k.Material=K;k.MaterialLoader=pf;k.Math=O;k.MathUtils=O;k.Matrix3=ya;k.Matrix4=N;k.MaxEquation=
-104;k.Mesh=ea;k.MeshBasicMaterial=Pa;k.MeshDepthMaterial=Hb;k.MeshDistanceMaterial=Ib;k.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};k.MeshLambertMaterial=mc;k.MeshMatcapMaterial=nc;k.MeshNormalMaterial=lc;k.MeshPhongMaterial=Mb;k.MeshPhysicalMaterial=jc;k.MeshStandardMaterial=ib;k.MeshToonMaterial=kc;k.MinEquation=103;k.MirroredRepeatWrapping=1002;k.MixOperation=1;k.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
-a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};k.MultiplyBlending=4;k.MultiplyOperation=0;k.NearestFilter=1003;k.NearestMipMapLinearFilter=1005;k.NearestMipMapNearestFilter=1004;k.NearestMipmapLinearFilter=1005;k.NearestMipmapNearestFilter=1004;k.NeverDepth=0;k.NeverStencilFunc=512;k.NoBlending=0;k.NoColors=0;k.NoToneMapping=0;k.NormalAnimationBlendMode=2500;k.NormalBlending=1;k.NotEqualDepth=7;k.NotEqualStencilFunc=517;k.NumberKeyframeTrack=bd;k.Object3D=y;k.ObjectLoader=
-sf;k.ObjectSpaceNormalMap=1;k.OctahedronBufferGeometry=bc;k.OctahedronGeometry=Td;k.OneFactor=201;k.OneMinusDstAlphaFactor=207;k.OneMinusDstColorFactor=209;k.OneMinusSrcAlphaFactor=205;k.OneMinusSrcColorFactor=203;k.OrthographicCamera=fd;k.PCFShadowMap=1;k.PCFSoftShadowMap=2;k.PMREMGenerator=Og;k.ParametricBufferGeometry=Qc;k.ParametricGeometry=Qd;k.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Ld(a)};k.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
-return new Xa(a)};k.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Nc(a,b)};k.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.Path=bb;k.PerspectiveCamera=P;k.Plane=Wa;k.PlaneBufferGeometry=ac;k.PlaneGeometry=Fd;k.PlaneHelper=qe;k.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Nc(a,b)};k.PointCloudMaterial=
-function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.PointLight=jf;k.PointLightHelper=id;k.Points=Nc;k.PointsMaterial=Xa;k.PolarGridHelper=wf;k.PolyhedronBufferGeometry=Ga;k.PolyhedronGeometry=Rd;k.PositionalAudio=Eg;k.PropertyBinding=Aa;k.PropertyMixer=Gg;k.QuadraticBezierCurve=$a;k.QuadraticBezierCurve3=kb;k.Quaternion=va;k.QuaternionKeyframeTrack=je;k.QuaternionLinearInterpolant=af;k.REVISION="117";k.RGBADepthPacking=3201;k.RGBAFormat=
-1023;k.RGBAIntegerFormat=1033;k.RGBA_ASTC_10x10_Format=37819;k.RGBA_ASTC_10x5_Format=37816;k.RGBA_ASTC_10x6_Format=37817;k.RGBA_ASTC_10x8_Format=37818;k.RGBA_ASTC_12x10_Format=37820;k.RGBA_ASTC_12x12_Format=37821;k.RGBA_ASTC_4x4_Format=37808;k.RGBA_ASTC_5x4_Format=37809;k.RGBA_ASTC_5x5_Format=37810;k.RGBA_ASTC_6x5_Format=37811;k.RGBA_ASTC_6x6_Format=37812;k.RGBA_ASTC_8x5_Format=37813;k.RGBA_ASTC_8x6_Format=37814;k.RGBA_ASTC_8x8_Format=37815;k.RGBA_BPTC_Format=36492;k.RGBA_ETC2_EAC_Format=37496;k.RGBA_PVRTC_2BPPV1_Format=
-35843;k.RGBA_PVRTC_4BPPV1_Format=35842;k.RGBA_S3TC_DXT1_Format=33777;k.RGBA_S3TC_DXT3_Format=33778;k.RGBA_S3TC_DXT5_Format=33779;k.RGBDEncoding=3006;k.RGBEEncoding=3002;k.RGBEFormat=1023;k.RGBFormat=1022;k.RGBIntegerFormat=1032;k.RGBM16Encoding=3005;k.RGBM7Encoding=3004;k.RGB_ETC1_Format=36196;k.RGB_ETC2_Format=37492;k.RGB_PVRTC_2BPPV1_Format=35841;k.RGB_PVRTC_4BPPV1_Format=35840;k.RGB_S3TC_DXT1_Format=33776;k.RGFormat=1030;k.RGIntegerFormat=1031;k.RawShaderMaterial=ub;k.Ray=Wb;k.Raycaster=Jg;k.RectAreaLight=
-nf;k.RedFormat=1028;k.RedIntegerFormat=1029;k.ReinhardToneMapping=2;k.RepeatWrapping=1E3;k.ReplaceStencilOp=7681;k.ReverseSubtractEquation=102;k.RingBufferGeometry=Yc;k.RingGeometry=de;k.SRGB8_ALPHA8_ASTC_10x10_Format=37851;k.SRGB8_ALPHA8_ASTC_10x5_Format=37848;k.SRGB8_ALPHA8_ASTC_10x6_Format=37849;k.SRGB8_ALPHA8_ASTC_10x8_Format=37850;k.SRGB8_ALPHA8_ASTC_12x10_Format=37852;k.SRGB8_ALPHA8_ASTC_12x12_Format=37853;k.SRGB8_ALPHA8_ASTC_4x4_Format=37840;k.SRGB8_ALPHA8_ASTC_5x4_Format=37841;k.SRGB8_ALPHA8_ASTC_5x5_Format=
-37842;k.SRGB8_ALPHA8_ASTC_6x5_Format=37843;k.SRGB8_ALPHA8_ASTC_6x6_Format=37844;k.SRGB8_ALPHA8_ASTC_8x5_Format=37845;k.SRGB8_ALPHA8_ASTC_8x6_Format=37846;k.SRGB8_ALPHA8_ASTC_8x8_Format=37847;k.Scene=zc;k.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};
-k.ShaderChunk=M;k.ShaderLib=gb;k.ShaderMaterial=Ca;k.ShadowMaterial=ic;k.Shape=Nb;k.ShapeBufferGeometry=gc;k.ShapeGeometry=fc;k.ShapePath=wg;k.ShapeUtils=sb;k.ShortType=1011;k.Skeleton=Re;k.SkeletonHelper=pc;k.SkinnedMesh=Qe;k.SmoothShading=2;k.Sphere=eb;k.SphereBufferGeometry=ec;k.SphereGeometry=ce;k.Spherical=li;k.SphericalHarmonics3=of;k.SphericalReflectionMapping=305;k.Spline=Sg;k.SplineCurve=ab;k.SplineCurve3=si;k.SpotLight=hf;k.SpotLightHelper=hd;k.SpotLightShadow=gf;k.Sprite=Ld;k.SpriteMaterial=
-Kb;k.SrcAlphaFactor=204;k.SrcAlphaSaturateFactor=210;k.SrcColorFactor=202;k.StaticCopyUsage=35046;k.StaticDrawUsage=35044;k.StaticReadUsage=35045;k.StereoCamera=gi;k.StreamCopyUsage=35042;k.StreamDrawUsage=35040;k.StreamReadUsage=35041;k.StringKeyframeTrack=bf;k.SubtractEquation=101;k.SubtractiveBlending=3;k.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3};k.TangentSpaceNormalMap=0;k.TetrahedronBufferGeometry=Rc;k.TetrahedronGeometry=Sd;k.TextBufferGeometry=Xc;k.TextGeometry=be;k.Texture=W;k.TextureLoader=
-ef;k.TorusBufferGeometry=Vc;k.TorusGeometry=Yd;k.TorusKnotBufferGeometry=Uc;k.TorusKnotGeometry=Xd;k.Triangle=pa;k.TriangleFanDrawMode=2;k.TriangleStripDrawMode=1;k.TrianglesDrawMode=0;k.TubeBufferGeometry=cc;k.TubeGeometry=Wd;k.UVMapping=300;k.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new Xb(a,b)};k.Uint16BufferAttribute=Xb;k.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");
-return new Yb(a,b)};k.Uint32BufferAttribute=Yb;k.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new zd(a,b)};k.Uint8BufferAttribute=zd;k.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new Ad(a,b)};k.Uint8ClampedBufferAttribute=Ad;k.Uncharted2ToneMapping=3;k.Uniform=uf;k.UniformsLib=A;k.UniformsUtils=
-Oh;k.UnsignedByteType=1009;k.UnsignedInt248Type=1020;k.UnsignedIntType=1014;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedShortType=1012;k.VSMShadowMap=3;k.Vector2=v;k.Vector3=p;k.Vector4=R;k.VectorKeyframeTrack=cd;k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};k.VertexColors=2;k.VideoTexture=ng;k.WebGLCubeRenderTarget=Zb;k.WebGLMultisampleRenderTarget=Xf;k.WebGLRenderTarget=
-Ba;k.WebGLRenderTargetCube=function(a,b,c){console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).");return new Zb(a,c)};k.WebGLRenderer=jg;k.WebGLUtils=Th;k.WireframeGeometry=Pc;k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new ma(new Pc(a.geometry),new da({color:void 0!==b?b:16777215}))};k.WrapAroundEnding=2402;k.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");
-return new Ta(a)};k.ZeroCurvatureEnding=2400;k.ZeroFactor=200;k.ZeroSlopeEnding=2401;k.ZeroStencilOp=0;k.sRGBEncoding=3001;Object.defineProperty(k,"__esModule",{value:!0})});
-
-},{}],243:[function(require,module,exports){
-'use strict';
-
-module.exports = TinyQueue;
-
-function TinyQueue(data, compare) {
-    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
-
-    this.data = data || [];
-    this.length = this.data.length;
-    this.compare = compare || defaultCompare;
-
-    if (this.length > 0) {
-        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
-    }
-}
-
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
-
-TinyQueue.prototype = {
-
-    push: function (item) {
-        this.data.push(item);
-        this.length++;
-        this._up(this.length - 1);
-    },
-
-    pop: function () {
-        if (this.length === 0) return undefined;
-        var top = this.data[0];
-        this.length--;
-        if (this.length > 0) {
-            this.data[0] = this.data[this.length];
-            this._down(0);
-        }
-        this.data.pop();
-        return top;
-    },
-
-    peek: function () {
-        return this.data[0];
-    },
-
-    _up: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var item = data[pos];
-
-        while (pos > 0) {
-            var parent = (pos - 1) >> 1;
-            var current = data[parent];
-            if (compare(item, current) >= 0) break;
-            data[pos] = current;
-            pos = parent;
-        }
-
-        data[pos] = item;
-    },
-
-    _down: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var len = this.length;
-        var halfLen = len >> 1;
-        var item = data[pos];
-
-        while (pos < halfLen) {
-            var left = (pos << 1) + 1;
-            var right = left + 1;
-            var best = data[left];
-
-            if (right < len && compare(data[right], best) < 0) {
-                left = right;
-                best = data[right];
-            }
-            if (compare(best, item) >= 0) break;
-
-            data[pos] = best;
-            pos = left;
-        }
-
-        data[pos] = item;
-    }
-};
-
-},{}],244:[function(require,module,exports){
-var createElement = require("./vdom/create-element.js")
-
-module.exports = createElement
-
-},{"./vdom/create-element.js":250}],245:[function(require,module,exports){
-var diff = require("./vtree/diff.js")
-
-module.exports = diff
-
-},{"./vtree/diff.js":270}],246:[function(require,module,exports){
-var h = require("./virtual-hyperscript/index.js")
-
-module.exports = h
-
-},{"./virtual-hyperscript/index.js":257}],247:[function(require,module,exports){
-var diff = require("./diff.js")
-var patch = require("./patch.js")
-var h = require("./h.js")
-var create = require("./create-element.js")
-var VNode = require('./vnode/vnode.js')
-var VText = require('./vnode/vtext.js')
-
-module.exports = {
-    diff: diff,
-    patch: patch,
-    h: h,
-    create: create,
-    VNode: VNode,
-    VText: VText
-}
-
-},{"./create-element.js":244,"./diff.js":245,"./h.js":246,"./patch.js":248,"./vnode/vnode.js":266,"./vnode/vtext.js":268}],248:[function(require,module,exports){
-var patch = require("./vdom/patch.js")
-
-module.exports = patch
-
-},{"./vdom/patch.js":253}],249:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook.js")
-
-module.exports = applyProperties
-
-function applyProperties(node, props, previous) {
-    for (var propName in props) {
-        var propValue = props[propName]
-
-        if (propValue === undefined) {
-            removeProperty(node, propName, propValue, previous);
-        } else if (isHook(propValue)) {
-            removeProperty(node, propName, propValue, previous)
-            if (propValue.hook) {
-                propValue.hook(node,
-                    propName,
-                    previous ? previous[propName] : undefined)
-            }
-        } else {
-            if (isObject(propValue)) {
-                patchObject(node, props, previous, propName, propValue);
-            } else {
-                node[propName] = propValue
-            }
-        }
-    }
-}
-
-function removeProperty(node, propName, propValue, previous) {
-    if (previous) {
-        var previousValue = previous[propName]
-
-        if (!isHook(previousValue)) {
-            if (propName === "attributes") {
-                for (var attrName in previousValue) {
-                    node.removeAttribute(attrName)
-                }
-            } else if (propName === "style") {
-                for (var i in previousValue) {
-                    node.style[i] = ""
-                }
-            } else if (typeof previousValue === "string") {
-                node[propName] = ""
-            } else {
-                node[propName] = null
-            }
-        } else if (previousValue.unhook) {
-            previousValue.unhook(node, propName, propValue)
-        }
-    }
-}
-
-function patchObject(node, props, previous, propName, propValue) {
-    var previousValue = previous ? previous[propName] : undefined
-
-    // Set attributes
-    if (propName === "attributes") {
-        for (var attrName in propValue) {
-            var attrValue = propValue[attrName]
-
-            if (attrValue === undefined) {
-                node.removeAttribute(attrName)
-            } else {
-                node.setAttribute(attrName, attrValue)
-            }
-        }
-
-        return
-    }
-
-    if(previousValue && isObject(previousValue) &&
-        getPrototype(previousValue) !== getPrototype(propValue)) {
-        node[propName] = propValue
-        return
-    }
-
-    if (!isObject(node[propName])) {
-        node[propName] = {}
-    }
-
-    var replacer = propName === "style" ? "" : undefined
-
-    for (var k in propValue) {
-        var value = propValue[k]
-        node[propName][k] = (value === undefined) ? replacer : value
-    }
-}
-
-function getPrototype(value) {
-    if (Object.getPrototypeOf) {
-        return Object.getPrototypeOf(value)
-    } else if (value.__proto__) {
-        return value.__proto__
-    } else if (value.constructor) {
-        return value.constructor.prototype
-    }
-}
-
-},{"../vnode/is-vhook.js":261,"is-object":20}],250:[function(require,module,exports){
-var document = require("global/document")
-
-var applyProperties = require("./apply-properties")
-
-var isVNode = require("../vnode/is-vnode.js")
-var isVText = require("../vnode/is-vtext.js")
-var isWidget = require("../vnode/is-widget.js")
-var handleThunk = require("../vnode/handle-thunk.js")
-
-module.exports = createElement
-
-function createElement(vnode, opts) {
-    var doc = opts ? opts.document || document : document
-    var warn = opts ? opts.warn : null
-
-    vnode = handleThunk(vnode).a
-
-    if (isWidget(vnode)) {
-        return vnode.init()
-    } else if (isVText(vnode)) {
-        return doc.createTextNode(vnode.text)
-    } else if (!isVNode(vnode)) {
-        if (warn) {
-            warn("Item is not a valid virtual dom node", vnode)
-        }
-        return null
-    }
-
-    var node = (vnode.namespace === null) ?
-        doc.createElement(vnode.tagName) :
-        doc.createElementNS(vnode.namespace, vnode.tagName)
-
-    var props = vnode.properties
-    applyProperties(node, props)
-
-    var children = vnode.children
-
-    for (var i = 0; i < children.length; i++) {
-        var childNode = createElement(children[i], opts)
-        if (childNode) {
-            node.appendChild(childNode)
-        }
-    }
-
-    return node
-}
-
-},{"../vnode/handle-thunk.js":259,"../vnode/is-vnode.js":262,"../vnode/is-vtext.js":263,"../vnode/is-widget.js":264,"./apply-properties":249,"global/document":16}],251:[function(require,module,exports){
-// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
-// We don't want to read all of the DOM nodes in the tree so we use
-// the in-order tree indexing to eliminate recursion down certain branches.
-// We only recurse into a DOM node if we know that it contains a child of
-// interest.
-
-var noChild = {}
-
-module.exports = domIndex
-
-function domIndex(rootNode, tree, indices, nodes) {
-    if (!indices || indices.length === 0) {
-        return {}
-    } else {
-        indices.sort(ascending)
-        return recurse(rootNode, tree, indices, nodes, 0)
-    }
-}
-
-function recurse(rootNode, tree, indices, nodes, rootIndex) {
-    nodes = nodes || {}
-
-
-    if (rootNode) {
-        if (indexInRange(indices, rootIndex, rootIndex)) {
-            nodes[rootIndex] = rootNode
-        }
-
-        var vChildren = tree.children
-
-        if (vChildren) {
-
-            var childNodes = rootNode.childNodes
-
-            for (var i = 0; i < tree.children.length; i++) {
-                rootIndex += 1
-
-                var vChild = vChildren[i] || noChild
-                var nextIndex = rootIndex + (vChild.count || 0)
-
-                // skip recursion down the tree if there are no nodes down here
-                if (indexInRange(indices, rootIndex, nextIndex)) {
-                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
-                }
-
-                rootIndex = nextIndex
-            }
-        }
-    }
-
-    return nodes
-}
-
-// Binary search for an index in the interval [left, right]
-function indexInRange(indices, left, right) {
-    if (indices.length === 0) {
-        return false
-    }
-
-    var minIndex = 0
-    var maxIndex = indices.length - 1
-    var currentIndex
-    var currentItem
-
-    while (minIndex <= maxIndex) {
-        currentIndex = ((maxIndex + minIndex) / 2) >> 0
-        currentItem = indices[currentIndex]
-
-        if (minIndex === maxIndex) {
-            return currentItem >= left && currentItem <= right
-        } else if (currentItem < left) {
-            minIndex = currentIndex + 1
-        } else  if (currentItem > right) {
-            maxIndex = currentIndex - 1
-        } else {
-            return true
-        }
-    }
-
-    return false;
-}
-
-function ascending(a, b) {
-    return a > b ? 1 : -1
-}
-
-},{}],252:[function(require,module,exports){
-var applyProperties = require("./apply-properties")
-
-var isWidget = require("../vnode/is-widget.js")
-var VPatch = require("../vnode/vpatch.js")
-
-var updateWidget = require("./update-widget")
-
-module.exports = applyPatch
-
-function applyPatch(vpatch, domNode, renderOptions) {
-    var type = vpatch.type
-    var vNode = vpatch.vNode
-    var patch = vpatch.patch
-
-    switch (type) {
-        case VPatch.REMOVE:
-            return removeNode(domNode, vNode)
-        case VPatch.INSERT:
-            return insertNode(domNode, patch, renderOptions)
-        case VPatch.VTEXT:
-            return stringPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.WIDGET:
-            return widgetPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.VNODE:
-            return vNodePatch(domNode, vNode, patch, renderOptions)
-        case VPatch.ORDER:
-            reorderChildren(domNode, patch)
-            return domNode
-        case VPatch.PROPS:
-            applyProperties(domNode, patch, vNode.properties)
-            return domNode
-        case VPatch.THUNK:
-            return replaceRoot(domNode,
-                renderOptions.patch(domNode, patch, renderOptions))
-        default:
-            return domNode
-    }
-}
-
-function removeNode(domNode, vNode) {
-    var parentNode = domNode.parentNode
-
-    if (parentNode) {
-        parentNode.removeChild(domNode)
-    }
-
-    destroyWidget(domNode, vNode);
-
-    return null
-}
-
-function insertNode(parentNode, vNode, renderOptions) {
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode) {
-        parentNode.appendChild(newNode)
-    }
-
-    return parentNode
-}
-
-function stringPatch(domNode, leftVNode, vText, renderOptions) {
-    var newNode
-
-    if (domNode.nodeType === 3) {
-        domNode.replaceData(0, domNode.length, vText.text)
-        newNode = domNode
-    } else {
-        var parentNode = domNode.parentNode
-        newNode = renderOptions.render(vText, renderOptions)
-
-        if (parentNode && newNode !== domNode) {
-            parentNode.replaceChild(newNode, domNode)
-        }
-    }
-
-    return newNode
-}
-
-function widgetPatch(domNode, leftVNode, widget, renderOptions) {
-    var updating = updateWidget(leftVNode, widget)
-    var newNode
-
-    if (updating) {
-        newNode = widget.update(leftVNode, domNode) || domNode
-    } else {
-        newNode = renderOptions.render(widget, renderOptions)
-    }
-
-    var parentNode = domNode.parentNode
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    if (!updating) {
-        destroyWidget(domNode, leftVNode)
-    }
-
-    return newNode
-}
-
-function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
-    var parentNode = domNode.parentNode
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    return newNode
-}
-
-function destroyWidget(domNode, w) {
-    if (typeof w.destroy === "function" && isWidget(w)) {
-        w.destroy(domNode)
-    }
-}
-
-function reorderChildren(domNode, moves) {
-    var childNodes = domNode.childNodes
-    var keyMap = {}
-    var node
-    var remove
-    var insert
-
-    for (var i = 0; i < moves.removes.length; i++) {
-        remove = moves.removes[i]
-        node = childNodes[remove.from]
-        if (remove.key) {
-            keyMap[remove.key] = node
-        }
-        domNode.removeChild(node)
-    }
-
-    var length = childNodes.length
-    for (var j = 0; j < moves.inserts.length; j++) {
-        insert = moves.inserts[j]
-        node = keyMap[insert.key]
-        // this is the weirdest bug i've ever seen in webkit
-        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
-    }
-}
-
-function replaceRoot(oldRoot, newRoot) {
-    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
-        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
-    }
-
-    return newRoot;
-}
-
-},{"../vnode/is-widget.js":264,"../vnode/vpatch.js":267,"./apply-properties":249,"./update-widget":254}],253:[function(require,module,exports){
-var document = require("global/document")
-var isArray = require("x-is-array")
-
-var render = require("./create-element")
-var domIndex = require("./dom-index")
-var patchOp = require("./patch-op")
-module.exports = patch
-
-function patch(rootNode, patches, renderOptions) {
-    renderOptions = renderOptions || {}
-    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
-        ? renderOptions.patch
-        : patchRecursive
-    renderOptions.render = renderOptions.render || render
-
-    return renderOptions.patch(rootNode, patches, renderOptions)
-}
-
-function patchRecursive(rootNode, patches, renderOptions) {
-    var indices = patchIndices(patches)
-
-    if (indices.length === 0) {
-        return rootNode
-    }
-
-    var index = domIndex(rootNode, patches.a, indices)
-    var ownerDocument = rootNode.ownerDocument
-
-    if (!renderOptions.document && ownerDocument !== document) {
-        renderOptions.document = ownerDocument
-    }
-
-    for (var i = 0; i < indices.length; i++) {
-        var nodeIndex = indices[i]
-        rootNode = applyPatch(rootNode,
-            index[nodeIndex],
-            patches[nodeIndex],
-            renderOptions)
-    }
-
-    return rootNode
-}
-
-function applyPatch(rootNode, domNode, patchList, renderOptions) {
-    if (!domNode) {
-        return rootNode
-    }
-
-    var newNode
-
-    if (isArray(patchList)) {
-        for (var i = 0; i < patchList.length; i++) {
-            newNode = patchOp(patchList[i], domNode, renderOptions)
-
-            if (domNode === rootNode) {
-                rootNode = newNode
-            }
-        }
-    } else {
-        newNode = patchOp(patchList, domNode, renderOptions)
-
-        if (domNode === rootNode) {
-            rootNode = newNode
-        }
-    }
-
-    return rootNode
-}
-
-function patchIndices(patches) {
-    var indices = []
-
-    for (var key in patches) {
-        if (key !== "a") {
-            indices.push(Number(key))
-        }
-    }
-
-    return indices
-}
-
-},{"./create-element":250,"./dom-index":251,"./patch-op":252,"global/document":16,"x-is-array":289}],254:[function(require,module,exports){
-var isWidget = require("../vnode/is-widget.js")
-
-module.exports = updateWidget
-
-function updateWidget(a, b) {
-    if (isWidget(a) && isWidget(b)) {
-        if ("name" in a && "name" in b) {
-            return a.id === b.id
-        } else {
-            return a.init === b.init
-        }
-    }
-
-    return false
-}
-
-},{"../vnode/is-widget.js":264}],255:[function(require,module,exports){
-'use strict';
-
-var EvStore = require('ev-store');
-
-module.exports = EvHook;
-
-function EvHook(value) {
-    if (!(this instanceof EvHook)) {
-        return new EvHook(value);
-    }
-
-    this.value = value;
-}
-
-EvHook.prototype.hook = function (node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = this.value;
-};
-
-EvHook.prototype.unhook = function(node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = undefined;
-};
-
-},{"ev-store":9}],256:[function(require,module,exports){
-'use strict';
-
-module.exports = SoftSetHook;
-
-function SoftSetHook(value) {
-    if (!(this instanceof SoftSetHook)) {
-        return new SoftSetHook(value);
-    }
-
-    this.value = value;
-}
-
-SoftSetHook.prototype.hook = function (node, propertyName) {
-    if (node[propertyName] !== this.value) {
-        node[propertyName] = this.value;
-    }
-};
-
-},{}],257:[function(require,module,exports){
-'use strict';
-
-var isArray = require('x-is-array');
-
-var VNode = require('../vnode/vnode.js');
-var VText = require('../vnode/vtext.js');
-var isVNode = require('../vnode/is-vnode');
-var isVText = require('../vnode/is-vtext');
-var isWidget = require('../vnode/is-widget');
-var isHook = require('../vnode/is-vhook');
-var isVThunk = require('../vnode/is-thunk');
-
-var parseTag = require('./parse-tag.js');
-var softSetHook = require('./hooks/soft-set-hook.js');
-var evHook = require('./hooks/ev-hook.js');
-
-module.exports = h;
-
-function h(tagName, properties, children) {
-    var childNodes = [];
-    var tag, props, key, namespace;
-
-    if (!children && isChildren(properties)) {
-        children = properties;
-        props = {};
-    }
-
-    props = props || properties || {};
-    tag = parseTag(tagName, props);
-
-    // support keys
-    if (props.hasOwnProperty('key')) {
-        key = props.key;
-        props.key = undefined;
-    }
-
-    // support namespace
-    if (props.hasOwnProperty('namespace')) {
-        namespace = props.namespace;
-        props.namespace = undefined;
-    }
-
-    // fix cursor bug
-    if (tag === 'INPUT' &&
-        !namespace &&
-        props.hasOwnProperty('value') &&
-        props.value !== undefined &&
-        !isHook(props.value)
-    ) {
-        props.value = softSetHook(props.value);
-    }
-
-    transformProperties(props);
-
-    if (children !== undefined && children !== null) {
-        addChild(children, childNodes, tag, props);
-    }
-
-
-    return new VNode(tag, props, childNodes, key, namespace);
-}
-
-function addChild(c, childNodes, tag, props) {
-    if (typeof c === 'string') {
-        childNodes.push(new VText(c));
-    } else if (typeof c === 'number') {
-        childNodes.push(new VText(String(c)));
-    } else if (isChild(c)) {
-        childNodes.push(c);
-    } else if (isArray(c)) {
-        for (var i = 0; i < c.length; i++) {
-            addChild(c[i], childNodes, tag, props);
-        }
-    } else if (c === null || c === undefined) {
-        return;
-    } else {
-        throw UnexpectedVirtualElement({
-            foreignObject: c,
-            parentVnode: {
-                tagName: tag,
-                properties: props
-            }
-        });
-    }
-}
-
-function transformProperties(props) {
-    for (var propName in props) {
-        if (props.hasOwnProperty(propName)) {
-            var value = props[propName];
-
-            if (isHook(value)) {
-                continue;
-            }
-
-            if (propName.substr(0, 3) === 'ev-') {
-                // add ev-foo support
-                props[propName] = evHook(value);
-            }
-        }
-    }
-}
-
-function isChild(x) {
-    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
-}
-
-function isChildren(x) {
-    return typeof x === 'string' || isArray(x) || isChild(x);
-}
-
-function UnexpectedVirtualElement(data) {
-    var err = new Error();
-
-    err.type = 'virtual-hyperscript.unexpected.virtual-element';
-    err.message = 'Unexpected virtual child passed to h().\n' +
-        'Expected a VNode / Vthunk / VWidget / string but:\n' +
-        'got:\n' +
-        errorString(data.foreignObject) +
-        '.\n' +
-        'The parent vnode is:\n' +
-        errorString(data.parentVnode)
-        '\n' +
-        'Suggested fix: change your `h(..., [ ... ])` callsite.';
-    err.foreignObject = data.foreignObject;
-    err.parentVnode = data.parentVnode;
-
-    return err;
-}
-
-function errorString(obj) {
-    try {
-        return JSON.stringify(obj, null, '    ');
-    } catch (e) {
-        return String(obj);
-    }
-}
-
-},{"../vnode/is-thunk":260,"../vnode/is-vhook":261,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vnode.js":266,"../vnode/vtext.js":268,"./hooks/ev-hook.js":255,"./hooks/soft-set-hook.js":256,"./parse-tag.js":258,"x-is-array":289}],258:[function(require,module,exports){
-'use strict';
-
-var split = require('browser-split');
-
-var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
-var notClassId = /^\.|#/;
-
-module.exports = parseTag;
-
-function parseTag(tag, props) {
-    if (!tag) {
-        return 'DIV';
-    }
-
-    var noId = !(props.hasOwnProperty('id'));
-
-    var tagParts = split(tag, classIdSplit);
-    var tagName = null;
-
-    if (notClassId.test(tagParts[1])) {
-        tagName = 'DIV';
-    }
-
-    var classes, part, type, i;
-
-    for (i = 0; i < tagParts.length; i++) {
-        part = tagParts[i];
-
-        if (!part) {
-            continue;
-        }
-
-        type = part.charAt(0);
-
-        if (!tagName) {
-            tagName = part;
-        } else if (type === '.') {
-            classes = classes || [];
-            classes.push(part.substring(1, part.length));
-        } else if (type === '#' && noId) {
-            props.id = part.substring(1, part.length);
-        }
-    }
-
-    if (classes) {
-        if (props.className) {
-            classes.push(props.className);
-        }
-
-        props.className = classes.join(' ');
-    }
-
-    return props.namespace ? tagName : tagName.toUpperCase();
-}
-
-},{"browser-split":5}],259:[function(require,module,exports){
-var isVNode = require("./is-vnode")
-var isVText = require("./is-vtext")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-
-module.exports = handleThunk
-
-function handleThunk(a, b) {
-    var renderedA = a
-    var renderedB = b
-
-    if (isThunk(b)) {
-        renderedB = renderThunk(b, a)
-    }
-
-    if (isThunk(a)) {
-        renderedA = renderThunk(a, null)
-    }
-
-    return {
-        a: renderedA,
-        b: renderedB
-    }
-}
-
-function renderThunk(thunk, previous) {
-    var renderedThunk = thunk.vnode
-
-    if (!renderedThunk) {
-        renderedThunk = thunk.vnode = thunk.render(previous)
-    }
-
-    if (!(isVNode(renderedThunk) ||
-            isVText(renderedThunk) ||
-            isWidget(renderedThunk))) {
-        throw new Error("thunk did not return a valid node");
-    }
-
-    return renderedThunk
-}
-
-},{"./is-thunk":260,"./is-vnode":262,"./is-vtext":263,"./is-widget":264}],260:[function(require,module,exports){
-module.exports = isThunk
-
-function isThunk(t) {
-    return t && t.type === "Thunk"
-}
-
-},{}],261:[function(require,module,exports){
-module.exports = isHook
-
-function isHook(hook) {
-    return hook &&
-      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
-       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
-}
-
-},{}],262:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualNode
-
-function isVirtualNode(x) {
-    return x && x.type === "VirtualNode" && x.version === version
-}
-
-},{"./version":265}],263:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualText
-
-function isVirtualText(x) {
-    return x && x.type === "VirtualText" && x.version === version
-}
-
-},{"./version":265}],264:[function(require,module,exports){
-module.exports = isWidget
-
-function isWidget(w) {
-    return w && w.type === "Widget"
-}
-
-},{}],265:[function(require,module,exports){
-module.exports = "2"
-
-},{}],266:[function(require,module,exports){
-var version = require("./version")
-var isVNode = require("./is-vnode")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-var isVHook = require("./is-vhook")
-
-module.exports = VirtualNode
-
-var noProperties = {}
-var noChildren = []
-
-function VirtualNode(tagName, properties, children, key, namespace) {
-    this.tagName = tagName
-    this.properties = properties || noProperties
-    this.children = children || noChildren
-    this.key = key != null ? String(key) : undefined
-    this.namespace = (typeof namespace === "string") ? namespace : null
-
-    var count = (children && children.length) || 0
-    var descendants = 0
-    var hasWidgets = false
-    var hasThunks = false
-    var descendantHooks = false
-    var hooks
-
-    for (var propName in properties) {
-        if (properties.hasOwnProperty(propName)) {
-            var property = properties[propName]
-            if (isVHook(property) && property.unhook) {
-                if (!hooks) {
-                    hooks = {}
-                }
-
-                hooks[propName] = property
-            }
-        }
-    }
-
-    for (var i = 0; i < count; i++) {
-        var child = children[i]
-        if (isVNode(child)) {
-            descendants += child.count || 0
-
-            if (!hasWidgets && child.hasWidgets) {
-                hasWidgets = true
-            }
-
-            if (!hasThunks && child.hasThunks) {
-                hasThunks = true
-            }
-
-            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
-                descendantHooks = true
-            }
-        } else if (!hasWidgets && isWidget(child)) {
-            if (typeof child.destroy === "function") {
-                hasWidgets = true
-            }
-        } else if (!hasThunks && isThunk(child)) {
-            hasThunks = true;
-        }
-    }
-
-    this.count = count + descendants
-    this.hasWidgets = hasWidgets
-    this.hasThunks = hasThunks
-    this.hooks = hooks
-    this.descendantHooks = descendantHooks
-}
-
-VirtualNode.prototype.version = version
-VirtualNode.prototype.type = "VirtualNode"
-
-},{"./is-thunk":260,"./is-vhook":261,"./is-vnode":262,"./is-widget":264,"./version":265}],267:[function(require,module,exports){
-var version = require("./version")
-
-VirtualPatch.NONE = 0
-VirtualPatch.VTEXT = 1
-VirtualPatch.VNODE = 2
-VirtualPatch.WIDGET = 3
-VirtualPatch.PROPS = 4
-VirtualPatch.ORDER = 5
-VirtualPatch.INSERT = 6
-VirtualPatch.REMOVE = 7
-VirtualPatch.THUNK = 8
-
-module.exports = VirtualPatch
-
-function VirtualPatch(type, vNode, patch) {
-    this.type = Number(type)
-    this.vNode = vNode
-    this.patch = patch
-}
-
-VirtualPatch.prototype.version = version
-VirtualPatch.prototype.type = "VirtualPatch"
-
-},{"./version":265}],268:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = VirtualText
-
-function VirtualText(text) {
-    this.text = String(text)
-}
-
-VirtualText.prototype.version = version
-VirtualText.prototype.type = "VirtualText"
-
-},{"./version":265}],269:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook")
-
-module.exports = diffProps
-
-function diffProps(a, b) {
-    var diff
-
-    for (var aKey in a) {
-        if (!(aKey in b)) {
-            diff = diff || {}
-            diff[aKey] = undefined
-        }
-
-        var aValue = a[aKey]
-        var bValue = b[aKey]
-
-        if (aValue === bValue) {
-            continue
-        } else if (isObject(aValue) && isObject(bValue)) {
-            if (getPrototype(bValue) !== getPrototype(aValue)) {
-                diff = diff || {}
-                diff[aKey] = bValue
-            } else if (isHook(bValue)) {
-                 diff = diff || {}
-                 diff[aKey] = bValue
-            } else {
-                var objectDiff = diffProps(aValue, bValue)
-                if (objectDiff) {
-                    diff = diff || {}
-                    diff[aKey] = objectDiff
-                }
-            }
-        } else {
-            diff = diff || {}
-            diff[aKey] = bValue
-        }
-    }
-
-    for (var bKey in b) {
-        if (!(bKey in a)) {
-            diff = diff || {}
-            diff[bKey] = b[bKey]
-        }
-    }
-
-    return diff
-}
-
-function getPrototype(value) {
-  if (Object.getPrototypeOf) {
-    return Object.getPrototypeOf(value)
-  } else if (value.__proto__) {
-    return value.__proto__
-  } else if (value.constructor) {
-    return value.constructor.prototype
-  }
-}
-
-},{"../vnode/is-vhook":261,"is-object":20}],270:[function(require,module,exports){
-var isArray = require("x-is-array")
-
-var VPatch = require("../vnode/vpatch")
-var isVNode = require("../vnode/is-vnode")
-var isVText = require("../vnode/is-vtext")
-var isWidget = require("../vnode/is-widget")
-var isThunk = require("../vnode/is-thunk")
-var handleThunk = require("../vnode/handle-thunk")
-
-var diffProps = require("./diff-props")
-
-module.exports = diff
-
-function diff(a, b) {
-    var patch = { a: a }
-    walk(a, b, patch, 0)
-    return patch
-}
-
-function walk(a, b, patch, index) {
-    if (a === b) {
-        return
-    }
-
-    var apply = patch[index]
-    var applyClear = false
-
-    if (isThunk(a) || isThunk(b)) {
-        thunks(a, b, patch, index)
-    } else if (b == null) {
-
-        // If a is a widget we will add a remove patch for it
-        // Otherwise any child widgets/hooks must be destroyed.
-        // This prevents adding two remove patches for a widget.
-        if (!isWidget(a)) {
-            clearState(a, patch, index)
-            apply = patch[index]
-        }
-
-        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
-    } else if (isVNode(b)) {
-        if (isVNode(a)) {
-            if (a.tagName === b.tagName &&
-                a.namespace === b.namespace &&
-                a.key === b.key) {
-                var propsPatch = diffProps(a.properties, b.properties)
-                if (propsPatch) {
-                    apply = appendPatch(apply,
-                        new VPatch(VPatch.PROPS, a, propsPatch))
-                }
-                apply = diffChildren(a, b, patch, apply, index)
-            } else {
-                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-                applyClear = true
-            }
-        } else {
-            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-            applyClear = true
-        }
-    } else if (isVText(b)) {
-        if (!isVText(a)) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-            applyClear = true
-        } else if (a.text !== b.text) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-        }
-    } else if (isWidget(b)) {
-        if (!isWidget(a)) {
-            applyClear = true
-        }
-
-        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
-    }
-
-    if (apply) {
-        patch[index] = apply
-    }
-
-    if (applyClear) {
-        clearState(a, patch, index)
-    }
-}
-
-function diffChildren(a, b, patch, apply, index) {
-    var aChildren = a.children
-    var orderedSet = reorder(aChildren, b.children)
-    var bChildren = orderedSet.children
-
-    var aLen = aChildren.length
-    var bLen = bChildren.length
-    var len = aLen > bLen ? aLen : bLen
-
-    for (var i = 0; i < len; i++) {
-        var leftNode = aChildren[i]
-        var rightNode = bChildren[i]
-        index += 1
-
-        if (!leftNode) {
-            if (rightNode) {
-                // Excess nodes in b need to be added
-                apply = appendPatch(apply,
-                    new VPatch(VPatch.INSERT, null, rightNode))
-            }
-        } else {
-            walk(leftNode, rightNode, patch, index)
-        }
-
-        if (isVNode(leftNode) && leftNode.count) {
-            index += leftNode.count
-        }
-    }
-
-    if (orderedSet.moves) {
-        // Reorder nodes last
-        apply = appendPatch(apply, new VPatch(
-            VPatch.ORDER,
-            a,
-            orderedSet.moves
-        ))
-    }
-
-    return apply
-}
-
-function clearState(vNode, patch, index) {
-    // TODO: Make this a single walk, not two
-    unhook(vNode, patch, index)
-    destroyWidgets(vNode, patch, index)
-}
-
-// Patch records for all destroyed widgets must be added because we need
-// a DOM node reference for the destroy function
-function destroyWidgets(vNode, patch, index) {
-    if (isWidget(vNode)) {
-        if (typeof vNode.destroy === "function") {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(VPatch.REMOVE, vNode, null)
-            )
-        }
-    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
-        var children = vNode.children
-        var len = children.length
-        for (var i = 0; i < len; i++) {
-            var child = children[i]
-            index += 1
-
-            destroyWidgets(child, patch, index)
-
-            if (isVNode(child) && child.count) {
-                index += child.count
-            }
-        }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
-    }
-}
-
-// Create a sub-patch for thunks
-function thunks(a, b, patch, index) {
-    var nodes = handleThunk(a, b)
-    var thunkPatch = diff(nodes.a, nodes.b)
-    if (hasPatches(thunkPatch)) {
-        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
-    }
-}
-
-function hasPatches(patch) {
-    for (var index in patch) {
-        if (index !== "a") {
-            return true
-        }
-    }
-
-    return false
-}
-
-// Execute hooks when two nodes are identical
-function unhook(vNode, patch, index) {
-    if (isVNode(vNode)) {
-        if (vNode.hooks) {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(
-                    VPatch.PROPS,
-                    vNode,
-                    undefinedKeys(vNode.hooks)
-                )
-            )
-        }
-
-        if (vNode.descendantHooks || vNode.hasThunks) {
-            var children = vNode.children
-            var len = children.length
-            for (var i = 0; i < len; i++) {
-                var child = children[i]
-                index += 1
-
-                unhook(child, patch, index)
-
-                if (isVNode(child) && child.count) {
-                    index += child.count
-                }
-            }
-        }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
-    }
-}
-
-function undefinedKeys(obj) {
-    var result = {}
-
-    for (var key in obj) {
-        result[key] = undefined
-    }
-
-    return result
-}
-
-// List diff, naive left to right reordering
-function reorder(aChildren, bChildren) {
-    // O(M) time, O(M) memory
-    var bChildIndex = keyIndex(bChildren)
-    var bKeys = bChildIndex.keys
-    var bFree = bChildIndex.free
-
-    if (bFree.length === bChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
-        }
-    }
-
-    // O(N) time, O(N) memory
-    var aChildIndex = keyIndex(aChildren)
-    var aKeys = aChildIndex.keys
-    var aFree = aChildIndex.free
-
-    if (aFree.length === aChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
-        }
-    }
-
-    // O(MAX(N, M)) memory
-    var newChildren = []
-
-    var freeIndex = 0
-    var freeCount = bFree.length
-    var deletedItems = 0
-
-    // Iterate through a and match a node in b
-    // O(N) time,
-    for (var i = 0 ; i < aChildren.length; i++) {
-        var aItem = aChildren[i]
-        var itemIndex
-
-        if (aItem.key) {
-            if (bKeys.hasOwnProperty(aItem.key)) {
-                // Match up the old keys
-                itemIndex = bKeys[aItem.key]
-                newChildren.push(bChildren[itemIndex])
-
-            } else {
-                // Remove old keyed items
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        } else {
-            // Match the item in a with the next free item in b
-            if (freeIndex < freeCount) {
-                itemIndex = bFree[freeIndex++]
-                newChildren.push(bChildren[itemIndex])
-            } else {
-                // There are no free items in b to match with
-                // the free items in a, so the extra free nodes
-                // are deleted.
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        }
-    }
-
-    var lastFreeIndex = freeIndex >= bFree.length ?
-        bChildren.length :
-        bFree[freeIndex]
-
-    // Iterate through b and append any new keys
-    // O(M) time
-    for (var j = 0; j < bChildren.length; j++) {
-        var newItem = bChildren[j]
-
-        if (newItem.key) {
-            if (!aKeys.hasOwnProperty(newItem.key)) {
-                // Add any new keyed items
-                // We are adding new items to the end and then sorting them
-                // in place. In future we should insert new items in place.
-                newChildren.push(newItem)
-            }
-        } else if (j >= lastFreeIndex) {
-            // Add any leftover non-keyed items
-            newChildren.push(newItem)
-        }
-    }
-
-    var simulate = newChildren.slice()
-    var simulateIndex = 0
-    var removes = []
-    var inserts = []
-    var simulateItem
-
-    for (var k = 0; k < bChildren.length;) {
-        var wantedItem = bChildren[k]
-        simulateItem = simulate[simulateIndex]
-
-        // remove items
-        while (simulateItem === null && simulate.length) {
-            removes.push(remove(simulate, simulateIndex, null))
-            simulateItem = simulate[simulateIndex]
-        }
-
-        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-            // if we need a key in this position...
-            if (wantedItem.key) {
-                if (simulateItem && simulateItem.key) {
-                    // if an insert doesn't put this key in place, it needs to move
-                    if (bKeys[simulateItem.key] !== k + 1) {
-                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
-                        simulateItem = simulate[simulateIndex]
-                        // if the remove didn't put the wanted item in place, we need to insert it
-                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-                            inserts.push({key: wantedItem.key, to: k})
-                        }
-                        // items are matching, so skip ahead
-                        else {
-                            simulateIndex++
-                        }
-                    }
-                    else {
-                        inserts.push({key: wantedItem.key, to: k})
-                    }
-                }
-                else {
-                    inserts.push({key: wantedItem.key, to: k})
-                }
-                k++
-            }
-            // a key in simulate has no matching wanted key, remove it
-            else if (simulateItem && simulateItem.key) {
-                removes.push(remove(simulate, simulateIndex, simulateItem.key))
-            }
-        }
-        else {
-            simulateIndex++
-            k++
-        }
-    }
-
-    // remove all the remaining nodes from simulate
-    while(simulateIndex < simulate.length) {
-        simulateItem = simulate[simulateIndex]
-        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
-    }
-
-    // If the only moves we have are deletes then we can just
-    // let the delete patch remove these items.
-    if (removes.length === deletedItems && !inserts.length) {
-        return {
-            children: newChildren,
-            moves: null
-        }
-    }
-
-    return {
-        children: newChildren,
-        moves: {
-            removes: removes,
-            inserts: inserts
-        }
-    }
-}
-
-function remove(arr, index, key) {
-    arr.splice(index, 1)
-
-    return {
-        from: index,
-        key: key
-    }
-}
-
-function keyIndex(children) {
-    var keys = {}
-    var free = []
-    var length = children.length
-
-    for (var i = 0; i < length; i++) {
-        var child = children[i]
-
-        if (child.key) {
-            keys[child.key] = i
-        } else {
-            free.push(i)
-        }
-    }
-
-    return {
-        keys: keys,     // A hash of key name to index
-        free: free      // An array of unkeyed item indices
-    }
-}
-
-function appendPatch(apply, patch) {
-    if (apply) {
-        if (isArray(apply)) {
-            apply.push(patch)
-        } else {
-            apply = [apply, patch]
-        }
-
-        return apply
-    } else {
-        return patch
-    }
-}
-
-},{"../vnode/handle-thunk":259,"../vnode/is-thunk":260,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vpatch":267,"./diff-props":269,"x-is-array":289}],271:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function (require) {
-
-       var makePromise = require('./makePromise');
-       var Scheduler = require('./Scheduler');
-       var async = require('./env').asap;
-
-       return makePromise({
-               scheduler: new Scheduler(async)
-       });
-
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
-
-},{"./Scheduler":272,"./env":284,"./makePromise":286}],272:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       // Credit to Twisol (https://github.com/Twisol) for suggesting
-       // this type of extensible queue + trampoline approach for next-tick conflation.
-
-       /**
-        * Async task scheduler
-        * @param {function} async function to schedule a single async function
-        * @constructor
-        */
-       function Scheduler(async) {
-               this._async = async;
-               this._running = false;
-
-               this._queue = this;
-               this._queueLen = 0;
-               this._afterQueue = {};
-               this._afterQueueLen = 0;
-
-               var self = this;
-               this.drain = function() {
-                       self._drain();
-               };
-       }
-
-       /**
-        * Enqueue a task
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.enqueue = function(task) {
-               this._queue[this._queueLen++] = task;
-               this.run();
-       };
-
-       /**
-        * Enqueue a task to run after the main task queue
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.afterQueue = function(task) {
-               this._afterQueue[this._afterQueueLen++] = task;
-               this.run();
-       };
-
-       Scheduler.prototype.run = function() {
-               if (!this._running) {
-                       this._running = true;
-                       this._async(this.drain);
-               }
-       };
-
-       /**
-        * Drain the handler queue entirely, and then the after queue
-        */
-       Scheduler.prototype._drain = function() {
-               var i = 0;
-               for (; i < this._queueLen; ++i) {
-                       this._queue[i].run();
-                       this._queue[i] = void 0;
-               }
-
-               this._queueLen = 0;
-               this._running = false;
-
-               for (i = 0; i < this._afterQueueLen; ++i) {
-                       this._afterQueue[i].run();
-                       this._afterQueue[i] = void 0;
-               }
-
-               this._afterQueueLen = 0;
-       };
-
-       return Scheduler;
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],273:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       /**
-        * Custom error type for promises rejected by promise.timeout
-        * @param {string} message
-        * @constructor
-        */
-       function TimeoutError (message) {
-               Error.call(this);
-               this.message = message;
-               this.name = TimeoutError.name;
-               if (typeof Error.captureStackTrace === 'function') {
-                       Error.captureStackTrace(this, TimeoutError);
-               }
-       }
-
-       TimeoutError.prototype = Object.create(Error.prototype);
-       TimeoutError.prototype.constructor = TimeoutError;
-
-       return TimeoutError;
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-},{}],274:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       makeApply.tryCatchResolve = tryCatchResolve;
-
-       return makeApply;
-
-       function makeApply(Promise, call) {
-               if(arguments.length < 2) {
-                       call = tryCatchResolve;
-               }
-
-               return apply;
-
-               function apply(f, thisArg, args) {
-                       var p = Promise._defer();
-                       var l = args.length;
-                       var params = new Array(l);
-                       callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
-
-                       return p;
-               }
-
-               function callAndResolve(c, h) {
-                       if(c.i < 0) {
-                               return call(c.f, c.thisArg, c.params, h);
-                       }
-
-                       var handler = Promise._handler(c.args[c.i]);
-                       handler.fold(callAndResolveNext, c, void 0, h);
-               }
-
-               function callAndResolveNext(c, x, h) {
-                       c.params[c.i] = x;
-                       c.i -= 1;
-                       callAndResolve(c, h);
-               }
-       }
-
-       function tryCatchResolve(f, thisArg, args, resolver) {
-               try {
-                       resolver.resolve(f.apply(thisArg, args));
-               } catch(e) {
-                       resolver.reject(e);
-               }
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-
-
-},{}],275:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var state = require('../state');
-       var applier = require('../apply');
-
-       return function array(Promise) {
-
-               var applyFold = applier(Promise);
-               var toPromise = Promise.resolve;
-               var all = Promise.all;
-
-               var ar = Array.prototype.reduce;
-               var arr = Array.prototype.reduceRight;
-               var slice = Array.prototype.slice;
-
-               // Additional array combinators
-
-               Promise.any = any;
-               Promise.some = some;
-               Promise.settle = settle;
-
-               Promise.map = map;
-               Promise.filter = filter;
-               Promise.reduce = reduce;
-               Promise.reduceRight = reduceRight;
-
-               /**
-                * When this promise fulfills with an array, do
-                * onFulfilled.apply(void 0, array)
-                * @param {function} onFulfilled function to apply
-                * @returns {Promise} promise for the result of applying onFulfilled
-                */
-               Promise.prototype.spread = function(onFulfilled) {
-                       return this.then(all).then(function(array) {
-                               return onFulfilled.apply(this, array);
-                       });
-               };
-
-               return Promise;
-
-               /**
-                * One-winner competitive race.
-                * Return a promise that will fulfill when one of the promises
-                * in the input array fulfills, or will reject when all promises
-                * have rejected.
-                * @param {array} promises
-                * @returns {Promise} promise for the first fulfilled value
-                */
-               function any(promises) {
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-                       var l = promises.length>>>0;
-
-                       var pending = l;
-                       var errors = [];
-
-                       for (var h, x, i = 0; i < l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
-
-                               h = Promise._handler(x);
-                               if(h.state() > 0) {
-                                       resolver.become(h);
-                                       Promise._visitRemaining(promises, i, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, handleFulfill, handleReject);
-                               }
-                       }
-
-                       if(pending === 0) {
-                               resolver.reject(new RangeError('any(): array must not be empty'));
-                       }
-
-                       return p;
-
-                       function handleFulfill(x) {
-                               /*jshint validthis:true*/
-                               errors = null;
-                               this.resolve(x); // this === resolver
-                       }
-
-                       function handleReject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               errors.push(e);
-                               if(--pending === 0) {
-                                       this.reject(errors);
-                               }
-                       }
-               }
-
-               /**
-                * N-winner competitive race
-                * Return a promise that will fulfill when n input promises have
-                * fulfilled, or will reject when it becomes impossible for n
-                * input promises to fulfill (ie when promises.length - n + 1
-                * have rejected)
-                * @param {array} promises
-                * @param {number} n
-                * @returns {Promise} promise for the earliest n fulfillment values
-                *
-                * @deprecated
-                */
-               function some(promises, n) {
-                       /*jshint maxcomplexity:7*/
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-
-                       var results = [];
-                       var errors = [];
-
-                       var l = promises.length>>>0;
-                       var nFulfill = 0;
-                       var nReject;
-                       var x, i; // reused in both for() loops
-
-                       // First pass: count actual array items
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-                               ++nFulfill;
-                       }
-
-                       // Compute actual goals
-                       n = Math.max(n, 0);
-                       nReject = (nFulfill - n + 1);
-                       nFulfill = Math.min(n, nFulfill);
-
-                       if(n > nFulfill) {
-                               resolver.reject(new RangeError('some(): array must contain at least '
-                               + n + ' item(s), but had ' + nFulfill));
-                       } else if(nFulfill === 0) {
-                               resolver.resolve(results);
-                       }
-
-                       // Second pass: observe each array item, make progress toward goals
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-
-                               Promise._handler(x).visit(resolver, fulfill, reject, resolver.notify);
-                       }
-
-                       return p;
-
-                       function fulfill(x) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               results.push(x);
-                               if(--nFulfill === 0) {
-                                       errors = null;
-                                       this.resolve(results);
-                               }
-                       }
-
-                       function reject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               errors.push(e);
-                               if(--nReject === 0) {
-                                       results = null;
-                                       this.reject(errors);
-                               }
-                       }
-               }
-
-               /**
-                * Apply f to the value of each promise in a list of promises
-                * and return a new list containing the results.
-                * @param {array} promises
-                * @param {function(x:*, index:Number):*} f mapping function
-                * @returns {Promise}
-                */
-               function map(promises, f) {
-                       return Promise._traverse(f, promises);
-               }
-
-               /**
-                * Filter the provided array of promises using the provided predicate.  Input may
-                * contain promises and values
-                * @param {Array} promises array of promises and values
-                * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-                *  Must return truthy (or promise for truthy) for items to retain.
-                * @returns {Promise} promise that will fulfill with an array containing all items
-                *  for which predicate returned truthy.
-                */
-               function filter(promises, predicate) {
-                       var a = slice.call(promises);
-                       return Promise._traverse(predicate, a).then(function(keep) {
-                               return filterSync(a, keep);
-                       });
-               }
-
-               function filterSync(promises, keep) {
-                       // Safe because we know all promises have fulfilled if we've made it this far
-                       var l = keep.length;
-                       var filtered = new Array(l);
-                       for(var i=0, j=0; i<l; ++i) {
-                               if(keep[i]) {
-                                       filtered[j++] = Promise._handler(promises[i]).value;
-                               }
-                       }
-                       filtered.length = j;
-                       return filtered;
-
-               }
-
-               /**
-                * Return a promise that will always fulfill with an array containing
-                * the outcome states of all input promises.  The returned promise
-                * will never reject.
-                * @param {Array} promises
-                * @returns {Promise} promise for array of settled state descriptors
-                */
-               function settle(promises) {
-                       return all(promises.map(settleOne));
-               }
-
-               function settleOne(p) {
-                       // Optimize the case where we get an already-resolved when.js promise
-                       //  by extracting its state:
-                       var handler;
-                       if (p instanceof Promise) {
-                               // This is our own Promise type and we can reach its handler internals:
-                               handler = p._handler.join();
-                       }
-                       if((handler && handler.state() === 0) || !handler) {
-                               // Either still pending, or not a Promise at all:
-                               return toPromise(p).then(state.fulfilled, state.rejected);
-                       }
-
-                       // The promise is our own, but it is already resolved. Take a shortcut.
-                       // Since we're not actually handling the resolution, we need to disable
-                       // rejection reporting.
-                       handler._unreport();
-                       return state.inspect(handler);
-               }
-
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduce()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduce(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? ar.call(promises, liftCombine(f), arguments[2])
-                                       : ar.call(promises, liftCombine(f));
-               }
-
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduceRight()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduceRight(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? arr.call(promises, liftCombine(f), arguments[2])
-                                       : arr.call(promises, liftCombine(f));
-               }
-
-               function liftCombine(f) {
-                       return function(z, x, i) {
-                               return applyFold(f, void 0, [z,x,i]);
-                       };
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../apply":274,"../state":287}],276:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function flow(Promise) {
-
-               var resolve = Promise.resolve;
-               var reject = Promise.reject;
-               var origCatch = Promise.prototype['catch'];
-
-               /**
-                * Handle the ultimate fulfillment value or rejection reason, and assume
-                * responsibility for all errors.  If an error propagates out of result
-                * or handleFatalError, it will be rethrown to the host, resulting in a
-                * loud stack track on most platforms and a crash on some.
-                * @param {function?} onResult
-                * @param {function?} onError
-                * @returns {undefined}
-                */
-               Promise.prototype.done = function(onResult, onError) {
-                       this._handler.visit(this._handler.receiver, onResult, onError);
-               };
-
-               /**
-                * Add Error-type and predicate matching to catch.  Examples:
-                * promise.catch(TypeError, handleTypeError)
-                *   .catch(predicate, handleMatchedErrors)
-                *   .catch(handleRemainingErrors)
-                * @param onRejected
-                * @returns {*}
-                */
-               Promise.prototype['catch'] = Promise.prototype.otherwise = function(onRejected) {
-                       if (arguments.length < 2) {
-                               return origCatch.call(this, onRejected);
-                       }
-
-                       if(typeof onRejected !== 'function') {
-                               return this.ensure(rejectInvalidPredicate);
-                       }
-
-                       return origCatch.call(this, createCatchFilter(arguments[1], onRejected));
-               };
-
-               /**
-                * Wraps the provided catch handler, so that it will only be called
-                * if the predicate evaluates truthy
-                * @param {?function} handler
-                * @param {function} predicate
-                * @returns {function} conditional catch handler
-                */
-               function createCatchFilter(handler, predicate) {
-                       return function(e) {
-                               return evaluatePredicate(e, predicate)
-                                       ? handler.call(this, e)
-                                       : reject(e);
-                       };
-               }
-
-               /**
-                * Ensures that onFulfilledOrRejected will be called regardless of whether
-                * this promise is fulfilled or rejected.  onFulfilledOrRejected WILL NOT
-                * receive the promises' value or reason.  Any returned value will be disregarded.
-                * onFulfilledOrRejected may throw or return a rejected promise to signal
-                * an additional error.
-                * @param {function} handler handler to be called regardless of
-                *  fulfillment or rejection
-                * @returns {Promise}
-                */
-               Promise.prototype['finally'] = Promise.prototype.ensure = function(handler) {
-                       if(typeof handler !== 'function') {
-                               return this;
-                       }
-
-                       return this.then(function(x) {
-                               return runSideEffect(handler, this, identity, x);
-                       }, function(e) {
-                               return runSideEffect(handler, this, reject, e);
-                       });
-               };
-
-               function runSideEffect (handler, thisArg, propagate, value) {
-                       var result = handler.call(thisArg);
-                       return maybeThenable(result)
-                               ? propagateValue(result, propagate, value)
-                               : propagate(value);
-               }
-
-               function propagateValue (result, propagate, x) {
-                       return resolve(result).then(function () {
-                               return propagate(x);
-                       });
-               }
-
-               /**
-                * Recover from a failure by returning a defaultValue.  If defaultValue
-                * is a promise, it's fulfillment value will be used.  If defaultValue is
-                * a promise that rejects, the returned promise will reject with the
-                * same reason.
-                * @param {*} defaultValue
-                * @returns {Promise} new promise
-                */
-               Promise.prototype['else'] = Promise.prototype.orElse = function(defaultValue) {
-                       return this.then(void 0, function() {
-                               return defaultValue;
-                       });
-               };
-
-               /**
-                * Shortcut for .then(function() { return value; })
-                * @param  {*} value
-                * @return {Promise} a promise that:
-                *  - is fulfilled if value is not a promise, or
-                *  - if value is a promise, will fulfill with its value, or reject
-                *    with its reason.
-                */
-               Promise.prototype['yield'] = function(value) {
-                       return this.then(function() {
-                               return value;
-                       });
-               };
-
-               /**
-                * Runs a side effect when this promise fulfills, without changing the
-                * fulfillment value.
-                * @param {function} onFulfilledSideEffect
-                * @returns {Promise}
-                */
-               Promise.prototype.tap = function(onFulfilledSideEffect) {
-                       return this.then(onFulfilledSideEffect)['yield'](this);
-               };
-
-               return Promise;
-       };
-
-       function rejectInvalidPredicate() {
-               throw new TypeError('catch predicate must be a function');
-       }
-
-       function evaluatePredicate(e, predicate) {
-               return isError(predicate) ? e instanceof predicate : predicate(e);
-       }
-
-       function isError(predicate) {
-               return predicate === Error
-                       || (predicate != null && predicate.prototype instanceof Error);
-       }
-
-       function maybeThenable(x) {
-               return (typeof x === 'object' || typeof x === 'function') && x !== null;
-       }
-
-       function identity(x) {
-               return x;
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],277:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-/** @author Jeff Escalante */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function fold(Promise) {
-
-               Promise.prototype.fold = function(f, z) {
-                       var promise = this._beget();
-
-                       this._handler.fold(function(z, x, to) {
-                               Promise._handler(z).fold(function(x, z, to) {
-                                       to.resolve(f.call(this, z, x));
-                               }, x, this, to);
-                       }, z, promise._handler.receiver, promise._handler);
-
-                       return promise;
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],278:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var inspect = require('../state').inspect;
-
-       return function inspection(Promise) {
-
-               Promise.prototype.inspect = function() {
-                       return inspect(Promise._handler(this));
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../state":287}],279:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function generate(Promise) {
-
-               var resolve = Promise.resolve;
-
-               Promise.iterate = iterate;
-               Promise.unfold = unfold;
-
-               return Promise;
-
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.iterate
-                * Generate a (potentially infinite) stream of promised values:
-                * x, f(x), f(f(x)), etc. until condition(x) returns true
-                * @param {function} f function to generate a new x from the previous x
-                * @param {function} condition function that, given the current x, returns
-                *  truthy when the iterate should stop
-                * @param {function} handler function to handle the value produced by f
-                * @param {*|Promise} x starting value, may be a promise
-                * @return {Promise} the result of the last call to f before
-                *  condition returns true
-                */
-               function iterate(f, condition, handler, x) {
-                       return unfold(function(x) {
-                               return [x, f(x)];
-                       }, condition, handler, x);
-               }
-
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.unfold
-                * Generate a (potentially infinite) stream of promised values
-                * by applying handler(generator(seed)) iteratively until
-                * condition(seed) returns true.
-                * @param {function} unspool function that generates a [value, newSeed]
-                *  given a seed.
-                * @param {function} condition function that, given the current seed, returns
-                *  truthy when the unfold should stop
-                * @param {function} handler function to handle the value produced by unspool
-                * @param x {*|Promise} starting value, may be a promise
-                * @return {Promise} the result of the last value produced by unspool before
-                *  condition returns true
-                */
-               function unfold(unspool, condition, handler, x) {
-                       return resolve(x).then(function(seed) {
-                               return resolve(condition(seed)).then(function(done) {
-                                       return done ? seed : resolve(unspool(seed)).spread(next);
-                               });
-                       });
-
-                       function next(item, newSeed) {
-                               return resolve(handler(item)).then(function() {
-                                       return unfold(unspool, condition, handler, newSeed);
-                               });
-                       }
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],280:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function progress(Promise) {
-
-               /**
-                * @deprecated
-                * Register a progress handler for this promise
-                * @param {function} onProgress
-                * @returns {Promise}
-                */
-               Promise.prototype.progress = function(onProgress) {
-                       return this.then(void 0, void 0, onProgress);
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],281:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var env = require('../env');
-       var TimeoutError = require('../TimeoutError');
-
-       function setTimeout(f, ms, x, y) {
-               return env.setTimer(function() {
-                       f(x, y, ms);
-               }, ms);
-       }
-
-       return function timed(Promise) {
-               /**
-                * Return a new promise whose fulfillment value is revealed only
-                * after ms milliseconds
-                * @param {number} ms milliseconds
-                * @returns {Promise}
-                */
-               Promise.prototype.delay = function(ms) {
-                       var p = this._beget();
-                       this._handler.fold(handleDelay, ms, void 0, p._handler);
-                       return p;
-               };
-
-               function handleDelay(ms, x, h) {
-                       setTimeout(resolveDelay, ms, x, h);
-               }
-
-               function resolveDelay(x, h) {
-                       h.resolve(x);
-               }
-
-               /**
-                * Return a new promise that rejects after ms milliseconds unless
-                * this promise fulfills earlier, in which case the returned promise
-                * fulfills with the same value.
-                * @param {number} ms milliseconds
-                * @param {Error|*=} reason optional rejection reason to use, defaults
-                *   to a TimeoutError if not provided
-                * @returns {Promise}
-                */
-               Promise.prototype.timeout = function(ms, reason) {
-                       var p = this._beget();
-                       var h = p._handler;
-
-                       var t = setTimeout(onTimeout, ms, reason, p._handler);
-
-                       this._handler.visit(h,
-                               function onFulfill(x) {
-                                       env.clearTimer(t);
-                                       this.resolve(x); // this = h
-                               },
-                               function onReject(x) {
-                                       env.clearTimer(t);
-                                       this.reject(x); // this = h
-                               },
-                               h.notify);
-
-                       return p;
-               };
-
-               function onTimeout(reason, h, ms) {
-                       var e = typeof reason === 'undefined'
-                               ? new TimeoutError('timed out after ' + ms + 'ms')
-                               : reason;
-                       h.reject(e);
-               }
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../TimeoutError":273,"../env":284}],282:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var setTimer = require('../env').setTimer;
-       var format = require('../format');
-
-       return function unhandledRejection(Promise) {
-
-               var logError = noop;
-               var logInfo = noop;
-               var localConsole;
-
-               if(typeof console !== 'undefined') {
-                       // Alias console to prevent things like uglify's drop_console option from
-                       // removing console.log/error. Unhandled rejections fall into the same
-                       // category as uncaught exceptions, and build tools shouldn't silence them.
-                       localConsole = console;
-                       logError = typeof localConsole.error !== 'undefined'
-                               ? function (e) { localConsole.error(e); }
-                               : function (e) { localConsole.log(e); };
-
-                       logInfo = typeof localConsole.info !== 'undefined'
-                               ? function (e) { localConsole.info(e); }
-                               : function (e) { localConsole.log(e); };
-               }
-
-               Promise.onPotentiallyUnhandledRejection = function(rejection) {
-                       enqueue(report, rejection);
-               };
-
-               Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) {
-                       enqueue(unreport, rejection);
-               };
-
-               Promise.onFatalRejection = function(rejection) {
-                       enqueue(throwit, rejection.value);
-               };
-
-               var tasks = [];
-               var reported = [];
-               var running = null;
-
-               function report(r) {
-                       if(!r.handled) {
-                               reported.push(r);
-                               logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value));
-                       }
-               }
-
-               function unreport(r) {
-                       var i = reported.indexOf(r);
-                       if(i >= 0) {
-                               reported.splice(i, 1);
-                               logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value));
-                       }
-               }
-
-               function enqueue(f, x) {
-                       tasks.push(f, x);
-                       if(running === null) {
-                               running = setTimer(flush, 0);
-                       }
-               }
-
-               function flush() {
-                       running = null;
-                       while(tasks.length > 0) {
-                               tasks.shift()(tasks.shift());
-                       }
-               }
-
-               return Promise;
-       };
-
-       function throwit(e) {
-               throw e;
-       }
-
-       function noop() {}
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../env":284,"../format":285}],283:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function addWith(Promise) {
-               /**
-                * Returns a promise whose handlers will be called with `this` set to
-                * the supplied receiver.  Subsequent promises derived from the
-                * returned promise will also have their handlers called with receiver
-                * as `this`. Calling `with` with undefined or no arguments will return
-                * a promise whose handlers will again be called in the usual Promises/A+
-                * way (no `this`) thus safely undoing any previous `with` in the
-                * promise chain.
-                *
-                * WARNING: Promises returned from `with`/`withThis` are NOT Promises/A+
-                * compliant, specifically violating 2.2.5 (http://promisesaplus.com/#point-41)
-                *
-                * @param {object} receiver `this` value for all handlers attached to
-                *  the returned promise.
-                * @returns {Promise}
-                */
-               Promise.prototype['with'] = Promise.prototype.withThis = function(receiver) {
-                       var p = this._beget();
-                       var child = p._handler;
-                       child.receiver = receiver;
-                       this._handler.chain(child, receiver);
-                       return p;
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-
-},{}],284:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
-(function(define) { 'use strict';
-define(function(require) {
-       /*jshint maxcomplexity:6*/
-
-       // Sniff "best" async scheduling option
-       // Prefer process.nextTick or MutationObserver, then check for
-       // setTimeout, and finally vertx, since its the only env that doesn't
-       // have setTimeout
-
-       var MutationObs;
-       var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
-
-       // Default env
-       var setTimer = function(f, ms) { return setTimeout(f, ms); };
-       var clearTimer = function(t) { return clearTimeout(t); };
-       var asap = function (f) { return capturedSetTimeout(f, 0); };
-
-       // Detect specific env
-       if (isNode()) { // Node
-               asap = function (f) { return process.nextTick(f); };
-
-       } else if (MutationObs = hasMutationObserver()) { // Modern browser
-               asap = initMutationObserver(MutationObs);
-
-       } else if (!capturedSetTimeout) { // vert.x
-               var vertxRequire = require;
-               var vertx = vertxRequire('vertx');
-               setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
-               clearTimer = vertx.cancelTimer;
-               asap = vertx.runOnLoop || vertx.runOnContext;
-       }
-
-       return {
-               setTimer: setTimer,
-               clearTimer: clearTimer,
-               asap: asap
-       };
-
-       function isNode () {
-               return typeof process !== 'undefined' &&
-                       Object.prototype.toString.call(process) === '[object process]';
-       }
-
-       function hasMutationObserver () {
-           return (typeof MutationObserver !== 'undefined' && MutationObserver) ||
-                       (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver);
-       }
-
-       function initMutationObserver(MutationObserver) {
-               var scheduled;
-               var node = document.createTextNode('');
-               var o = new MutationObserver(run);
-               o.observe(node, { characterData: true });
-
-               function run() {
-                       var f = scheduled;
-                       scheduled = void 0;
-                       f();
-               }
-
-               var i = 0;
-               return function (f) {
-                       scheduled = f;
-                       node.data = (i ^= 1);
-               };
-       }
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-}).call(this,require('_process'))
-
-},{"_process":7}],285:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return {
-               formatError: formatError,
-               formatObject: formatObject,
-               tryStringify: tryStringify
-       };
-
-       /**
-        * Format an error into a string.  If e is an Error and has a stack property,
-        * it's returned.  Otherwise, e is formatted using formatObject, with a
-        * warning added about e not being a proper Error.
-        * @param {*} e
-        * @returns {String} formatted string, suitable for output to developers
-        */
-       function formatError(e) {
-               var s = typeof e === 'object' && e !== null && (e.stack || e.message) ? e.stack || e.message : formatObject(e);
-               return e instanceof Error ? s : s + ' (WARNING: non-Error used)';
-       }
-
-       /**
-        * Format an object, detecting "plain" objects and running them through
-        * JSON.stringify if possible.
-        * @param {Object} o
-        * @returns {string}
-        */
-       function formatObject(o) {
-               var s = String(o);
-               if(s === '[object Object]' && typeof JSON !== 'undefined') {
-                       s = tryStringify(o, s);
-               }
-               return s;
-       }
-
-       /**
-        * Try to return the result of JSON.stringify(x).  If that fails, return
-        * defaultValue
-        * @param {*} x
-        * @param {*} defaultValue
-        * @returns {String|*} JSON.stringify(x) or defaultValue
-        */
-       function tryStringify(x, defaultValue) {
-               try {
-                       return JSON.stringify(x);
-               } catch(e) {
-                       return defaultValue;
-               }
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],286:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function makePromise(environment) {
-
-               var tasks = environment.scheduler;
-               var emitRejection = initEmitRejection();
-
-               var objectCreate = Object.create ||
-                       function(proto) {
-                               function Child() {}
-                               Child.prototype = proto;
-                               return new Child();
-                       };
-
-               /**
-                * Create a promise whose fate is determined by resolver
-                * @constructor
-                * @returns {Promise} promise
-                * @name Promise
-                */
-               function Promise(resolver, handler) {
-                       this._handler = resolver === Handler ? handler : init(resolver);
-               }
-
-               /**
-                * Run the supplied resolver
-                * @param resolver
-                * @returns {Pending}
-                */
-               function init(resolver) {
-                       var handler = new Pending();
-
-                       try {
-                               resolver(promiseResolve, promiseReject, promiseNotify);
-                       } catch (e) {
-                               promiseReject(e);
-                       }
-
-                       return handler;
-
-                       /**
-                        * Transition from pre-resolution state to post-resolution state, notifying
-                        * all listeners of the ultimate fulfillment or rejection
-                        * @param {*} x resolution value
-                        */
-                       function promiseResolve (x) {
-                               handler.resolve(x);
-                       }
-                       /**
-                        * Reject this promise with reason, which will be used verbatim
-                        * @param {Error|*} reason rejection reason, strongly suggested
-                        *   to be an Error type
-                        */
-                       function promiseReject (reason) {
-                               handler.reject(reason);
-                       }
-
-                       /**
-                        * @deprecated
-                        * Issue a progress event, notifying all progress listeners
-                        * @param {*} x progress event payload to pass to all listeners
-                        */
-                       function promiseNotify (x) {
-                               handler.notify(x);
-                       }
-               }
-
-               // Creation
-
-               Promise.resolve = resolve;
-               Promise.reject = reject;
-               Promise.never = never;
-
-               Promise._defer = defer;
-               Promise._handler = getHandler;
-
-               /**
-                * Returns a trusted promise. If x is already a trusted promise, it is
-                * returned, otherwise returns a new trusted Promise which follows x.
-                * @param  {*} x
-                * @return {Promise} promise
-                */
-               function resolve(x) {
-                       return isPromise(x) ? x
-                               : new Promise(Handler, new Async(getHandler(x)));
-               }
-
-               /**
-                * Return a reject promise with x as its reason (x is used verbatim)
-                * @param {*} x
-                * @returns {Promise} rejected promise
-                */
-               function reject(x) {
-                       return new Promise(Handler, new Async(new Rejected(x)));
-               }
-
-               /**
-                * Return a promise that remains pending forever
-                * @returns {Promise} forever-pending promise.
-                */
-               function never() {
-                       return foreverPendingPromise; // Should be frozen
-               }
-
-               /**
-                * Creates an internal {promise, resolver} pair
-                * @private
-                * @returns {Promise}
-                */
-               function defer() {
-                       return new Promise(Handler, new Pending());
-               }
-
-               // Transformation and flow control
-
-               /**
-                * Transform this promise's fulfillment value, returning a new Promise
-                * for the transformed result.  If the promise cannot be fulfilled, onRejected
-                * is called with the reason.  onProgress *may* be called with updates toward
-                * this promise's fulfillment.
-                * @param {function=} onFulfilled fulfillment handler
-                * @param {function=} onRejected rejection handler
-                * @param {function=} onProgress @deprecated progress handler
-                * @return {Promise} new promise
-                */
-               Promise.prototype.then = function(onFulfilled, onRejected, onProgress) {
-                       var parent = this._handler;
-                       var state = parent.join().state();
-
-                       if ((typeof onFulfilled !== 'function' && state > 0) ||
-                               (typeof onRejected !== 'function' && state < 0)) {
-                               // Short circuit: value will not change, simply share handler
-                               return new this.constructor(Handler, parent);
-                       }
-
-                       var p = this._beget();
-                       var child = p._handler;
-
-                       parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress);
-
-                       return p;
-               };
-
-               /**
-                * If this promise cannot be fulfilled due to an error, call onRejected to
-                * handle the error. Shortcut for .then(undefined, onRejected)
-                * @param {function?} onRejected
-                * @return {Promise}
-                */
-               Promise.prototype['catch'] = function(onRejected) {
-                       return this.then(void 0, onRejected);
-               };
-
-               /**
-                * Creates a new, pending promise of the same type as this promise
-                * @private
-                * @returns {Promise}
-                */
-               Promise.prototype._beget = function() {
-                       return begetFrom(this._handler, this.constructor);
-               };
-
-               function begetFrom(parent, Promise) {
-                       var child = new Pending(parent.receiver, parent.join().context);
-                       return new Promise(Handler, child);
-               }
-
-               // Array combinators
-
-               Promise.all = all;
-               Promise.race = race;
-               Promise._traverse = traverse;
-
-               /**
-                * Return a promise that will fulfill when all promises in the
-                * input array have fulfilled, or will reject when one of the
-                * promises rejects.
-                * @param {array} promises array of promises
-                * @returns {Promise} promise for array of fulfillment values
-                */
-               function all(promises) {
-                       return traverseWith(snd, null, promises);
-               }
-
-               /**
-                * Array<Promise<X>> -> Promise<Array<f(X)>>
-                * @private
-                * @param {function} f function to apply to each promise's value
-                * @param {Array} promises array of promises
-                * @returns {Promise} promise for transformed values
-                */
-               function traverse(f, promises) {
-                       return traverseWith(tryCatch2, f, promises);
-               }
-
-               function traverseWith(tryMap, f, promises) {
-                       var handler = typeof f === 'function' ? mapAt : settleAt;
-
-                       var resolver = new Pending();
-                       var pending = promises.length >>> 0;
-                       var results = new Array(pending);
-
-                       for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) {
-                               x = promises[i];
-
-                               if (x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
-
-                               traverseAt(promises, handler, i, x, resolver);
-                       }
-
-                       if(pending === 0) {
-                               resolver.become(new Fulfilled(results));
-                       }
-
-                       return new Promise(Handler, resolver);
-
-                       function mapAt(i, x, resolver) {
-                               if(!resolver.resolved) {
-                                       traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver);
-                               }
-                       }
-
-                       function settleAt(i, x, resolver) {
-                               results[i] = x;
-                               if(--pending === 0) {
-                                       resolver.become(new Fulfilled(results));
-                               }
-                       }
-               }
-
-               function traverseAt(promises, handler, i, x, resolver) {
-                       if (maybeThenable(x)) {
-                               var h = getHandlerMaybeThenable(x);
-                               var s = h.state();
-
-                               if (s === 0) {
-                                       h.fold(handler, i, void 0, resolver);
-                               } else if (s > 0) {
-                                       handler(i, h.value, resolver);
-                               } else {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                               }
-                       } else {
-                               handler(i, x, resolver);
-                       }
-               }
-
-               Promise._visitRemaining = visitRemaining;
-               function visitRemaining(promises, start, handler) {
-                       for(var i=start; i<promises.length; ++i) {
-                               markAsHandled(getHandler(promises[i]), handler);
-                       }
-               }
-
-               function markAsHandled(h, handler) {
-                       if(h === handler) {
-                               return;
-                       }
-
-                       var s = h.state();
-                       if(s === 0) {
-                               h.visit(h, void 0, h._unreport);
-                       } else if(s < 0) {
-                               h._unreport();
-                       }
-               }
-
-               /**
-                * Fulfill-reject competitive race. Return a promise that will settle
-                * to the same state as the earliest input promise to settle.
-                *
-                * WARNING: The ES6 Promise spec requires that race()ing an empty array
-                * must return a promise that is pending forever.  This implementation
-                * returns a singleton forever-pending promise, the same singleton that is
-                * returned by Promise.never(), thus can be checked with ===
-                *
-                * @param {array} promises array of promises to race
-                * @returns {Promise} if input is non-empty, a promise that will settle
-                * to the same outcome as the earliest input promise to settle. if empty
-                * is empty, returns a promise that will never settle.
-                */
-               function race(promises) {
-                       if(typeof promises !== 'object' || promises === null) {
-                               return reject(new TypeError('non-iterable passed to race()'));
-                       }
-
-                       // Sigh, race([]) is untestable unless we return *something*
-                       // that is recognizable without calling .then() on it.
-                       return promises.length === 0 ? never()
-                                : promises.length === 1 ? resolve(promises[0])
-                                : runRace(promises);
-               }
-
-               function runRace(promises) {
-                       var resolver = new Pending();
-                       var i, x, h;
-                       for(i=0; i<promises.length; ++i) {
-                               x = promises[i];
-                               if (x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-
-                               h = getHandler(x);
-                               if(h.state() !== 0) {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, resolver.resolve, resolver.reject);
-                               }
-                       }
-                       return new Promise(Handler, resolver);
-               }
-
-               // Promise internals
-               // Below this, everything is @private
-
-               /**
-                * Get an appropriate handler for x, without checking for cycles
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandler(x) {
-                       if(isPromise(x)) {
-                               return x._handler.join();
-                       }
-                       return maybeThenable(x) ? getHandlerUntrusted(x) : new Fulfilled(x);
-               }
-
-               /**
-                * Get a handler for thenable x.
-                * NOTE: You must only call this if maybeThenable(x) == true
-                * @param {object|function|Promise} x
-                * @returns {object} handler
-                */
-               function getHandlerMaybeThenable(x) {
-                       return isPromise(x) ? x._handler.join() : getHandlerUntrusted(x);
-               }
-
-               /**
-                * Get a handler for potentially untrusted thenable x
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandlerUntrusted(x) {
-                       try {
-                               var untrustedThen = x.then;
-                               return typeof untrustedThen === 'function'
-                                       ? new Thenable(untrustedThen, x)
-                                       : new Fulfilled(x);
-                       } catch(e) {
-                               return new Rejected(e);
-                       }
-               }
-
-               /**
-                * Handler for a promise that is pending forever
-                * @constructor
-                */
-               function Handler() {}
-
-               Handler.prototype.when
-                       = Handler.prototype.become
-                       = Handler.prototype.notify // deprecated
-                       = Handler.prototype.fail
-                       = Handler.prototype._unreport
-                       = Handler.prototype._report
-                       = noop;
-
-               Handler.prototype._state = 0;
-
-               Handler.prototype.state = function() {
-                       return this._state;
-               };
-
-               /**
-                * Recursively collapse handler chain to find the handler
-                * nearest to the fully resolved value.
-                * @returns {object} handler nearest the fully resolved value
-                */
-               Handler.prototype.join = function() {
-                       var h = this;
-                       while(h.handler !== void 0) {
-                               h = h.handler;
-                       }
-                       return h;
-               };
-
-               Handler.prototype.chain = function(to, receiver, fulfilled, rejected, progress) {
-                       this.when({
-                               resolver: to,
-                               receiver: receiver,
-                               fulfilled: fulfilled,
-                               rejected: rejected,
-                               progress: progress
-                       });
-               };
-
-               Handler.prototype.visit = function(receiver, fulfilled, rejected, progress) {
-                       this.chain(failIfRejected, receiver, fulfilled, rejected, progress);
-               };
-
-               Handler.prototype.fold = function(f, z, c, to) {
-                       this.when(new Fold(f, z, c, to));
-               };
-
-               /**
-                * Handler that invokes fail() on any handler it becomes
-                * @constructor
-                */
-               function FailIfRejected() {}
-
-               inherit(Handler, FailIfRejected);
-
-               FailIfRejected.prototype.become = function(h) {
-                       h.fail();
-               };
-
-               var failIfRejected = new FailIfRejected();
-
-               /**
-                * Handler that manages a queue of consumers waiting on a pending promise
-                * @constructor
-                */
-               function Pending(receiver, inheritedContext) {
-                       Promise.createContext(this, inheritedContext);
-
-                       this.consumers = void 0;
-                       this.receiver = receiver;
-                       this.handler = void 0;
-                       this.resolved = false;
-               }
-
-               inherit(Handler, Pending);
-
-               Pending.prototype._state = 0;
-
-               Pending.prototype.resolve = function(x) {
-                       this.become(getHandler(x));
-               };
-
-               Pending.prototype.reject = function(x) {
-                       if(this.resolved) {
-                               return;
-                       }
-
-                       this.become(new Rejected(x));
-               };
-
-               Pending.prototype.join = function() {
-                       if (!this.resolved) {
-                               return this;
-                       }
-
-                       var h = this;
-
-                       while (h.handler !== void 0) {
-                               h = h.handler;
-                               if (h === this) {
-                                       return this.handler = cycle();
-                               }
-                       }
-
-                       return h;
-               };
-
-               Pending.prototype.run = function() {
-                       var q = this.consumers;
-                       var handler = this.handler;
-                       this.handler = this.handler.join();
-                       this.consumers = void 0;
-
-                       for (var i = 0; i < q.length; ++i) {
-                               handler.when(q[i]);
-                       }
-               };
-
-               Pending.prototype.become = function(handler) {
-                       if(this.resolved) {
-                               return;
-                       }
-
-                       this.resolved = true;
-                       this.handler = handler;
-                       if(this.consumers !== void 0) {
-                               tasks.enqueue(this);
-                       }
-
-                       if(this.context !== void 0) {
-                               handler._report(this.context);
-                       }
-               };
-
-               Pending.prototype.when = function(continuation) {
-                       if(this.resolved) {
-                               tasks.enqueue(new ContinuationTask(continuation, this.handler));
-                       } else {
-                               if(this.consumers === void 0) {
-                                       this.consumers = [continuation];
-                               } else {
-                                       this.consumers.push(continuation);
-                               }
-                       }
-               };
-
-               /**
-                * @deprecated
-                */
-               Pending.prototype.notify = function(x) {
-                       if(!this.resolved) {
-                               tasks.enqueue(new ProgressTask(x, this));
-                       }
-               };
-
-               Pending.prototype.fail = function(context) {
-                       var c = typeof context === 'undefined' ? this.context : context;
-                       this.resolved && this.handler.join().fail(c);
-               };
-
-               Pending.prototype._report = function(context) {
-                       this.resolved && this.handler.join()._report(context);
-               };
-
-               Pending.prototype._unreport = function() {
-                       this.resolved && this.handler.join()._unreport();
-               };
-
-               /**
-                * Wrap another handler and force it into a future stack
-                * @param {object} handler
-                * @constructor
-                */
-               function Async(handler) {
-                       this.handler = handler;
-               }
-
-               inherit(Handler, Async);
-
-               Async.prototype.when = function(continuation) {
-                       tasks.enqueue(new ContinuationTask(continuation, this));
-               };
-
-               Async.prototype._report = function(context) {
-                       this.join()._report(context);
-               };
-
-               Async.prototype._unreport = function() {
-                       this.join()._unreport();
-               };
-
-               /**
-                * Handler that wraps an untrusted thenable and assimilates it in a future stack
-                * @param {function} then
-                * @param {{then: function}} thenable
-                * @constructor
-                */
-               function Thenable(then, thenable) {
-                       Pending.call(this);
-                       tasks.enqueue(new AssimilateTask(then, thenable, this));
-               }
-
-               inherit(Pending, Thenable);
-
-               /**
-                * Handler for a fulfilled promise
-                * @param {*} x fulfillment value
-                * @constructor
-                */
-               function Fulfilled(x) {
-                       Promise.createContext(this);
-                       this.value = x;
-               }
-
-               inherit(Handler, Fulfilled);
-
-               Fulfilled.prototype._state = 1;
-
-               Fulfilled.prototype.fold = function(f, z, c, to) {
-                       runContinuation3(f, z, this, c, to);
-               };
-
-               Fulfilled.prototype.when = function(cont) {
-                       runContinuation1(cont.fulfilled, this, cont.receiver, cont.resolver);
-               };
-
-               var errorId = 0;
-
-               /**
-                * Handler for a rejected promise
-                * @param {*} x rejection reason
-                * @constructor
-                */
-               function Rejected(x) {
-                       Promise.createContext(this);
-
-                       this.id = ++errorId;
-                       this.value = x;
-                       this.handled = false;
-                       this.reported = false;
-
-                       this._report();
-               }
-
-               inherit(Handler, Rejected);
-
-               Rejected.prototype._state = -1;
-
-               Rejected.prototype.fold = function(f, z, c, to) {
-                       to.become(this);
-               };
-
-               Rejected.prototype.when = function(cont) {
-                       if(typeof cont.rejected === 'function') {
-                               this._unreport();
-                       }
-                       runContinuation1(cont.rejected, this, cont.receiver, cont.resolver);
-               };
-
-               Rejected.prototype._report = function(context) {
-                       tasks.afterQueue(new ReportTask(this, context));
-               };
-
-               Rejected.prototype._unreport = function() {
-                       if(this.handled) {
-                               return;
-                       }
-                       this.handled = true;
-                       tasks.afterQueue(new UnreportTask(this));
-               };
-
-               Rejected.prototype.fail = function(context) {
-                       this.reported = true;
-                       emitRejection('unhandledRejection', this);
-                       Promise.onFatalRejection(this, context === void 0 ? this.context : context);
-               };
-
-               function ReportTask(rejection, context) {
-                       this.rejection = rejection;
-                       this.context = context;
-               }
-
-               ReportTask.prototype.run = function() {
-                       if(!this.rejection.handled && !this.rejection.reported) {
-                               this.rejection.reported = true;
-                               emitRejection('unhandledRejection', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejection(this.rejection, this.context);
-                       }
-               };
-
-               function UnreportTask(rejection) {
-                       this.rejection = rejection;
-               }
-
-               UnreportTask.prototype.run = function() {
-                       if(this.rejection.reported) {
-                               emitRejection('rejectionHandled', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejectionHandled(this.rejection);
-                       }
-               };
-
-               // Unhandled rejection hooks
-               // By default, everything is a noop
-
-               Promise.createContext
-                       = Promise.enterContext
-                       = Promise.exitContext
-                       = Promise.onPotentiallyUnhandledRejection
-                       = Promise.onPotentiallyUnhandledRejectionHandled
-                       = Promise.onFatalRejection
-                       = noop;
-
-               // Errors and singletons
-
-               var foreverPendingHandler = new Handler();
-               var foreverPendingPromise = new Promise(Handler, foreverPendingHandler);
-
-               function cycle() {
-                       return new Rejected(new TypeError('Promise cycle'));
-               }
-
-               // Task runners
-
-               /**
-                * Run a single consumer
-                * @constructor
-                */
-               function ContinuationTask(continuation, handler) {
-                       this.continuation = continuation;
-                       this.handler = handler;
-               }
-
-               ContinuationTask.prototype.run = function() {
-                       this.handler.join().when(this.continuation);
-               };
-
-               /**
-                * Run a queue of progress handlers
-                * @constructor
-                */
-               function ProgressTask(value, handler) {
-                       this.handler = handler;
-                       this.value = value;
-               }
-
-               ProgressTask.prototype.run = function() {
-                       var q = this.handler.consumers;
-                       if(q === void 0) {
-                               return;
-                       }
-
-                       for (var c, i = 0; i < q.length; ++i) {
-                               c = q[i];
-                               runNotify(c.progress, this.value, this.handler, c.receiver, c.resolver);
-                       }
-               };
-
-               /**
-                * Assimilate a thenable, sending it's value to resolver
-                * @param {function} then
-                * @param {object|function} thenable
-                * @param {object} resolver
-                * @constructor
-                */
-               function AssimilateTask(then, thenable, resolver) {
-                       this._then = then;
-                       this.thenable = thenable;
-                       this.resolver = resolver;
-               }
-
-               AssimilateTask.prototype.run = function() {
-                       var h = this.resolver;
-                       tryAssimilate(this._then, this.thenable, _resolve, _reject, _notify);
-
-                       function _resolve(x) { h.resolve(x); }
-                       function _reject(x)  { h.reject(x); }
-                       function _notify(x)  { h.notify(x); }
-               };
-
-               function tryAssimilate(then, thenable, resolve, reject, notify) {
-                       try {
-                               then.call(thenable, resolve, reject, notify);
-                       } catch (e) {
-                               reject(e);
-                       }
-               }
-
-               /**
-                * Fold a handler value with z
-                * @constructor
-                */
-               function Fold(f, z, c, to) {
-                       this.f = f; this.z = z; this.c = c; this.to = to;
-                       this.resolver = failIfRejected;
-                       this.receiver = this;
-               }
-
-               Fold.prototype.fulfilled = function(x) {
-                       this.f.call(this.c, this.z, x, this.to);
-               };
-
-               Fold.prototype.rejected = function(x) {
-                       this.to.reject(x);
-               };
-
-               Fold.prototype.progress = function(x) {
-                       this.to.notify(x);
-               };
-
-               // Other helpers
-
-               /**
-                * @param {*} x
-                * @returns {boolean} true iff x is a trusted Promise
-                */
-               function isPromise(x) {
-                       return x instanceof Promise;
-               }
-
-               /**
-                * Test just enough to rule out primitives, in order to take faster
-                * paths in some code
-                * @param {*} x
-                * @returns {boolean} false iff x is guaranteed *not* to be a thenable
-                */
-               function maybeThenable(x) {
-                       return (typeof x === 'object' || typeof x === 'function') && x !== null;
-               }
-
-               function runContinuation1(f, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReject(f, h.value, receiver, next);
-                       Promise.exitContext();
-               }
-
-               function runContinuation3(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReject3(f, x, h.value, receiver, next);
-                       Promise.exitContext();
-               }
-
-               /**
-                * @deprecated
-                */
-               function runNotify(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.notify(x);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReturn(f, x, receiver, next);
-                       Promise.exitContext();
-               }
-
-               function tryCatch2(f, a, b) {
-                       try {
-                               return f(a, b);
-                       } catch(e) {
-                               return reject(e);
-                       }
-               }
-
-               /**
-                * Return f.call(thisArg, x), or if it throws return a rejected promise for
-                * the thrown exception
-                */
-               function tryCatchReject(f, x, thisArg, next) {
-                       try {
-                               next.become(getHandler(f.call(thisArg, x)));
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
-
-               /**
-                * Same as above, but includes the extra argument parameter.
-                */
-               function tryCatchReject3(f, x, y, thisArg, next) {
-                       try {
-                               f.call(thisArg, x, y, next);
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
-
-               /**
-                * @deprecated
-                * Return f.call(thisArg, x), or if it throws, *return* the exception
-                */
-               function tryCatchReturn(f, x, thisArg, next) {
-                       try {
-                               next.notify(f.call(thisArg, x));
-                       } catch(e) {
-                               next.notify(e);
-                       }
-               }
-
-               function inherit(Parent, Child) {
-                       Child.prototype = objectCreate(Parent.prototype);
-                       Child.prototype.constructor = Child;
-               }
-
-               function snd(x, y) {
-                       return y;
-               }
-
-               function noop() {}
-
-               function hasCustomEvent() {
-                       if(typeof CustomEvent === 'function') {
-                               try {
-                                       var ev = new CustomEvent('unhandledRejection');
-                                       return ev instanceof CustomEvent;
-                               } catch (ignoredException) {}
-                       }
-                       return false;
-               }
-
-               function hasInternetExplorerCustomEvent() {
-                       if(typeof document !== 'undefined' && typeof document.createEvent === 'function') {
-                               try {
-                                       // Try to create one event to make sure it's supported
-                                       var ev = document.createEvent('CustomEvent');
-                                       ev.initCustomEvent('eventType', false, true, {});
-                                       return true;
-                               } catch (ignoredException) {}
-                       }
-                       return false;
-               }
-
-               function initEmitRejection() {
-                       /*global process, self, CustomEvent*/
-                       if(typeof process !== 'undefined' && process !== null
-                               && typeof process.emit === 'function') {
-                               // Returning falsy here means to call the default
-                               // onPotentiallyUnhandledRejection API.  This is safe even in
-                               // browserify since process.emit always returns falsy in browserify:
-                               // https://github.com/defunctzombie/node-process/blob/master/browser.js#L40-L46
-                               return function(type, rejection) {
-                                       return type === 'unhandledRejection'
-                                               ? process.emit(type, rejection.value, rejection)
-                                               : process.emit(type, rejection);
-                               };
-                       } else if(typeof self !== 'undefined' && hasCustomEvent()) {
-                               return (function (self, CustomEvent) {
-                                       return function (type, rejection) {
-                                               var ev = new CustomEvent(type, {
-                                                       detail: {
-                                                               reason: rejection.value,
-                                                               key: rejection
-                                                       },
-                                                       bubbles: false,
-                                                       cancelable: true
-                                               });
-
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(self, CustomEvent));
-                       } else if(typeof self !== 'undefined' && hasInternetExplorerCustomEvent()) {
-                               return (function(self, document) {
-                                       return function(type, rejection) {
-                                               var ev = document.createEvent('CustomEvent');
-                                               ev.initCustomEvent(type, false, true, {
-                                                       reason: rejection.value,
-                                                       key: rejection
-                                               });
-
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(self, document));
-                       }
-
-                       return noop;
-               }
-
-               return Promise;
-       };
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-}).call(this,require('_process'))
-
-},{"_process":7}],287:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return {
-               pending: toPendingState,
-               fulfilled: toFulfilledState,
-               rejected: toRejectedState,
-               inspect: inspect
-       };
-
-       function toPendingState() {
-               return { state: 'pending' };
-       }
-
-       function toRejectedState(e) {
-               return { state: 'rejected', reason: e };
-       }
-
-       function toFulfilledState(x) {
-               return { state: 'fulfilled', value: x };
-       }
-
-       function inspect(handler) {
-               var state = handler.state();
-               return state === 0 ? toPendingState()
-                        : state > 0   ? toFulfilledState(handler.value)
-                                      : toRejectedState(handler.value);
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],288:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-
-/**
- * Promises/A+ and when() implementation
- * when is part of the cujoJS family of libraries (http://cujojs.com/)
- * @author Brian Cavalier
- * @author John Hann
- */
-(function(define) { 'use strict';
-define(function (require) {
-
-       var timed = require('./lib/decorators/timed');
-       var array = require('./lib/decorators/array');
-       var flow = require('./lib/decorators/flow');
-       var fold = require('./lib/decorators/fold');
-       var inspect = require('./lib/decorators/inspect');
-       var generate = require('./lib/decorators/iterate');
-       var progress = require('./lib/decorators/progress');
-       var withThis = require('./lib/decorators/with');
-       var unhandledRejection = require('./lib/decorators/unhandledRejection');
-       var TimeoutError = require('./lib/TimeoutError');
-
-       var Promise = [array, flow, fold, generate, progress,
-               inspect, withThis, timed, unhandledRejection]
-               .reduce(function(Promise, feature) {
-                       return feature(Promise);
-               }, require('./lib/Promise'));
-
-       var apply = require('./lib/apply')(Promise);
-
-       // Public API
-
-       when.promise     = promise;              // Create a pending promise
-       when.resolve     = Promise.resolve;      // Create a resolved promise
-       when.reject      = Promise.reject;       // Create a rejected promise
-
-       when.lift        = lift;                 // lift a function to return promises
-       when['try']      = attempt;              // call a function and return a promise
-       when.attempt     = attempt;              // alias for when.try
-
-       when.iterate     = Promise.iterate;      // DEPRECATED (use cujojs/most streams) Generate a stream of promises
-       when.unfold      = Promise.unfold;       // DEPRECATED (use cujojs/most streams) Generate a stream of promises
-
-       when.join        = join;                 // Join 2 or more promises
-
-       when.all         = all;                  // Resolve a list of promises
-       when.settle      = settle;               // Settle a list of promises
-
-       when.any         = lift(Promise.any);    // One-winner race
-       when.some        = lift(Promise.some);   // Multi-winner race
-       when.race        = lift(Promise.race);   // First-to-settle race
-
-       when.map         = map;                  // Array.map() for promises
-       when.filter      = filter;               // Array.filter() for promises
-       when.reduce      = lift(Promise.reduce);       // Array.reduce() for promises
-       when.reduceRight = lift(Promise.reduceRight);  // Array.reduceRight() for promises
-
-       when.isPromiseLike = isPromiseLike;      // Is something promise-like, aka thenable
-
-       when.Promise     = Promise;              // Promise constructor
-       when.defer       = defer;                // Create a {promise, resolve, reject} tuple
-
-       // Error types
-
-       when.TimeoutError = TimeoutError;
-
-       /**
-        * Get a trusted promise for x, or by transforming x with onFulfilled
-        *
-        * @param {*} x
-        * @param {function?} onFulfilled callback to be called when x is
-        *   successfully fulfilled.  If promiseOrValue is an immediate value, callback
-        *   will be invoked immediately.
-        * @param {function?} onRejected callback to be called when x is
-        *   rejected.
-        * @param {function?} onProgress callback to be called when progress updates
-        *   are issued for x. @deprecated
-        * @returns {Promise} a new promise that will fulfill with the return
-        *   value of callback or errback or the completion value of promiseOrValue if
-        *   callback and/or errback is not supplied.
-        */
-       function when(x, onFulfilled, onRejected, onProgress) {
-               var p = Promise.resolve(x);
-               if (arguments.length < 2) {
-                       return p;
-               }
-
-               return p.then(onFulfilled, onRejected, onProgress);
-       }
-
-       /**
-        * Creates a new promise whose fate is determined by resolver.
-        * @param {function} resolver function(resolve, reject, notify)
-        * @returns {Promise} promise whose fate is determine by resolver
-        */
-       function promise(resolver) {
-               return new Promise(resolver);
-       }
-
-       /**
-        * Lift the supplied function, creating a version of f that returns
-        * promises, and accepts promises as arguments.
-        * @param {function} f
-        * @returns {Function} version of f that returns promises
-        */
-       function lift(f) {
-               return function() {
-                       for(var i=0, l=arguments.length, a=new Array(l); i<l; ++i) {
-                               a[i] = arguments[i];
-                       }
-                       return apply(f, this, a);
-               };
-       }
-
-       /**
-        * Call f in a future turn, with the supplied args, and return a promise
-        * for the result.
-        * @param {function} f
-        * @returns {Promise}
-        */
-       function attempt(f /*, args... */) {
-               /*jshint validthis:true */
-               for(var i=0, l=arguments.length-1, a=new Array(l); i<l; ++i) {
-                       a[i] = arguments[i+1];
-               }
-               return apply(f, this, a);
-       }
-
-       /**
-        * Creates a {promise, resolver} pair, either or both of which
-        * may be given out safely to consumers.
-        * @return {{promise: Promise, resolve: function, reject: function, notify: function}}
-        */
-       function defer() {
-               return new Deferred();
-       }
-
-       function Deferred() {
-               var p = Promise._defer();
-
-               function resolve(x) { p._handler.resolve(x); }
-               function reject(x) { p._handler.reject(x); }
-               function notify(x) { p._handler.notify(x); }
-
-               this.promise = p;
-               this.resolve = resolve;
-               this.reject = reject;
-               this.notify = notify;
-               this.resolver = { resolve: resolve, reject: reject, notify: notify };
-       }
-
-       /**
-        * Determines if x is promise-like, i.e. a thenable object
-        * NOTE: Will return true for *any thenable object*, and isn't truly
-        * safe, since it may attempt to access the `then` property of x (i.e.
-        *  clever/malicious getters may do weird things)
-        * @param {*} x anything
-        * @returns {boolean} true if x is promise-like
-        */
-       function isPromiseLike(x) {
-               return x && typeof x.then === 'function';
-       }
-
-       /**
-        * Return a promise that will resolve only once all the supplied arguments
-        * have resolved. The resolution value of the returned promise will be an array
-        * containing the resolution values of each of the arguments.
-        * @param {...*} arguments may be a mix of promises and values
-        * @returns {Promise}
-        */
-       function join(/* ...promises */) {
-               return Promise.all(arguments);
-       }
-
-       /**
-        * Return a promise that will fulfill once all input promises have
-        * fulfilled, or reject when any one input promise rejects.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise}
-        */
-       function all(promises) {
-               return when(promises, Promise.all);
-       }
-
-       /**
-        * Return a promise that will always fulfill with an array containing
-        * the outcome states of all input promises.  The returned promise
-        * will only reject if `promises` itself is a rejected promise.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise} promise for array of settled state descriptors
-        */
-       function settle(promises) {
-               return when(promises, Promise.settle);
-       }
-
-       /**
-        * Promise-aware array map function, similar to `Array.prototype.map()`,
-        * but input array may contain promises or values.
-        * @param {Array|Promise} promises array of anything, may contain promises and values
-        * @param {function(x:*, index:Number):*} mapFunc map function which may
-        *  return a promise or value
-        * @returns {Promise} promise that will fulfill with an array of mapped values
-        *  or reject if any input promise rejects.
-        */
-       function map(promises, mapFunc) {
-               return when(promises, function(promises) {
-                       return Promise.map(promises, mapFunc);
-               });
-       }
-
-       /**
-        * Filter the provided array of promises using the provided predicate.  Input may
-        * contain promises and values
-        * @param {Array|Promise} promises array of promises and values
-        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-        *  Must return truthy (or promise for truthy) for items to retain.
-        * @returns {Promise} promise that will fulfill with an array containing all items
-        *  for which predicate returned truthy.
-        */
-       function filter(promises, predicate) {
-               return when(promises, function(promises) {
-                       return Promise.filter(promises, predicate);
-               });
-       }
-
-       return when;
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
-
-},{"./lib/Promise":271,"./lib/TimeoutError":273,"./lib/apply":274,"./lib/decorators/array":275,"./lib/decorators/flow":276,"./lib/decorators/fold":277,"./lib/decorators/inspect":278,"./lib/decorators/iterate":279,"./lib/decorators/progress":280,"./lib/decorators/timed":281,"./lib/decorators/unhandledRejection":282,"./lib/decorators/with":283}],289:[function(require,module,exports){
-var nativeIsArray = Array.isArray
-var toString = Object.prototype.toString
-
-module.exports = nativeIsArray || isArray
-
-function isArray(obj) {
-    return toString.call(obj) === "[object Array]"
-}
-
-},{}],290:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var APIv3_1 = require("./api/APIv3");
-Object.defineProperty(exports, "APIv3", { enumerable: true, get: function () { return APIv3_1.APIv3; } });
-var ModelCreator_1 = require("./api/ModelCreator");
-Object.defineProperty(exports, "ModelCreator", { enumerable: true, get: function () { return ModelCreator_1.ModelCreator; } });
-__exportStar(require("./api/interfaces/interfaces"), exports);
-
-},{"./api/APIv3":303,"./api/ModelCreator":304,"./api/interfaces/interfaces":305}],291:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageBoundary = void 0;
-var Component_1 = require("./component/Component");
-Object.defineProperty(exports, "Component", { enumerable: true, get: function () { return Component_1.Component; } });
-var ComponentService_1 = require("./component/ComponentService");
-Object.defineProperty(exports, "ComponentService", { enumerable: true, get: function () { return ComponentService_1.ComponentService; } });
-var HandlerBase_1 = require("./component/utils/HandlerBase");
-Object.defineProperty(exports, "HandlerBase", { enumerable: true, get: function () { return HandlerBase_1.HandlerBase; } });
-var MeshFactory_1 = require("./component/utils/MeshFactory");
-Object.defineProperty(exports, "MeshFactory", { enumerable: true, get: function () { return MeshFactory_1.MeshFactory; } });
-var MeshScene_1 = require("./component/utils/MeshScene");
-Object.defineProperty(exports, "MeshScene", { enumerable: true, get: function () { return MeshScene_1.MeshScene; } });
-var MouseOperator_1 = require("./component/utils/MouseOperator");
-Object.defineProperty(exports, "MouseOperator", { enumerable: true, get: function () { return MouseOperator_1.MouseOperator; } });
-var ComponentSize_1 = require("./component/utils/ComponentSize");
-Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return ComponentSize_1.ComponentSize; } });
-var AttributionComponent_1 = require("./component/AttributionComponent");
-Object.defineProperty(exports, "AttributionComponent", { enumerable: true, get: function () { return AttributionComponent_1.AttributionComponent; } });
-var BackgroundComponent_1 = require("./component/BackgroundComponent");
-Object.defineProperty(exports, "BackgroundComponent", { enumerable: true, get: function () { return BackgroundComponent_1.BackgroundComponent; } });
-var BearingComponent_1 = require("./component/BearingComponent");
-Object.defineProperty(exports, "BearingComponent", { enumerable: true, get: function () { return BearingComponent_1.BearingComponent; } });
-var CacheComponent_1 = require("./component/CacheComponent");
-Object.defineProperty(exports, "CacheComponent", { enumerable: true, get: function () { return CacheComponent_1.CacheComponent; } });
-var CoverComponent_1 = require("./component/CoverComponent");
-Object.defineProperty(exports, "CoverComponent", { enumerable: true, get: function () { return CoverComponent_1.CoverComponent; } });
-var DebugComponent_1 = require("./component/DebugComponent");
-Object.defineProperty(exports, "DebugComponent", { enumerable: true, get: function () { return DebugComponent_1.DebugComponent; } });
-var DirectionComponent_1 = require("./component/direction/DirectionComponent");
-Object.defineProperty(exports, "DirectionComponent", { enumerable: true, get: function () { return DirectionComponent_1.DirectionComponent; } });
-var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
-Object.defineProperty(exports, "DirectionDOMCalculator", { enumerable: true, get: function () { return DirectionDOMCalculator_1.DirectionDOMCalculator; } });
-var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
-Object.defineProperty(exports, "DirectionDOMRenderer", { enumerable: true, get: function () { return DirectionDOMRenderer_1.DirectionDOMRenderer; } });
-var ImageComponent_1 = require("./component/ImageComponent");
-Object.defineProperty(exports, "ImageComponent", { enumerable: true, get: function () { return ImageComponent_1.ImageComponent; } });
-var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent");
-Object.defineProperty(exports, "KeyboardComponent", { enumerable: true, get: function () { return KeyboardComponent_1.KeyboardComponent; } });
-var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler");
-Object.defineProperty(exports, "KeyPlayHandler", { enumerable: true, get: function () { return KeyPlayHandler_1.KeyPlayHandler; } });
-var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler");
-Object.defineProperty(exports, "KeyZoomHandler", { enumerable: true, get: function () { return KeyZoomHandler_1.KeyZoomHandler; } });
-var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler");
-Object.defineProperty(exports, "KeySequenceNavigationHandler", { enumerable: true, get: function () { return KeySequenceNavigationHandler_1.KeySequenceNavigationHandler; } });
-var KeySpatialNavigationHandler_1 = require("./component/keyboard/KeySpatialNavigationHandler");
-Object.defineProperty(exports, "KeySpatialNavigationHandler", { enumerable: true, get: function () { return KeySpatialNavigationHandler_1.KeySpatialNavigationHandler; } });
-var LoadingComponent_1 = require("./component/LoadingComponent");
-Object.defineProperty(exports, "LoadingComponent", { enumerable: true, get: function () { return LoadingComponent_1.LoadingComponent; } });
-var Marker_1 = require("./component/marker/marker/Marker");
-Object.defineProperty(exports, "Marker", { enumerable: true, get: function () { return Marker_1.Marker; } });
-var MarkerComponent_1 = require("./component/marker/MarkerComponent");
-Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
-var MarkerScene_1 = require("./component/marker/MarkerScene");
-Object.defineProperty(exports, "MarkerScene", { enumerable: true, get: function () { return MarkerScene_1.MarkerScene; } });
-var MarkerSet_1 = require("./component/marker/MarkerSet");
-Object.defineProperty(exports, "MarkerSet", { enumerable: true, get: function () { return MarkerSet_1.MarkerSet; } });
-var MouseComponent_1 = require("./component/mouse/MouseComponent");
-Object.defineProperty(exports, "MouseComponent", { enumerable: true, get: function () { return MouseComponent_1.MouseComponent; } });
-__exportStar(require("./component/mouse/HandlerTypes"), exports);
-var BounceHandler_1 = require("./component/mouse/BounceHandler");
-Object.defineProperty(exports, "BounceHandler", { enumerable: true, get: function () { return BounceHandler_1.BounceHandler; } });
-var DragPanHandler_1 = require("./component/mouse/DragPanHandler");
-Object.defineProperty(exports, "DragPanHandler", { enumerable: true, get: function () { return DragPanHandler_1.DragPanHandler; } });
-var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler");
-Object.defineProperty(exports, "DoubleClickZoomHandler", { enumerable: true, get: function () { return DoubleClickZoomHandler_1.DoubleClickZoomHandler; } });
-var EarthControlHandler_1 = require("./component/mouse/EarthControlHandler");
-Object.defineProperty(exports, "EarthControlHandler", { enumerable: true, get: function () { return EarthControlHandler_1.EarthControlHandler; } });
-var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler");
-Object.defineProperty(exports, "ScrollZoomHandler", { enumerable: true, get: function () { return ScrollZoomHandler_1.ScrollZoomHandler; } });
-var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler");
-Object.defineProperty(exports, "TouchZoomHandler", { enumerable: true, get: function () { return TouchZoomHandler_1.TouchZoomHandler; } });
-var ImageBoundary = require("./component/mouse/ImageBoundary");
-exports.ImageBoundary = ImageBoundary;
-var Popup_1 = require("./component/popup/popup/Popup");
-Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
-var PopupComponent_1 = require("./component/popup/PopupComponent");
-Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
-var NavigationComponent_1 = require("./component/NavigationComponent");
-Object.defineProperty(exports, "NavigationComponent", { enumerable: true, get: function () { return NavigationComponent_1.NavigationComponent; } });
-var RouteComponent_1 = require("./component/RouteComponent");
-Object.defineProperty(exports, "RouteComponent", { enumerable: true, get: function () { return RouteComponent_1.RouteComponent; } });
-var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
-Object.defineProperty(exports, "SequenceComponent", { enumerable: true, get: function () { return SequenceComponent_1.SequenceComponent; } });
-var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
-Object.defineProperty(exports, "SequenceDOMRenderer", { enumerable: true, get: function () { return SequenceDOMRenderer_1.SequenceDOMRenderer; } });
-var SequenceMode_1 = require("./component/sequence/SequenceMode");
-Object.defineProperty(exports, "SequenceMode", { enumerable: true, get: function () { return SequenceMode_1.SequenceMode; } });
-var SpatialDataCache_1 = require("./component/spatialdata/SpatialDataCache");
-Object.defineProperty(exports, "SpatialDataCache", { enumerable: true, get: function () { return SpatialDataCache_1.SpatialDataCache; } });
-var SpatialDataComponent_1 = require("./component/spatialdata/SpatialDataComponent");
-Object.defineProperty(exports, "SpatialDataComponent", { enumerable: true, get: function () { return SpatialDataComponent_1.SpatialDataComponent; } });
-var SpatialDataScene_1 = require("./component/spatialdata/SpatialDataScene");
-Object.defineProperty(exports, "SpatialDataScene", { enumerable: true, get: function () { return SpatialDataScene_1.SpatialDataScene; } });
-var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
-Object.defineProperty(exports, "ImagePlaneComponent", { enumerable: true, get: function () { return ImagePlaneComponent_1.ImagePlaneComponent; } });
-var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
-Object.defineProperty(exports, "ImagePlaneGLRenderer", { enumerable: true, get: function () { return ImagePlaneGLRenderer_1.ImagePlaneGLRenderer; } });
-var Shaders_1 = require("./component/shaders/Shaders");
-Object.defineProperty(exports, "Shaders", { enumerable: true, get: function () { return Shaders_1.Shaders; } });
-var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker");
-Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
-var CircleMarker_1 = require("./component/marker/marker/CircleMarker");
-Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
-var SliderComponent_1 = require("./component/slider/SliderComponent");
-Object.defineProperty(exports, "SliderComponent", { enumerable: true, get: function () { return SliderComponent_1.SliderComponent; } });
-var SliderDOMRenderer_1 = require("./component/slider/SliderDOMRenderer");
-Object.defineProperty(exports, "SliderDOMRenderer", { enumerable: true, get: function () { return SliderDOMRenderer_1.SliderDOMRenderer; } });
-var SliderGLRenderer_1 = require("./component/slider/SliderGLRenderer");
-Object.defineProperty(exports, "SliderGLRenderer", { enumerable: true, get: function () { return SliderGLRenderer_1.SliderGLRenderer; } });
-var StatsComponent_1 = require("./component/StatsComponent");
-Object.defineProperty(exports, "StatsComponent", { enumerable: true, get: function () { return StatsComponent_1.StatsComponent; } });
-var TagHandlerBase_1 = require("./component/tag/handlers/TagHandlerBase");
-Object.defineProperty(exports, "TagHandlerBase", { enumerable: true, get: function () { return TagHandlerBase_1.TagHandlerBase; } });
-var CreateHandlerBase_1 = require("./component/tag/handlers/CreateHandlerBase");
-Object.defineProperty(exports, "CreateHandlerBase", { enumerable: true, get: function () { return CreateHandlerBase_1.CreateHandlerBase; } });
-var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler");
-Object.defineProperty(exports, "CreatePointHandler", { enumerable: true, get: function () { return CreatePointHandler_1.CreatePointHandler; } });
-var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler");
-Object.defineProperty(exports, "CreateVertexHandler", { enumerable: true, get: function () { return CreateVertexHandler_1.CreateVertexHandler; } });
-var CreatePointsHandler_1 = require("./component/tag/handlers/CreatePointsHandler");
-Object.defineProperty(exports, "CreatePointsHandler", { enumerable: true, get: function () { return CreatePointsHandler_1.CreatePointsHandler; } });
-var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler");
-Object.defineProperty(exports, "CreatePolygonHandler", { enumerable: true, get: function () { return CreatePolygonHandler_1.CreatePolygonHandler; } });
-var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler");
-Object.defineProperty(exports, "CreateRectHandler", { enumerable: true, get: function () { return CreateRectHandler_1.CreateRectHandler; } });
-var CreateRectDragHandler_1 = require("./component/tag/handlers/CreateRectDragHandler");
-Object.defineProperty(exports, "CreateRectDragHandler", { enumerable: true, get: function () { return CreateRectDragHandler_1.CreateRectDragHandler; } });
-var EditVertexHandler_1 = require("./component/tag/handlers/EditVertexHandler");
-Object.defineProperty(exports, "EditVertexHandler", { enumerable: true, get: function () { return EditVertexHandler_1.EditVertexHandler; } });
-var Tag_1 = require("./component/tag/tag/Tag");
-Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return Tag_1.Tag; } });
-var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
-Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
-var ExtremePointTag_1 = require("./component/tag/tag/ExtremePointTag");
-Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
-var RenderTag_1 = require("./component/tag/tag/RenderTag");
-Object.defineProperty(exports, "RenderTag", { enumerable: true, get: function () { return RenderTag_1.RenderTag; } });
-var OutlineRenderTagBase_1 = require("./component/tag/tag/OutlineRenderTagBase");
-Object.defineProperty(exports, "OutlineRenderTagBase", { enumerable: true, get: function () { return OutlineRenderTagBase_1.OutlineRenderTagBase; } });
-var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
-Object.defineProperty(exports, "OutlineRenderTag", { enumerable: true, get: function () { return OutlineRenderTag_1.OutlineRenderTag; } });
-var ExtremePointRenderTag_1 = require("./component/tag/tag/ExtremePointRenderTag");
-Object.defineProperty(exports, "ExtremePointRenderTag", { enumerable: true, get: function () { return ExtremePointRenderTag_1.ExtremePointRenderTag; } });
-var SpotTag_1 = require("./component/tag/tag/SpotTag");
-Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
-var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
-Object.defineProperty(exports, "SpotRenderTag", { enumerable: true, get: function () { return SpotRenderTag_1.SpotRenderTag; } });
-var TagDomain_1 = require("./component/tag/tag/TagDomain");
-Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
-var TagComponent_1 = require("./component/tag/TagComponent");
-Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
-var TagCreator_1 = require("./component/tag/TagCreator");
-Object.defineProperty(exports, "TagCreator", { enumerable: true, get: function () { return TagCreator_1.TagCreator; } });
-var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
-Object.defineProperty(exports, "TagDOMRenderer", { enumerable: true, get: function () { return TagDOMRenderer_1.TagDOMRenderer; } });
-var TagMode_1 = require("./component/tag/TagMode");
-Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
-var TagOperation_1 = require("./component/tag/TagOperation");
-Object.defineProperty(exports, "TagOperation", { enumerable: true, get: function () { return TagOperation_1.TagOperation; } });
-var TagScene_1 = require("./component/tag/TagScene");
-Object.defineProperty(exports, "TagScene", { enumerable: true, get: function () { return TagScene_1.TagScene; } });
-var TagSet_1 = require("./component/tag/TagSet");
-Object.defineProperty(exports, "TagSet", { enumerable: true, get: function () { return TagSet_1.TagSet; } });
-var Geometry_1 = require("./component/tag/geometry/Geometry");
-Object.defineProperty(exports, "Geometry", { enumerable: true, get: function () { return Geometry_1.Geometry; } });
-var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
-Object.defineProperty(exports, "VertexGeometry", { enumerable: true, get: function () { return VertexGeometry_1.VertexGeometry; } });
-var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
-Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
-var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
-Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
-var PointsGeometry_1 = require("./component/tag/geometry/PointsGeometry");
-Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
-var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
-Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
-var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
-Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
-var ZoomComponent_1 = require("./component/zoom/ZoomComponent");
-Object.defineProperty(exports, "ZoomComponent", { enumerable: true, get: function () { return ZoomComponent_1.ZoomComponent; } });
-var CreateTag_1 = require("./component/tag/tag/CreateTag");
-Object.defineProperty(exports, "CreateTag", { enumerable: true, get: function () { return CreateTag_1.CreateTag; } });
-var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
-Object.defineProperty(exports, "OutlineCreateTag", { enumerable: true, get: function () { return OutlineCreateTag_1.OutlineCreateTag; } });
-var ExtremePointCreateTag_1 = require("./component/tag/tag/ExtremePointCreateTag");
-Object.defineProperty(exports, "ExtremePointCreateTag", { enumerable: true, get: function () { return ExtremePointCreateTag_1.ExtremePointCreateTag; } });
-__exportStar(require("./component/interfaces/interfaces"), exports);
-
-},{"./component/AttributionComponent":306,"./component/BackgroundComponent":307,"./component/BearingComponent":308,"./component/CacheComponent":309,"./component/Component":310,"./component/ComponentService":311,"./component/CoverComponent":312,"./component/DebugComponent":313,"./component/ImageComponent":314,"./component/LoadingComponent":315,"./component/NavigationComponent":316,"./component/RouteComponent":317,"./component/StatsComponent":318,"./component/direction/DirectionComponent":319,"./component/direction/DirectionDOMCalculator":320,"./component/direction/DirectionDOMRenderer":321,"./component/imageplane/ImagePlaneComponent":322,"./component/imageplane/ImagePlaneGLRenderer":323,"./component/interfaces/interfaces":327,"./component/keyboard/KeyPlayHandler":328,"./component/keyboard/KeySequenceNavigationHandler":329,"./component/keyboard/KeySpatialNavigationHandler":330,"./component/keyboard/KeyZoomHandler":331,"./component/keyboard/KeyboardComponent":332,"./component/marker/MarkerComponent":334,"./component/marker/MarkerScene":335,"./component/marker/MarkerSet":336,"./component/marker/marker/CircleMarker":338,"./component/marker/marker/Marker":339,"./component/marker/marker/SimpleMarker":340,"./component/mouse/BounceHandler":341,"./component/mouse/DoubleClickZoomHandler":342,"./component/mouse/DragPanHandler":343,"./component/mouse/EarthControlHandler":344,"./component/mouse/HandlerTypes":345,"./component/mouse/ImageBoundary":346,"./component/mouse/MouseComponent":347,"./component/mouse/ScrollZoomHandler":348,"./component/mouse/TouchZoomHandler":349,"./component/popup/PopupComponent":351,"./component/popup/popup/Popup":352,"./component/sequence/SequenceComponent":353,"./component/sequence/SequenceDOMRenderer":354,"./component/sequence/SequenceMode":355,"./component/shaders/Shaders":356,"./component/slider/SliderComponent":357,"./component/slider/SliderDOMRenderer":358,"./component/slider/SliderGLRenderer":359,"./component/spatialdata/SpatialDataCache":362,"./component/spatialdata/SpatialDataComponent":363,"./component/spatialdata/SpatialDataScene":364,"./component/tag/TagComponent":367,"./component/tag/TagCreator":368,"./component/tag/TagDOMRenderer":369,"./component/tag/TagMode":370,"./component/tag/TagOperation":371,"./component/tag/TagScene":372,"./component/tag/TagSet":373,"./component/tag/error/GeometryTagError":374,"./component/tag/geometry/Geometry":375,"./component/tag/geometry/PointGeometry":376,"./component/tag/geometry/PointsGeometry":377,"./component/tag/geometry/PolygonGeometry":378,"./component/tag/geometry/RectGeometry":379,"./component/tag/geometry/VertexGeometry":380,"./component/tag/handlers/CreateHandlerBase":381,"./component/tag/handlers/CreatePointHandler":382,"./component/tag/handlers/CreatePointsHandler":383,"./component/tag/handlers/CreatePolygonHandler":384,"./component/tag/handlers/CreateRectDragHandler":385,"./component/tag/handlers/CreateRectHandler":386,"./component/tag/handlers/CreateVertexHandler":387,"./component/tag/handlers/EditVertexHandler":388,"./component/tag/handlers/TagHandlerBase":389,"./component/tag/tag/CreateTag":391,"./component/tag/tag/ExtremePointCreateTag":392,"./component/tag/tag/ExtremePointRenderTag":393,"./component/tag/tag/ExtremePointTag":394,"./component/tag/tag/OutlineCreateTag":395,"./component/tag/tag/OutlineRenderTag":396,"./component/tag/tag/OutlineRenderTagBase":397,"./component/tag/tag/OutlineTag":398,"./component/tag/tag/RenderTag":399,"./component/tag/tag/SpotRenderTag":400,"./component/tag/tag/SpotTag":401,"./component/tag/tag/Tag":402,"./component/tag/tag/TagDomain":403,"./component/utils/ComponentSize":404,"./component/utils/HandlerBase":405,"./component/utils/MeshFactory":406,"./component/utils/MeshScene":407,"./component/utils/MouseOperator":408,"./component/zoom/ZoomComponent":409}],292:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
-Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return EdgeDirection_1.EdgeDirection; } });
-var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
-Object.defineProperty(exports, "EdgeCalculatorSettings", { enumerable: true, get: function () { return EdgeCalculatorSettings_1.EdgeCalculatorSettings; } });
-var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
-Object.defineProperty(exports, "EdgeCalculatorDirections", { enumerable: true, get: function () { return EdgeCalculatorDirections_1.EdgeCalculatorDirections; } });
-var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
-Object.defineProperty(exports, "EdgeCalculatorCoefficients", { enumerable: true, get: function () { return EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients; } });
-var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
-Object.defineProperty(exports, "EdgeCalculator", { enumerable: true, get: function () { return EdgeCalculator_1.EdgeCalculator; } });
-__exportStar(require("./graph/edge/interfaces/interfaces"), exports);
-
-},{"./graph/edge/EdgeCalculator":433,"./graph/edge/EdgeCalculatorCoefficients":434,"./graph/edge/EdgeCalculatorDirections":435,"./graph/edge/EdgeCalculatorSettings":436,"./graph/edge/EdgeDirection":437,"./graph/edge/interfaces/interfaces":438}],293:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AbortMapillaryError_1 = require("./error/AbortMapillaryError");
-Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return AbortMapillaryError_1.AbortMapillaryError; } });
-var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
-Object.defineProperty(exports, "ArgumentMapillaryError", { enumerable: true, get: function () { return ArgumentMapillaryError_1.ArgumentMapillaryError; } });
-var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
-Object.defineProperty(exports, "GraphMapillaryError", { enumerable: true, get: function () { return GraphMapillaryError_1.GraphMapillaryError; } });
-var MapillaryError_1 = require("./error/MapillaryError");
-Object.defineProperty(exports, "MapillaryError", { enumerable: true, get: function () { return MapillaryError_1.MapillaryError; } });
-
-},{"./error/AbortMapillaryError":410,"./error/ArgumentMapillaryError":411,"./error/GraphMapillaryError":412,"./error/MapillaryError":413}],294:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Lines = exports.Geo = void 0;
-var Camera_1 = require("./geo/Camera");
-Object.defineProperty(exports, "Camera", { enumerable: true, get: function () { return Camera_1.Camera; } });
-var GeoCoords_1 = require("./geo/GeoCoords");
-Object.defineProperty(exports, "GeoCoords", { enumerable: true, get: function () { return GeoCoords_1.GeoCoords; } });
-var GeoRBush_1 = require("./geo/GeoRBush");
-Object.defineProperty(exports, "GeoRBush", { enumerable: true, get: function () { return GeoRBush_1.GeoRBush; } });
-var ViewportCoords_1 = require("./geo/ViewportCoords");
-Object.defineProperty(exports, "ViewportCoords", { enumerable: true, get: function () { return ViewportCoords_1.ViewportCoords; } });
-var Spatial_1 = require("./geo/Spatial");
-Object.defineProperty(exports, "Spatial", { enumerable: true, get: function () { return Spatial_1.Spatial; } });
-var Transform_1 = require("./geo/Transform");
-Object.defineProperty(exports, "Transform", { enumerable: true, get: function () { return Transform_1.Transform; } });
-__exportStar(require("./geo/interfaces/interfaces"), exports);
-var Geo = require("./geo/Geo");
-exports.Geo = Geo;
-var Lines = require("./geo/Lines");
-exports.Lines = Lines;
-
-},{"./geo/Camera":414,"./geo/Geo":415,"./geo/GeoCoords":416,"./geo/GeoRBush":417,"./geo/Lines":418,"./geo/Spatial":419,"./geo/Transform":420,"./geo/ViewportCoords":421,"./geo/interfaces/interfaces":422}],295:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var FilterCreator_1 = require("./graph/FilterCreator");
-Object.defineProperty(exports, "FilterCreator", { enumerable: true, get: function () { return FilterCreator_1.FilterCreator; } });
-var Graph_1 = require("./graph/Graph");
-Object.defineProperty(exports, "Graph", { enumerable: true, get: function () { return Graph_1.Graph; } });
-var GraphCalculator_1 = require("./graph/GraphCalculator");
-Object.defineProperty(exports, "GraphCalculator", { enumerable: true, get: function () { return GraphCalculator_1.GraphCalculator; } });
-var GraphMode_1 = require("./graph/GraphMode");
-Object.defineProperty(exports, "GraphMode", { enumerable: true, get: function () { return GraphMode_1.GraphMode; } });
-var GraphService_1 = require("./graph/GraphService");
-Object.defineProperty(exports, "GraphService", { enumerable: true, get: function () { return GraphService_1.GraphService; } });
-var ImageLoadingService_1 = require("./graph/ImageLoadingService");
-Object.defineProperty(exports, "ImageLoadingService", { enumerable: true, get: function () { return ImageLoadingService_1.ImageLoadingService; } });
-var MeshReader_1 = require("./graph/MeshReader");
-Object.defineProperty(exports, "MeshReader", { enumerable: true, get: function () { return MeshReader_1.MeshReader; } });
-var Node_1 = require("./graph/Node");
-Object.defineProperty(exports, "Node", { enumerable: true, get: function () { return Node_1.Node; } });
-var NodeCache_1 = require("./graph/NodeCache");
-Object.defineProperty(exports, "NodeCache", { enumerable: true, get: function () { return NodeCache_1.NodeCache; } });
-var Sequence_1 = require("./graph/Sequence");
-Object.defineProperty(exports, "Sequence", { enumerable: true, get: function () { return Sequence_1.Sequence; } });
-__exportStar(require("./graph/interfaces/interfaces"), exports);
-
-},{"./graph/FilterCreator":423,"./graph/Graph":424,"./graph/GraphCalculator":425,"./graph/GraphMode":426,"./graph/GraphService":427,"./graph/ImageLoadingService":428,"./graph/MeshReader":429,"./graph/Node":430,"./graph/NodeCache":431,"./graph/Sequence":432,"./graph/interfaces/interfaces":439}],296:[function(require,module,exports){
-"use strict";
-/**
- * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
- * @name Mapillary
- */
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpatialDataComponent = exports.PopupComponent = exports.MarkerComponent = exports.TagComponent = void 0;
-__exportStar(require("./Support"), exports);
-var Edge_1 = require("./Edge");
-Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return Edge_1.EdgeDirection; } });
-var Error_1 = require("./Error");
-Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return Error_1.AbortMapillaryError; } });
-var Render_1 = require("./Render");
-Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return Render_1.RenderMode; } });
-var State_1 = require("./State");
-Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return State_1.TransitionMode; } });
-var Viewer_1 = require("./Viewer");
-Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Viewer_1.Alignment; } });
-Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return Viewer_1.ImageSize; } });
-Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
-var Component_1 = require("./Component");
-Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return Component_1.SliderMode; } });
-Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return Component_1.ComponentSize; } });
-var TagComponent = require("./component/tag/Tag");
-exports.TagComponent = TagComponent;
-var MarkerComponent = require("./component/marker/Marker");
-exports.MarkerComponent = MarkerComponent;
-var PopupComponent = require("./component/popup/Popup");
-exports.PopupComponent = PopupComponent;
-var SpatialDataComponent = require("./component/spatialdata/SpatialData");
-exports.SpatialDataComponent = SpatialDataComponent;
-
-},{"./Component":291,"./Edge":292,"./Error":293,"./Render":297,"./State":298,"./Support":299,"./Viewer":302,"./component/marker/Marker":333,"./component/popup/Popup":350,"./component/spatialdata/SpatialData":361,"./component/tag/Tag":366}],297:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOMRenderer_1 = require("./render/DOMRenderer");
-Object.defineProperty(exports, "DOMRenderer", { enumerable: true, get: function () { return DOMRenderer_1.DOMRenderer; } });
-var GLRenderer_1 = require("./render/GLRenderer");
-Object.defineProperty(exports, "GLRenderer", { enumerable: true, get: function () { return GLRenderer_1.GLRenderer; } });
-var GLRenderStage_1 = require("./render/GLRenderStage");
-Object.defineProperty(exports, "GLRenderStage", { enumerable: true, get: function () { return GLRenderStage_1.GLRenderStage; } });
-var RenderCamera_1 = require("./render/RenderCamera");
-Object.defineProperty(exports, "RenderCamera", { enumerable: true, get: function () { return RenderCamera_1.RenderCamera; } });
-var RenderMode_1 = require("./render/RenderMode");
-Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return RenderMode_1.RenderMode; } });
-var RenderService_1 = require("./render/RenderService");
-Object.defineProperty(exports, "RenderService", { enumerable: true, get: function () { return RenderService_1.RenderService; } });
-__exportStar(require("./render/interfaces/interfaces"), exports);
-
-},{"./render/DOMRenderer":440,"./render/GLRenderStage":441,"./render/GLRenderer":442,"./render/RenderCamera":443,"./render/RenderMode":444,"./render/RenderService":445,"./render/interfaces/interfaces":446}],298:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var FrameGenerator_1 = require("./state/FrameGenerator");
-Object.defineProperty(exports, "FrameGenerator", { enumerable: true, get: function () { return FrameGenerator_1.FrameGenerator; } });
-var RotationDelta_1 = require("./state/RotationDelta");
-Object.defineProperty(exports, "RotationDelta", { enumerable: true, get: function () { return RotationDelta_1.RotationDelta; } });
-var State_1 = require("./state/State");
-Object.defineProperty(exports, "State", { enumerable: true, get: function () { return State_1.State; } });
-var StateBase_1 = require("./state/states/StateBase");
-Object.defineProperty(exports, "StateBase", { enumerable: true, get: function () { return StateBase_1.StateBase; } });
-var StateContext_1 = require("./state/StateContext");
-Object.defineProperty(exports, "StateContext", { enumerable: true, get: function () { return StateContext_1.StateContext; } });
-var StateService_1 = require("./state/StateService");
-Object.defineProperty(exports, "StateService", { enumerable: true, get: function () { return StateService_1.StateService; } });
-var TransitionMode_1 = require("./state/TransitionMode");
-Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return TransitionMode_1.TransitionMode; } });
-var EarthState_1 = require("./state/states/EarthState");
-Object.defineProperty(exports, "EarthState", { enumerable: true, get: function () { return EarthState_1.EarthState; } });
-var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase");
-Object.defineProperty(exports, "InteractiveStateBase", { enumerable: true, get: function () { return InteractiveStateBase_1.InteractiveStateBase; } });
-var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState");
-Object.defineProperty(exports, "InteractiveWaitingState", { enumerable: true, get: function () { return InteractiveWaitingState_1.InteractiveWaitingState; } });
-var TraversingState_1 = require("./state/states/TraversingState");
-Object.defineProperty(exports, "TraversingState", { enumerable: true, get: function () { return TraversingState_1.TraversingState; } });
-var WaitingState_1 = require("./state/states/WaitingState");
-Object.defineProperty(exports, "WaitingState", { enumerable: true, get: function () { return WaitingState_1.WaitingState; } });
-__exportStar(require("./state/interfaces/interfaces"), exports);
-
-},{"./state/FrameGenerator":447,"./state/RotationDelta":448,"./state/State":449,"./state/StateContext":450,"./state/StateService":451,"./state/TransitionMode":452,"./state/interfaces/interfaces":453,"./state/states/EarthState":454,"./state/states/InteractiveStateBase":455,"./state/states/InteractiveWaitingState":456,"./state/states/StateBase":457,"./state/states/TraversingState":458,"./state/states/WaitingState":459}],299:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isFallbackSupported = exports.isSupported = void 0;
-var support = require("./utils/Support");
-/**
- * Test whether the current browser supports the full
- * functionality of MapillaryJS.
- *
- * @description The full functionality includes WebGL rendering.
- *
- * @return {boolean}
- *
- * @example `var supported = Mapillary.isSupported();`
- */
-function isSupported() {
-    return isFallbackSupported() &&
-        support.isWebGLSupportedCached();
-}
-exports.isSupported = isSupported;
-/**
- * Test whether the current browser supports the fallback
- * functionality of MapillaryJS.
- *
- * @description The fallback functionality does not include WebGL
- * rendering, only 2D canvas rendering.
- *
- * @return {boolean}
- *
- * @example `var fallbackSupported = Mapillary.isFallbackSupported();`
- */
-function isFallbackSupported() {
-    return support.isBrowser() &&
-        support.isBlobSupported() &&
-        support.isArraySupported() &&
-        support.isFunctionSupported() &&
-        support.isJSONSupported() &&
-        support.isObjectSupported();
-}
-exports.isFallbackSupported = isFallbackSupported;
-
-},{"./utils/Support":468}],300:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
-Object.defineProperty(exports, "ImageTileLoader", { enumerable: true, get: function () { return ImageTileLoader_1.ImageTileLoader; } });
-var ImageTileStore_1 = require("./tiles/ImageTileStore");
-Object.defineProperty(exports, "ImageTileStore", { enumerable: true, get: function () { return ImageTileStore_1.ImageTileStore; } });
-var TextureProvider_1 = require("./tiles/TextureProvider");
-Object.defineProperty(exports, "TextureProvider", { enumerable: true, get: function () { return TextureProvider_1.TextureProvider; } });
-var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
-Object.defineProperty(exports, "RegionOfInterestCalculator", { enumerable: true, get: function () { return RegionOfInterestCalculator_1.RegionOfInterestCalculator; } });
-__exportStar(require("./tiles/interfaces/interfaces"), exports);
-
-},{"./tiles/ImageTileLoader":460,"./tiles/ImageTileStore":461,"./tiles/RegionOfInterestCalculator":462,"./tiles/TextureProvider":463,"./tiles/interfaces/interfaces":464}],301:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOM_1 = require("./utils/DOM");
-Object.defineProperty(exports, "DOM", { enumerable: true, get: function () { return DOM_1.DOM; } });
-var EventEmitter_1 = require("./utils/EventEmitter");
-Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return EventEmitter_1.EventEmitter; } });
-var Settings_1 = require("./utils/Settings");
-Object.defineProperty(exports, "Settings", { enumerable: true, get: function () { return Settings_1.Settings; } });
-__exportStar(require("./utils/Support"), exports);
-var Urls_1 = require("./utils/Urls");
-Object.defineProperty(exports, "Urls", { enumerable: true, get: function () { return Urls_1.Urls; } });
-
-},{"./utils/DOM":465,"./utils/EventEmitter":466,"./utils/Settings":467,"./utils/Support":468,"./utils/Urls":469}],302:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var Alignment_1 = require("./viewer/Alignment");
-Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Alignment_1.Alignment; } });
-var CacheService_1 = require("./viewer/CacheService");
-Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return CacheService_1.CacheService; } });
-var ComponentController_1 = require("./viewer/ComponentController");
-Object.defineProperty(exports, "ComponentController", { enumerable: true, get: function () { return ComponentController_1.ComponentController; } });
-var Container_1 = require("./viewer/Container");
-Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return Container_1.Container; } });
-var Observer_1 = require("./viewer/Observer");
-Object.defineProperty(exports, "Observer", { enumerable: true, get: function () { return Observer_1.Observer; } });
-var ImageSize_1 = require("./viewer/ImageSize");
-Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return ImageSize_1.ImageSize; } });
-var KeyboardService_1 = require("./viewer/KeyboardService");
-Object.defineProperty(exports, "KeyboardService", { enumerable: true, get: function () { return KeyboardService_1.KeyboardService; } });
-var LoadingService_1 = require("./viewer/LoadingService");
-Object.defineProperty(exports, "LoadingService", { enumerable: true, get: function () { return LoadingService_1.LoadingService; } });
-var MouseService_1 = require("./viewer/MouseService");
-Object.defineProperty(exports, "MouseService", { enumerable: true, get: function () { return MouseService_1.MouseService; } });
-var Navigator_1 = require("./viewer/Navigator");
-Object.defineProperty(exports, "Navigator", { enumerable: true, get: function () { return Navigator_1.Navigator; } });
-var PlayService_1 = require("./viewer/PlayService");
-Object.defineProperty(exports, "PlayService", { enumerable: true, get: function () { return PlayService_1.PlayService; } });
-var Projection_1 = require("./viewer/Projection");
-Object.defineProperty(exports, "Projection", { enumerable: true, get: function () { return Projection_1.Projection; } });
-var SpriteService_1 = require("./viewer/SpriteService");
-Object.defineProperty(exports, "SpriteService", { enumerable: true, get: function () { return SpriteService_1.SpriteService; } });
-var TouchService_1 = require("./viewer/TouchService");
-Object.defineProperty(exports, "TouchService", { enumerable: true, get: function () { return TouchService_1.TouchService; } });
-var Viewer_1 = require("./viewer/Viewer");
-Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
-__exportStar(require("./viewer/interfaces/interfaces"), exports);
-
-},{"./viewer/Alignment":470,"./viewer/CacheService":471,"./viewer/ComponentController":472,"./viewer/Container":473,"./viewer/ImageSize":474,"./viewer/KeyboardService":475,"./viewer/LoadingService":476,"./viewer/MouseService":477,"./viewer/Navigator":478,"./viewer/Observer":479,"./viewer/PlayService":481,"./viewer/Projection":482,"./viewer/SpriteService":483,"./viewer/TouchService":484,"./viewer/Viewer":485,"./viewer/interfaces/interfaces":486}],303:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.APIv3 = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var API_1 = require("../API");
-/**
- * @class APIv3
- *
- * @classdesc Provides methods for access of API v3.
- */
-var APIv3 = /** @class */ (function () {
-    /**
-     * Create a new api v3 instance.
-     *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @param {ModelCreator} [creator] - Optional model creator instance.
-     */
-    function APIv3(clientId, token, creator) {
-        this._clientId = clientId;
-        this._modelCreator = creator != null ? creator : new API_1.ModelCreator();
-        this._model = this._modelCreator.createModel(clientId, token);
-        this._pageCount = 999;
-        this._pathImageByKey = "imageByKey";
-        this._pathImageCloseTo = "imageCloseTo";
-        this._pathImagesByH = "imagesByH";
-        this._pathImageViewAdd = "imageViewAdd";
-        this._pathSequenceByKey = "sequenceByKey";
-        this._pathSequenceViewAdd = "sequenceViewAdd";
-        this._propertiesCore = [
-            "cl",
-            "l",
-            "sequence_key",
-        ];
-        this._propertiesFill = [
-            "captured_at",
-            "captured_with_camera_uuid",
-            "user",
-            "organization_key",
-            "private",
-            "project",
-        ];
-        this._propertiesKey = [
-            "key",
-        ];
-        this._propertiesSequence = [
-            "keys",
-        ];
-        this._propertiesSpatial = [
-            "atomic_scale",
-            "cluster_key",
-            "c_rotation",
-            "ca",
-            "calt",
-            "camera_projection_type",
-            "cca",
-            "cfocal",
-            "ck1",
-            "ck2",
-            "gpano",
-            "height",
-            "merge_cc",
-            "merge_version",
-            "orientation",
-            "width",
-        ];
-        this._propertiesUser = [
-            "username",
-        ];
-    }
-    Object.defineProperty(APIv3.prototype, "clientId", {
-        get: function () {
-            return this._clientId;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    APIv3.prototype.imageByKeyFill$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
-            }
-            return value.json.imageByKey;
-        })), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageByKeyFull$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
-            }
-            return value.json.imageByKey;
-        })), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
-        var lonLat = lon + ":" + lat;
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageCloseTo,
-            [lonLat],
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            return value != null ? value.json.imageCloseTo[lonLat] : null;
-        })), this._pathImageCloseTo, [lonLat]);
-    };
-    APIv3.prototype.imagesByH$ = function (hs) {
-        var _this = this;
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImagesByH,
-            hs,
-            { from: 0, to: this._pageCount },
-            this._propertiesKey
-                .concat(this._propertiesCore)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                value = { json: { imagesByH: {} } };
-                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
-                    var h = hs_1[_i];
-                    value.json.imagesByH[h] = {};
-                    for (var i = 0; i <= _this._pageCount; i++) {
-                        value.json.imagesByH[h][i] = null;
-                    }
-                }
-            }
-            return value.json.imagesByH;
-        })), this._pathImagesByH, hs);
-    };
-    APIv3.prototype.imageViewAdd$ = function (keys) {
-        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
-    };
-    APIv3.prototype.invalidateImageByKey = function (keys) {
-        this._invalidateGet(this._pathImageByKey, keys);
-    };
-    APIv3.prototype.invalidateImagesByH = function (hs) {
-        this._invalidateGet(this._pathImagesByH, hs);
-    };
-    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
-        this._invalidateGet(this._pathSequenceByKey, sKeys);
-    };
-    APIv3.prototype.setToken = function (token) {
-        this._model.invalidate([]);
-        this._model = null;
-        this._model = this._modelCreator.createModel(this._clientId, token);
-    };
-    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathSequenceByKey,
-            sequenceKeys,
-            this._propertiesKey
-                .concat(this._propertiesSequence)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                value = { json: { sequenceByKey: {} } };
-            }
-            for (var _i = 0, sequenceKeys_1 = sequenceKeys; _i < sequenceKeys_1.length; _i++) {
-                var sequenceKey = sequenceKeys_1[_i];
-                if (!(sequenceKey in value.json.sequenceByKey)) {
-                    console.warn("Sequence data missing (" + sequenceKey + ")");
-                    value.json.sequenceByKey[sequenceKey] = { key: sequenceKey, keys: [] };
-                }
-            }
-            return value.json.sequenceByKey;
-        })), this._pathSequenceByKey, sequenceKeys);
-    };
-    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
-        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
-    };
-    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
-        var _this = this;
-        return observable.pipe(operators_1.catchError(function (error) {
-            _this._invalidateGet(path, paths);
-            throw error;
-        }));
-    };
-    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
-        var _this = this;
-        return observable.pipe(operators_1.catchError(function (error) {
-            _this._invalidateCall(path, paths);
-            throw error;
-        }));
-    };
-    APIv3.prototype._invalidateGet = function (path, paths) {
-        this._model.invalidate([path, paths]);
-    };
-    APIv3.prototype._invalidateCall = function (path, paths) {
-        this._model.invalidate([path], [paths]);
-    };
-    APIv3.prototype._wrapModelResponse$ = function (modelResponse) {
-        return rxjs_1.Observable
-            .create(function (subscriber) {
-            modelResponse
-                .then(function (value) {
-                subscriber.next(value);
-                subscriber.complete();
-            }, function (error) {
-                subscriber.error(error);
-            });
-        });
-    };
-    APIv3.prototype._wrapCallModelResponse$ = function (modelResponse) {
-        return this._wrapModelResponse$(modelResponse).pipe(operators_1.map(function (value) {
-            return;
-        }));
-    };
-    return APIv3;
-}());
-exports.APIv3 = APIv3;
-exports.default = APIv3;
-
-},{"../API":290,"rxjs":43,"rxjs/operators":241}],304:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ModelCreator = void 0;
-var falcor = require("falcor");
-var falcor_http_datasource_1 = require("falcor-http-datasource");
-var Utils_1 = require("../Utils");
-/**
- * @class ModelCreator
- *
- * @classdesc Creates API models.
- */
-var ModelCreator = /** @class */ (function () {
-    function ModelCreator() {
-    }
-    /**
-     * Creates a Falcor model.
-     *
-     * @description Max cache size will be set to 16 MB. Authorization
-     * header will be added if bearer token is supplied.
-     *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @returns {falcor.Model} Falcor model for HTTP requests.
-     */
-    ModelCreator.prototype.createModel = function (clientId, token) {
-        var configuration = {
-            crossDomain: true,
-            withCredentials: false,
-        };
-        if (token != null) {
-            configuration.headers = { "Authorization": "Bearer " + token };
-        }
-        return new falcor.Model({
-            maxSize: 16 * 1024 * 1024,
-            source: new falcor_http_datasource_1.default(Utils_1.Urls.falcorModel(clientId), configuration),
-        });
-    };
-    return ModelCreator;
-}());
-exports.ModelCreator = ModelCreator;
-exports.default = ModelCreator;
-
-},{"../Utils":301,"falcor":15,"falcor-http-datasource":10}],305:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],306:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AttributionComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var AttributionComponent = /** @class */ (function (_super) {
-    __extends(AttributionComponent, _super);
-    function AttributionComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    AttributionComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], size = _a[1];
-            return {
-                name: _this._name,
-                vnode: _this._getAttributionNode(node.username, node.key, node.capturedAt, size.width),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    AttributionComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    AttributionComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    AttributionComponent.prototype._getAttributionNode = function (username, key, capturedAt, width) {
-        var compact = width <= 640;
-        var mapillaryIcon = vd.h("div.AttributionMapillaryLogo", []);
-        var mapillaryLink = vd.h("a.AttributionIconContainer", { href: Utils_1.Urls.explore, target: "_blank" }, [mapillaryIcon]);
-        var imageBy = compact ? "" + username : "image by " + username;
-        var imageByContent = vd.h("div.AttributionUsername", { textContent: imageBy }, []);
-        var date = new Date(capturedAt).toDateString().split(" ");
-        var formatted = (date.length > 3 ?
-            compact ?
-                [date[3]] :
-                [date[1], date[2] + ",", date[3]] :
-            date).join(" ");
-        var dateContent = vd.h("div.AttributionDate", { textContent: formatted }, []);
-        var imageLink = vd.h("a.AttributionImageContainer", { href: Utils_1.Urls.exporeImage(key), target: "_blank" }, [imageByContent, dateContent]);
-        var compactClass = compact ? ".AttributionCompact" : "";
-        return vd.h("div.AttributionContainer" + compactClass, {}, [mapillaryLink, imageLink]);
-    };
-    AttributionComponent.componentName = "attribution";
-    return AttributionComponent;
-}(Component_1.Component));
-exports.AttributionComponent = AttributionComponent;
-Component_1.ComponentService.register(AttributionComponent);
-exports.default = AttributionComponent;
-
-},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],307:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.BackgroundComponent = void 0;
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BackgroundComponent = /** @class */ (function (_super) {
-    __extends(BackgroundComponent, _super);
-    function BackgroundComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    BackgroundComponent.prototype._activate = function () {
-        this._container.domRenderer.render$
-            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") });
-    };
-    BackgroundComponent.prototype._deactivate = function () {
-        return;
-    };
-    BackgroundComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
-        // todo: add condition for when to display the DOM node
-        return vd.h("div.BackgroundWrapper", {}, [
-            vd.h("p", { textContent: notice }, []),
-        ]);
-    };
-    BackgroundComponent.componentName = "background";
-    return BackgroundComponent;
-}(Component_1.Component));
-exports.BackgroundComponent = BackgroundComponent;
-Component_1.ComponentService.register(BackgroundComponent);
-exports.default = BackgroundComponent;
-
-},{"../Component":291,"virtual-dom":247}],308:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.BearingComponent = void 0;
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var UnitBezier = require("@mapbox/unitbezier");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var ViewportCoords_1 = require("../geo/ViewportCoords");
-var ComponentSize_1 = require("./utils/ComponentSize");
-/**
- * @class BearingComponent
- *
- * @classdesc Component for indicating bearing and field of view.
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var bearingComponent = viewer.getComponent("bearing");
- * bearingComponent.configure({ size: Mapillary.ComponentSize.Small });
- * ```
- */
-var BearingComponent = /** @class */ (function (_super) {
-    __extends(BearingComponent, _super);
-    function BearingComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._spatial = new Geo_1.Spatial();
-        _this._viewportCoords = new ViewportCoords_1.default();
-        _this._svgNamespace = "http://www.w3.org/2000/svg";
-        _this._distinctThreshold = Math.PI / 360;
-        _this._animationSpeed = 0.075;
-        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        return _this;
-    }
-    BearingComponent.prototype._activate = function () {
-        var _this = this;
-        var cameraBearingFov$ = this._container.renderService.renderCamera$.pipe(operators_1.map(function (rc) {
-            var vFov = _this._spatial.degToRad(rc.perspective.fov);
-            var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ?
-                Math.PI :
-                Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
-            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
-        }), operators_1.distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
-        }));
-        var nodeFov$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })), this._navigator.panService.panNodes$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], panNodes = _a[1];
-            var node = frame.state.currentNode;
-            var transform = frame.state.currentTransform;
-            if (node.pano) {
-                var panoHFov = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
-                return [panoHFov / 2, panoHFov / 2];
-            }
-            var currentProjectedPoints = _this._computeProjectedPoints(transform);
-            var hFov = _this._spatial.degToRad(_this._computeHorizontalFov(currentProjectedPoints));
-            var hFovLeft = hFov / 2;
-            var hFovRight = hFov / 2;
-            for (var _i = 0, panNodes_1 = panNodes; _i < panNodes_1.length; _i++) {
-                var _b = panNodes_1[_i], n = _b[0], f = _b[2];
-                var diff = _this._spatial.wrap(n.ca - node.ca, -180, 180);
-                if (diff < 0) {
-                    hFovLeft = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
-                }
-                else {
-                    hFovRight = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
-                }
-            }
-            return [hFovLeft, hFovRight];
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var hFovLeft1 = _a[0], hFovRight1 = _a[1];
-            var hFovLeft2 = _b[0], hFovRight2 = _b[1];
-            return Math.abs(hFovLeft2 - hFovLeft1) < _this._distinctThreshold &&
-                Math.abs(hFovRight2 - hFovRight1) < _this._distinctThreshold;
-        }));
-        var offset$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })), this._container.renderService.bearing$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], bearing = _a[1];
-            var offset = _this._spatial.degToRad(frame.state.currentNode.ca - bearing);
-            return offset;
-        }));
-        var nodeFovOperation$ = new rxjs_1.Subject();
-        var smoothNodeFov$ = nodeFovOperation$.pipe(operators_1.scan(function (state, operation) {
-            return operation(state);
-        }, { alpha: 0, curr: [0, 0, 0], prev: [0, 0, 0] }), operators_1.map(function (state) {
-            var alpha = _this._unitBezier.solve(state.alpha);
-            var curr = state.curr;
-            var prev = state.prev;
-            return [
-                _this._interpolate(prev[0], curr[0], alpha),
-                _this._interpolate(prev[1], curr[1], alpha),
-            ];
-        }));
-        this._fovSubscription = nodeFov$.pipe(operators_1.map(function (nbf) {
-            return function (state) {
-                var a = _this._unitBezier.solve(state.alpha);
-                var c = state.curr;
-                var p = state.prev;
-                var prev = [
-                    _this._interpolate(p[0], c[0], a),
-                    _this._interpolate(p[1], c[1], a),
-                ];
-                var curr = nbf.slice();
-                return {
-                    alpha: 0,
-                    curr: curr,
-                    prev: prev,
-                };
-            };
-        }))
-            .subscribe(nodeFovOperation$);
-        this._fovAnimationSubscription = nodeFov$.pipe(operators_1.switchMap(function () {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.skip(1), operators_1.scan(function (alpha) {
-                return alpha + _this._animationSpeed;
-            }, 0), operators_1.takeWhile(function (alpha) {
-                return alpha <= 1 + _this._animationSpeed;
-            }), operators_1.map(function (alpha) {
-                return Math.min(alpha, 1);
-            }));
-        }), operators_1.map(function (alpha) {
-            return function (nbfState) {
-                return {
-                    alpha: alpha,
-                    curr: nbfState.curr.slice(),
-                    prev: nbfState.prev.slice(),
-                };
-            };
-        }))
-            .subscribe(nodeFovOperation$);
-        var nodeBearingFov$ = rxjs_1.combineLatest(offset$, smoothNodeFov$).pipe(operators_1.map(function (_a) {
-            var offset = _a[0], fov = _a[1];
-            return [offset, fov[0], fov[1]];
-        }));
-        this._renderSubscription = rxjs_1.combineLatest(cameraBearingFov$, nodeBearingFov$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var _b = _a[0], cb = _b[0], cf = _b[1], _c = _a[1], no = _c[0], nfl = _c[1], nfr = _c[2], configuration = _a[2], size = _a[3];
-            var background = _this._createBackground(cb);
-            var fovIndicator = _this._createFovIndicator(nfl, nfr, no);
-            var north = _this._createNorth(cb);
-            var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, cf), "#FFF"));
-            var compact = configuration.size === ComponentSize_1.default.Small ||
-                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
-                ".BearingCompact" : "";
-            return {
-                name: _this._name,
-                vnode: vd.h("div.BearingIndicatorContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [
-                    background,
-                    fovIndicator,
-                    north,
-                    cameraSector,
-                ]),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    BearingComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._fovSubscription.unsubscribe();
-        this._fovAnimationSubscription.unsubscribe();
-    };
-    BearingComponent.prototype._getDefaultConfiguration = function () {
-        return { size: ComponentSize_1.default.Automatic };
-    };
-    BearingComponent.prototype._createFovIndicator = function (fovLeft, fovRigth, offset) {
-        var arc = this._createFovArc(fovLeft, fovRigth);
-        var group = vd.h("g", {
-            attributes: { transform: "translate(18,18)" },
-            namespace: this._svgNamespace,
-        }, [arc]);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 36 36" },
-            namespace: this._svgNamespace,
-            style: {
-                height: "36px",
-                left: "2px",
-                position: "absolute",
-                top: "2px",
-                transform: "rotateZ(" + this._spatial.radToDeg(offset) + "deg)",
-                width: "36px",
-            },
-        }, [group]);
-        return svg;
-    };
-    BearingComponent.prototype._createFovArc = function (fovLeft, fovRigth) {
-        var radius = 16.75;
-        var strokeWidth = 2.5;
-        var fov = fovLeft + fovRigth;
-        if (fov > 2 * Math.PI - Math.PI / 90) {
-            return vd.h("circle", {
-                attributes: {
-                    cx: "0",
-                    cy: "0",
-                    "fill-opacity": "0",
-                    r: "" + radius,
-                    stroke: "#FFF",
-                    "stroke-width": "" + strokeWidth,
-                },
-                namespace: this._svgNamespace,
-            }, []);
-        }
-        var arcStart = -Math.PI / 2 - fovLeft;
-        var arcEnd = arcStart + fov;
-        var startX = radius * Math.cos(arcStart);
-        var startY = radius * Math.sin(arcStart);
-        var endX = radius * Math.cos(arcEnd);
-        var endY = radius * Math.sin(arcEnd);
-        var largeArc = fov >= Math.PI ? 1 : 0;
-        var description = "M " + startX + " " + startY + " A " + radius + " " + radius + " 0 " + largeArc + " 1 " + endX + " " + endY;
-        return vd.h("path", {
-            attributes: {
-                d: description,
-                "fill-opacity": "0",
-                stroke: "#FFF",
-                "stroke-width": "" + strokeWidth,
-            },
-            namespace: this._svgNamespace,
-        }, []);
-    };
-    BearingComponent.prototype._createCircleSectorCompass = function (cameraSector) {
-        var group = vd.h("g", {
-            attributes: { transform: "translate(1,1)" },
-            namespace: this._svgNamespace,
-        }, [cameraSector]);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 2 2" },
-            namespace: this._svgNamespace,
-            style: {
-                height: "26px",
-                left: "7px",
-                position: "absolute",
-                top: "7px",
-                width: "26px",
-            },
-        }, [group]);
-        return svg;
-    };
-    BearingComponent.prototype._createCircleSector = function (fov, fill) {
-        if (fov > 2 * Math.PI - Math.PI / 90) {
-            return vd.h("circle", {
-                attributes: { cx: "0", cy: "0", fill: fill, r: "1" },
-                namespace: this._svgNamespace,
-            }, []);
-        }
-        var arcStart = -Math.PI / 2 - fov / 2;
-        var arcEnd = arcStart + fov;
-        var startX = Math.cos(arcStart);
-        var startY = Math.sin(arcStart);
-        var endX = Math.cos(arcEnd);
-        var endY = Math.sin(arcEnd);
-        var largeArc = fov >= Math.PI ? 1 : 0;
-        var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY;
-        return vd.h("path", {
-            attributes: { d: description, fill: fill },
-            namespace: this._svgNamespace,
-        }, []);
-    };
-    BearingComponent.prototype._createNorth = function (bearing) {
-        var north = vd.h("div.BearingNorth", []);
-        var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [north]);
-        return container;
-    };
-    BearingComponent.prototype._createBackground = function (bearing) {
-        return vd.h("div.BearingIndicatorBackground", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [
-            vd.h("div.BearingIndicatorBackgroundCircle", []),
-            vd.h("div.BearingIndicatorBackgroundArrowContainer", [
-                vd.h("div.BearingIndicatorBackgroundArrow", []),
-            ]),
-        ]);
-    };
-    BearingComponent.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[1, 0]];
-        var directions = [[0, 0.5]];
-        var pointsPerLine = 12;
-        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    BearingComponent.prototype._computeHorizontalFov = function (projectedPoints) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._coordToFov(projectedPoint[0]);
-        });
-        var fov = Math.min.apply(Math, fovs);
-        return fov;
-    };
-    BearingComponent.prototype._coordToFov = function (x) {
-        return this._spatial.radToDeg(2 * Math.atan(x));
-    };
-    BearingComponent.prototype._interpolate = function (x1, x2, alpha) {
-        return (1 - alpha) * x1 + alpha * x2;
-    };
-    BearingComponent.componentName = "bearing";
-    return BearingComponent;
-}(Component_1.Component));
-exports.BearingComponent = BearingComponent;
-Component_1.ComponentService.register(BearingComponent);
-exports.default = BearingComponent;
-
-
-},{"../Component":291,"../Geo":294,"../geo/ViewportCoords":421,"./utils/ComponentSize":404,"@mapbox/unitbezier":2,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],309:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CacheComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var CacheComponent = /** @class */ (function (_super) {
-    __extends(CacheComponent, _super);
-    function CacheComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    /**
-     * Set the cache depth.
-     *
-     * Configures the cache depth. The cache depth can be different for
-     * different edge direction types.
-     *
-     * @param {ICacheDepth} depth - Cache depth structure.
-     */
-    CacheComponent.prototype.setDepth = function (depth) {
-        this.configure({ depth: depth });
-    };
-    CacheComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }), operators_1.filter(function (status) {
-            return status.cached;
-        })), this._configuration$).pipe(operators_1.switchMap(function (nc) {
-            var status = nc[0];
-            var configuration = nc[1];
-            var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence));
-            var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth);
-            var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth);
-            return rxjs_1.merge(next$, prev$).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to cache sequence edges.", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-        this._spatialSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return rxjs_1.combineLatest(rxjs_1.of(node), node.spatialEdges$.pipe(operators_1.filter(function (status) {
-                return status.cached;
-            })));
-        })), this._configuration$).pipe(operators_1.switchMap(function (_a) {
-            var _b = _a[0], node = _b[0], edgeStatus = _b[1], configuration = _a[1];
-            var edges = edgeStatus.edges;
-            var depth = configuration.depth;
-            var panoDepth = Math.max(0, Math.min(2, depth.pano));
-            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
-            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
-            var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth);
-            var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth);
-            var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth);
-            var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth);
-            var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth);
-            var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth);
-            var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth);
-            var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth);
-            return rxjs_1.merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to cache spatial edges.", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-    };
-    CacheComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._spatialSubscription.unsubscribe();
-    };
-    CacheComponent.prototype._getDefaultConfiguration = function () {
-        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
-    };
-    CacheComponent.prototype._cache$ = function (edges, direction, depth) {
-        var _this = this;
-        return rxjs_1.zip(rxjs_1.of(edges), rxjs_1.of(depth)).pipe(operators_1.expand(function (ed) {
-            var es = ed[0];
-            var d = ed[1];
-            var edgesDepths$ = [];
-            if (d > 0) {
-                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
-                    var edge = es_1[_i];
-                    if (edge.data.direction === direction) {
-                        edgesDepths$.push(rxjs_1.zip(_this._navigator.graphService.cacheNode$(edge.to).pipe(operators_1.mergeMap(function (n) {
-                            return _this._nodeToEdges$(n, direction);
-                        })), rxjs_1.of(d - 1)));
-                    }
-                }
-            }
-            return rxjs_1.from(edgesDepths$).pipe(operators_1.mergeAll());
-        }), operators_1.skip(1));
-    };
-    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
-        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-            node.sequenceEdges$ :
-            node.spatialEdges$).pipe(operators_1.first(function (status) {
-            return status.cached;
-        }), operators_1.map(function (status) {
-            return status.edges;
-        }));
-    };
-    CacheComponent.componentName = "cache";
-    return CacheComponent;
-}(Component_1.Component));
-exports.CacheComponent = CacheComponent;
-Component_1.ComponentService.register(CacheComponent);
-exports.default = CacheComponent;
-
-},{"../Component":291,"../Edge":292,"rxjs":43,"rxjs/operators":241}],310:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Component = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Utils_1 = require("../Utils");
-var Component = /** @class */ (function (_super) {
-    __extends(Component, _super);
-    function Component(name, container, navigator) {
-        var _this = _super.call(this) || this;
-        _this._activated$ = new rxjs_1.BehaviorSubject(false);
-        _this._configurationSubject$ = new rxjs_1.Subject();
-        _this._activated = false;
-        _this._container = container;
-        _this._name = name;
-        _this._navigator = navigator;
-        _this._configuration$ =
-            _this._configurationSubject$.pipe(operators_1.startWith(_this.defaultConfiguration), operators_1.scan(function (conf, newConf) {
-                for (var key in newConf) {
-                    if (newConf.hasOwnProperty(key)) {
-                        conf[key] = newConf[key];
-                    }
-                }
-                return conf;
-            }), operators_1.publishReplay(1), operators_1.refCount());
-        _this._configuration$.subscribe(function () { });
-        return _this;
-    }
-    Object.defineProperty(Component.prototype, "activated", {
-        get: function () {
-            return this._activated;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "activated$", {
-        /** @ignore */
-        get: function () {
-            return this._activated$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "defaultConfiguration", {
-        /**
-         * Get default configuration.
-         *
-         * @returns {TConfiguration} Default configuration for component.
-         */
-        get: function () {
-            return this._getDefaultConfiguration();
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "configuration$", {
-        /** @ignore */
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "name", {
-        /**
-         * Get name.
-         *
-         * @description The name of the component. Used when interacting with the
-         * component through the Viewer's API.
-         */
-        get: function () {
-            return this._name;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Component.prototype.activate = function (conf) {
-        if (this._activated) {
-            return;
-        }
-        if (conf !== undefined) {
-            this._configurationSubject$.next(conf);
-        }
-        this._activated = true;
-        this._activate();
-        this._activated$.next(true);
-    };
-    Component.prototype.configure = function (conf) {
-        this._configurationSubject$.next(conf);
-    };
-    Component.prototype.deactivate = function () {
-        if (!this._activated) {
-            return;
-        }
-        this._activated = false;
-        this._deactivate();
-        this._container.domRenderer.clear(this._name);
-        this._container.glRenderer.clear(this._name);
-        this._activated$.next(false);
-    };
-    /**
-     * Detect the viewer's new width and height and resize the component's
-     * rendered elements accordingly if applicable.
-     *
-     * @ignore
-     */
-    Component.prototype.resize = function () { return; };
-    Component.componentName = "not_worthy";
-    return Component;
-}(Utils_1.EventEmitter));
-exports.Component = Component;
-exports.default = Component;
-
-},{"../Utils":301,"rxjs":43,"rxjs/operators":241}],311:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ComponentService = void 0;
-var Error_1 = require("../Error");
-var ComponentService = /** @class */ (function () {
-    function ComponentService(container, navigator) {
-        this._components = {};
-        for (var componentName in ComponentService.registeredComponents) {
-            if (!ComponentService.registeredComponents.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = ComponentService.registeredComponents[componentName];
-            this._components[componentName] = {
-                active: false,
-                component: new component(componentName, container, navigator),
-            };
-        }
-        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
-        this._coverComponent.activate();
-        this._coverActivated = true;
-    }
-    ComponentService.register = function (component) {
-        if (ComponentService.registeredComponents[component.componentName] === undefined) {
-            ComponentService.registeredComponents[component.componentName] = component;
-        }
-    };
-    ComponentService.registerCover = function (coverComponent) {
-        ComponentService.registeredCoverComponent = coverComponent;
-    };
-    Object.defineProperty(ComponentService.prototype, "coverActivated", {
-        get: function () {
-            return this._coverActivated;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    ComponentService.prototype.activateCover = function () {
-        if (this._coverActivated) {
-            return;
-        }
-        this._coverActivated = true;
-        for (var componentName in this._components) {
-            if (!this._components.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = this._components[componentName];
-            if (component.active) {
-                component.component.deactivate();
-            }
-        }
-    };
-    ComponentService.prototype.deactivateCover = function () {
-        if (!this._coverActivated) {
-            return;
-        }
-        this._coverActivated = false;
-        for (var componentName in this._components) {
-            if (!this._components.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = this._components[componentName];
-            if (component.active) {
-                component.component.activate();
-            }
-        }
-    };
-    ComponentService.prototype.activate = function (name) {
-        this._checkName(name);
-        this._components[name].active = true;
-        if (!this._coverActivated) {
-            this.get(name).activate();
-        }
-    };
-    ComponentService.prototype.configure = function (name, conf) {
-        this._checkName(name);
-        this.get(name).configure(conf);
-    };
-    ComponentService.prototype.deactivate = function (name) {
-        this._checkName(name);
-        this._components[name].active = false;
-        if (!this._coverActivated) {
-            this.get(name).deactivate();
-        }
-    };
-    ComponentService.prototype.get = function (name) {
-        return this._components[name].component;
-    };
-    ComponentService.prototype.getCover = function () {
-        return this._coverComponent;
-    };
-    ComponentService.prototype._checkName = function (name) {
-        if (!(name in this._components)) {
-            throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name);
-        }
-    };
-    ComponentService.registeredComponents = {};
-    return ComponentService;
-}());
-exports.ComponentService = ComponentService;
-exports.default = ComponentService;
-
-},{"../Error":293}],312:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CoverComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var Viewer_1 = require("../Viewer");
-var CoverComponent = /** @class */ (function (_super) {
-    __extends(CoverComponent, _super);
-    function CoverComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    CoverComponent.prototype._activate = function () {
-        var _this = this;
-        this._configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (configuration) {
-            return configuration.state;
-        }), operators_1.switchMap(function (configuration) {
-            return rxjs_1.combineLatest(rxjs_1.of(configuration.state), _this._navigator.stateService.currentNode$);
-        }), operators_1.switchMap(function (_a) {
-            var state = _a[0], node = _a[1];
-            var keySrc$ = rxjs_1.combineLatest(rxjs_1.of(node.key), node.image$.pipe(operators_1.filter(function (image) {
-                return !!image;
-            }), operators_1.map(function (image) {
-                return image.src;
-            })));
-            return state === Component_1.CoverState.Visible ? keySrc$.pipe(operators_1.first()) : keySrc$;
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var k1 = _a[0], s1 = _a[1];
-            var k2 = _b[0], s2 = _b[1];
-            return k1 === k2 && s1 === s2;
-        }), operators_1.map(function (_a) {
-            var key = _a[0], src = _a[1];
-            return { key: key, src: src };
-        }))
-            .subscribe(this._configurationSubject$);
-        this._renderSubscription = rxjs_1.combineLatest(this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var configuration = _a[0], size = _a[1];
-            if (!configuration.key) {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-            var compactClass = size.width <= 640 || size.height <= 480 ? ".CoverCompact" : "";
-            if (configuration.state === Component_1.CoverState.Hidden) {
-                var doneContainer = vd.h("div.CoverContainer.CoverDone" + compactClass, [_this._getCoverBackgroundVNode(configuration)]);
-                return { name: _this._name, vnode: doneContainer };
-            }
-            var container = vd.h("div.CoverContainer" + compactClass, [_this._getCoverButtonVNode(configuration)]);
-            return { name: _this._name, vnode: container };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    CoverComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._keySubscription.unsubscribe();
-    };
-    CoverComponent.prototype._getDefaultConfiguration = function () {
-        return { state: Component_1.CoverState.Visible };
-    };
-    CoverComponent.prototype._getCoverButtonVNode = function (configuration) {
-        var _this = this;
-        var cover = configuration.state === Component_1.CoverState.Loading ? "div.Cover.CoverLoading" : "div.Cover";
-        var coverButton = vd.h("div.CoverButton", [vd.h("div.CoverButtonIcon", [])]);
-        var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []);
-        var coverIndicator = vd.h("div.CoverIndicator", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, []);
-        return vd.h(cover, [
-            this._getCoverBackgroundVNode(configuration),
-            coverIndicator,
-            coverButton,
-            coverLogo,
-        ]);
-    };
-    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
-        var url = conf.src != null ?
-            conf.src : Utils_1.Urls.thumbnail(conf.key, Viewer_1.ImageSize.Size640);
-        var properties = { style: { backgroundImage: "url(" + url + ")" } };
-        var children = [];
-        if (conf.state === Component_1.CoverState.Loading) {
-            children.push(vd.h("div.Spinner", {}, []));
-        }
-        return vd.h("div.CoverBackground", properties, children);
-    };
-    CoverComponent.componentName = "cover";
-    return CoverComponent;
-}(Component_1.Component));
-exports.CoverComponent = CoverComponent;
-Component_1.ComponentService.registerCover(CoverComponent);
-exports.default = CoverComponent;
-
-},{"../Component":291,"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],313:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DebugComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var DebugComponent = /** @class */ (function (_super) {
-    __extends(DebugComponent, _super);
-    function DebugComponent() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._open$ = new rxjs_1.BehaviorSubject(false);
-        return _this;
-    }
-    DebugComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._open$, this._navigator.imageLoadingService.loadstatus$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], open = _a[1], loadStatus = _a[2];
-            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    DebugComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    DebugComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
-        var ret = [];
-        ret.push(vd.h("h2", "Node"));
-        if (frame.state.currentNode) {
-            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
-        }
-        if (frame.state.previousNode) {
-            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
-        }
-        ret.push(vd.h("h2", "Loading"));
-        var total = 0;
-        var loaded = 0;
-        var loading = 0;
-        for (var key in loadStatus) {
-            if (!loadStatus.hasOwnProperty(key)) {
-                continue;
-            }
-            var status_1 = loadStatus[key];
-            total += status_1.loaded;
-            if (status_1.loaded !== status_1.total) {
-                loading++;
-            }
-            else {
-                loaded++;
-            }
-        }
-        ret.push(vd.h("p", "Loaded Images: " + loaded));
-        ret.push(vd.h("p", "Loading Images: " + loading));
-        ret.push(vd.h("p", "Total bytes loaded: " + total));
-        ret.push(vd.h("h2", "Camera"));
-        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
-        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
-        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
-        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
-        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
-        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
-        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
-        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
-        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
-        return ret;
-    };
-    DebugComponent.prototype._getDebugVNode = function (open, info) {
-        if (open) {
-            return vd.h("div.Debug", {}, [
-                vd.h("h2", {}, ["Debug"]),
-                this._getDebugVNodeButton(open),
-                vd.h("pre", {}, info),
-            ]);
-        }
-        else {
-            return this._getDebugVNodeButton(open);
-        }
-    };
-    DebugComponent.prototype._getDebugVNodeButton = function (open) {
-        var buttonText = open ? "Disable Debug" : "D";
-        var buttonCssClass = open ? "" : ".DebugButtonFixed";
-        if (open) {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
-        }
-        else {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
-        }
-    };
-    DebugComponent.prototype._closeDebugElement = function (open) {
-        this._open$.next(false);
-    };
-    DebugComponent.prototype._openDebugElement = function () {
-        this._open$.next(true);
-    };
-    DebugComponent.componentName = "debug";
-    return DebugComponent;
-}(Component_1.Component));
-exports.DebugComponent = DebugComponent;
-Component_1.ComponentService.register(DebugComponent);
-exports.default = DebugComponent;
-
-},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],314:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var ImageComponent = /** @class */ (function (_super) {
-    __extends(ImageComponent, _super);
-    function ImageComponent(name, container, navigator, dom) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._canvasId = container.id + "-" + _this._name;
-        _this._dom = !!dom ? dom : new Utils_1.DOM();
-        return _this;
-    }
-    ImageComponent.prototype._activate = function () {
-        var _this = this;
-        var canvasSize$ = this._container.domRenderer.element$.pipe(operators_1.map(function (element) {
-            return _this._dom.document.getElementById(_this._canvasId);
-        }), operators_1.filter(function (canvas) {
-            return !!canvas;
-        }), operators_1.map(function (canvas) {
-            var adaptableDomRenderer = canvas.parentElement;
-            var width = adaptableDomRenderer.offsetWidth;
-            var height = adaptableDomRenderer.offsetHeight;
-            return [canvas, { height: height, width: width }];
-        }), operators_1.distinctUntilChanged(function (s1, s2) {
-            return s1.height === s2.height && s1.width === s2.width;
-        }, function (_a) {
-            var canvas = _a[0], size = _a[1];
-            return size;
-        }));
-        this.drawSubscription = rxjs_1.combineLatest(canvasSize$, this._navigator.stateService.currentNode$)
-            .subscribe(function (_a) {
-            var _b = _a[0], canvas = _b[0], size = _b[1], node = _a[1];
-            canvas.width = size.width;
-            canvas.height = size.height;
-            canvas
-                .getContext("2d")
-                .drawImage(node.image, 0, 0, size.width, size.height);
-        });
-        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
-    };
-    ImageComponent.prototype._deactivate = function () {
-        this.drawSubscription.unsubscribe();
-    };
-    ImageComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImageComponent.componentName = "image";
-    return ImageComponent;
-}(Component_1.Component));
-exports.ImageComponent = ImageComponent;
-Component_1.ComponentService.register(ImageComponent);
-exports.default = ImageComponent;
-
-
-},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],315:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.LoadingComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var LoadingComponent = /** @class */ (function (_super) {
-    __extends(LoadingComponent, _super);
-    function LoadingComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    LoadingComponent.prototype._activate = function () {
-        var _this = this;
-        this._loadingSubscription = this._navigator.loadingService.loading$.pipe(operators_1.switchMap(function (loading) {
-            return loading ?
-                _this._navigator.imageLoadingService.loadstatus$ :
-                rxjs_1.of({});
-        }), operators_1.map(function (loadStatus) {
-            var total = 0;
-            var loaded = 0;
-            for (var key in loadStatus) {
-                if (!loadStatus.hasOwnProperty(key)) {
-                    continue;
-                }
-                var status_1 = loadStatus[key];
-                if (status_1.loaded !== status_1.total) {
-                    loaded += status_1.loaded;
-                    total += status_1.total;
-                }
-            }
-            var percentage = 100;
-            if (total !== 0) {
-                percentage = (loaded / total) * 100;
-            }
-            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    LoadingComponent.prototype._deactivate = function () {
-        this._loadingSubscription.unsubscribe();
-    };
-    LoadingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    LoadingComponent.prototype._getBarVNode = function (percentage) {
-        var loadingBarStyle = {};
-        var loadingContainerStyle = {};
-        if (percentage !== 100) {
-            loadingBarStyle.width = percentage.toFixed(0) + "%";
-            loadingBarStyle.opacity = "1";
-        }
-        else {
-            loadingBarStyle.width = "100%";
-            loadingBarStyle.opacity = "0";
-        }
-        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
-    };
-    LoadingComponent.componentName = "loading";
-    return LoadingComponent;
-}(Component_1.Component));
-exports.LoadingComponent = LoadingComponent;
-Component_1.ComponentService.register(LoadingComponent);
-exports.default = LoadingComponent;
-
-},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],316:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.NavigationComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var Component_1 = require("../Component");
-/**
- * @class NavigationComponent
- *
- * @classdesc Fallback navigation component for environments without WebGL support.
- *
- * Replaces the functionality in the Direction and Sequence components.
- */
-var NavigationComponent = /** @class */ (function (_super) {
-    __extends(NavigationComponent, _super);
-    /** @ignore */
-    function NavigationComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._seqNames = {};
-        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Prev]] = "Prev";
-        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Next]] = "Next";
-        _this._spaTopNames = {};
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnLeft]] = "Turnleft";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepLeft]] = "Left";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepForward]] = "Forward";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepRight]] = "Right";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnRight]] = "Turnright";
-        _this._spaBottomNames = {};
-        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnU]] = "Turnaround";
-        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepBackward]] = "Backward";
-        return _this;
-    }
-    NavigationComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._configuration$).pipe(operators_1.switchMap(function (_a) {
-            var node = _a[0], configuration = _a[1];
-            var sequenceEdges$ = configuration.sequence ?
-                node.sequenceEdges$.pipe(operators_1.map(function (status) {
-                    return status.edges
-                        .map(function (edge) {
-                        return edge.data.direction;
-                    });
-                })) :
-                rxjs_1.of([]);
-            var spatialEdges$ = !node.pano && configuration.spatial ?
-                node.spatialEdges$.pipe(operators_1.map(function (status) {
-                    return status.edges
-                        .map(function (edge) {
-                        return edge.data.direction;
-                    });
-                })) :
-                rxjs_1.of([]);
-            return rxjs_1.combineLatest(sequenceEdges$, spatialEdges$).pipe(operators_1.map(function (_a) {
-                var seq = _a[0], spa = _a[1];
-                return seq.concat(spa);
-            }));
-        }), operators_1.map(function (edgeDirections) {
-            var seqs = _this._createArrowRow(_this._seqNames, edgeDirections);
-            var spaTops = _this._createArrowRow(_this._spaTopNames, edgeDirections);
-            var spaBottoms = _this._createArrowRow(_this._spaBottomNames, edgeDirections);
-            var seqContainer = vd.h("div.NavigationSequence", seqs);
-            var spaTopContainer = vd.h("div.NavigationSpatialTop", spaTops);
-            var spaBottomContainer = vd.h("div.NavigationSpatialBottom", spaBottoms);
-            var spaContainer = vd.h("div.NavigationSpatial", [spaTopContainer, spaBottomContainer]);
-            return { name: _this._name, vnode: vd.h("div.NavigationContainer", [seqContainer, spaContainer]) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    NavigationComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    NavigationComponent.prototype._getDefaultConfiguration = function () {
-        return { sequence: true, spatial: true };
-    };
-    NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) {
-        var arrows = [];
-        for (var arrowName in arrowNames) {
-            if (!(arrowNames.hasOwnProperty(arrowName))) {
-                continue;
-            }
-            var direction = Edge_1.EdgeDirection[arrowName];
-            if (edgeDirections.indexOf(direction) !== -1) {
-                arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible"));
-            }
-            else {
-                arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden"));
-            }
-        }
-        return arrows;
-    };
-    NavigationComponent.prototype._createVNode = function (direction, name, visibility) {
-        var _this = this;
-        return vd.h("span.Direction.Direction" + name, {
-            onclick: function (ev) {
-                _this._navigator.moveDir$(direction)
-                    .subscribe(undefined, function (error) {
-                    if (!(error instanceof Error_1.AbortMapillaryError)) {
-                        console.error(error);
-                    }
-                });
-            },
-            style: {
-                visibility: visibility,
-            },
-        }, []);
-    };
-    NavigationComponent.componentName = "navigation";
-    return NavigationComponent;
-}(Component_1.Component));
-exports.NavigationComponent = NavigationComponent;
-Component_1.ComponentService.register(NavigationComponent);
-exports.default = NavigationComponent;
-
-},{"../Component":291,"../Edge":292,"../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],317:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RouteComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var DescriptionState = /** @class */ (function () {
-    function DescriptionState() {
-    }
-    return DescriptionState;
-}());
-var RouteState = /** @class */ (function () {
-    function RouteState() {
-    }
-    return RouteState;
-}());
-var RouteTrack = /** @class */ (function () {
-    function RouteTrack() {
-        this.nodeInstructions = [];
-        this.nodeInstructionsOrdered = [];
-    }
-    return RouteTrack;
-}());
-var RouteComponent = /** @class */ (function (_super) {
-    __extends(RouteComponent, _super);
-    function RouteComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    RouteComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    RouteComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    RouteComponent.prototype._activate = function () {
-        var _this = this;
-        var slowedStream$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return (frame.id % 2) === 0;
-        }), operators_1.filter(function (frame) {
-            return frame.state.nodesAhead < 15;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        }));
-        var routeTrack$ = rxjs_1.combineLatest(this.configuration$.pipe(operators_1.mergeMap(function (conf) {
-            return rxjs_1.from(conf.paths);
-        }), operators_1.distinct(function (p) {
-            return p.sequenceKey;
-        }), operators_1.mergeMap(function (path) {
-            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]).pipe(operators_1.map(function (sequenceByKey) {
-                return sequenceByKey[path.sequenceKey];
-            }));
-        })), this.configuration$).pipe(operators_1.map(function (_a) {
-            var sequence = _a[0], conf = _a[1];
-            var i = 0;
-            var instructionPlaces = [];
-            for (var _i = 0, _b = conf.paths; _i < _b.length; _i++) {
-                var path = _b[_i];
-                if (path.sequenceKey === sequence.key) {
-                    var nodeInstructions = [];
-                    var saveKey = false;
-                    for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                        var key = _d[_c];
-                        if (path.startKey === key) {
-                            saveKey = true;
-                        }
-                        if (saveKey) {
-                            var description = null;
-                            for (var _e = 0, _f = path.infoKeys; _e < _f.length; _e++) {
-                                var infoKey = _f[_e];
-                                if (infoKey.key === key) {
-                                    description = infoKey.description;
-                                }
-                            }
-                            nodeInstructions.push({ description: description, key: key });
-                        }
-                        if (path.stopKey === key) {
-                            saveKey = false;
-                        }
-                    }
-                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
-                }
-                i++;
-            }
-            return instructionPlaces;
-        }), operators_1.scan(function (routeTrack, instructionPlaces) {
-            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
-                var instructionPlace = instructionPlaces_1[_i];
-                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
-            }
-            for (var place in routeTrack.nodeInstructionsOrdered) {
-                if (!routeTrack.nodeInstructionsOrdered.hasOwnProperty(place)) {
-                    continue;
-                }
-                var instructionGroup = routeTrack.nodeInstructionsOrdered[place];
-                for (var _a = 0, instructionGroup_1 = instructionGroup; _a < instructionGroup_1.length; _a++) {
-                    var instruction = instructionGroup_1[_a];
-                    routeTrack.nodeInstructions.push(instruction);
-                }
-            }
-            return routeTrack;
-        }, new RouteTrack()));
-        var cacheNode$ = rxjs_1.combineLatest(slowedStream$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], routeTrack = _a[1], conf = _a[2];
-            return { conf: conf, frame: frame, routeTrack: routeTrack };
-        }), operators_1.scan(function (routeState, rtAndFrame) {
-            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
-                routeState.routeTrack = rtAndFrame.routeTrack;
-                routeState.currentNode = rtAndFrame.frame.state.currentNode;
-                routeState.lastNode = rtAndFrame.frame.state.lastNode;
-                routeState.playing = true;
-            }
-            else {
-                _this._navigator.stateService.cutNodes();
-                routeState.playing = false;
-            }
-            return routeState;
-        }, new RouteState()), operators_1.filter(function (routeState) {
-            return routeState.playing;
-        }), operators_1.filter(function (routeState) {
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (!nodeInstruction) {
-                    continue;
-                }
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    return true;
-                }
-            }
-            return false;
-        }), operators_1.distinctUntilChanged(undefined, function (routeState) {
-            return routeState.lastNode.key;
-        }), operators_1.mergeMap(function (routeState) {
-            var i = 0;
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    break;
-                }
-                i++;
-            }
-            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
-            if (!nextInstruction) {
-                return rxjs_1.of(null);
-            }
-            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
-        }));
-        this._disposable = rxjs_1.combineLatest(cacheNode$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], conf = _a[1];
-            return { conf: conf, node: node };
-        }), operators_1.filter(function (cAN) {
-            return cAN.node !== null && cAN.conf.playing;
-        }), operators_1.pluck("node"))
-            .subscribe(this._navigator.stateService.appendNode$);
-        this._disposableDescription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], routeTrack = _a[1], conf = _a[2];
-            if (conf.playing !== undefined && !conf.playing) {
-                return "quit";
-            }
-            var description = null;
-            for (var _i = 0, _b = routeTrack.nodeInstructions; _i < _b.length; _i++) {
-                var nodeInstruction = _b[_i];
-                if (nodeInstruction.key === node.key) {
-                    description = nodeInstruction.description;
-                    break;
-                }
-            }
-            return description;
-        }), operators_1.scan(function (descriptionState, description) {
-            if (description !== descriptionState.description && description !== null) {
-                descriptionState.description = description;
-                descriptionState.showsLeft = 6;
-            }
-            else {
-                descriptionState.showsLeft--;
-            }
-            if (description === "quit") {
-                descriptionState.description = null;
-            }
-            return descriptionState;
-        }, new DescriptionState()), operators_1.map(function (descriptionState) {
-            if (descriptionState.showsLeft > 0 && descriptionState.description) {
-                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
-            }
-            else {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    RouteComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._disposableDescription.unsubscribe();
-    };
-    RouteComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
-        return vd.h("div.RouteFrame", {}, [
-            vd.h("p", { textContent: description }, []),
-        ]);
-    };
-    RouteComponent.componentName = "route";
-    return RouteComponent;
-}(Component_1.Component));
-exports.RouteComponent = RouteComponent;
-Component_1.ComponentService.register(RouteComponent);
-exports.default = RouteComponent;
-
-},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],318:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.StatsComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../Component");
-var StatsComponent = /** @class */ (function (_super) {
-    __extends(StatsComponent, _super);
-    function StatsComponent(name, container, navigator, scheduler) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._scheduler = scheduler;
-        return _this;
-    }
-    StatsComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.scan(function (keys, node) {
-            var sKey = node.sequenceKey;
-            keys.report = [];
-            if (!(sKey in keys.reported)) {
-                keys.report = [sKey];
-                keys.reported[sKey] = true;
-            }
-            return keys;
-        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
-            return keys.report.length > 0;
-        }), operators_1.mergeMap(function (keys) {
-            return _this._navigator.apiV3.sequenceViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to report sequence stats (" + keys.report + ")", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-        this._imageSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-            return node.key;
-        })).pipe(operators_1.buffer(this._navigator.stateService.currentNode$.pipe(operators_1.debounceTime(5000, this._scheduler))), operators_1.scan(function (keys, newKeys) {
-            keys.report = [];
-            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
-                var key = newKeys_1[_i];
-                if (!(key in keys.reported)) {
-                    keys.report.push(key);
-                    keys.reported[key] = true;
-                }
-            }
-            return keys;
-        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
-            return keys.report.length > 0;
-        }), operators_1.mergeMap(function (keys) {
-            return _this._navigator.apiV3.imageViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to report image stats (" + keys.report + ")", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-    };
-    StatsComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._imageSubscription.unsubscribe();
-    };
-    StatsComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    StatsComponent.componentName = "stats";
-    return StatsComponent;
-}(Component_1.Component));
-exports.StatsComponent = StatsComponent;
-Component_1.ComponentService.register(StatsComponent);
-exports.default = StatsComponent;
-
-},{"../Component":291,"rxjs":43,"rxjs/operators":241}],319:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DirectionComponent = void 0;
-var vd = require("virtual-dom");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * @class DirectionComponent
- * @classdesc Component showing navigation arrows for steps and turns.
- */
-var DirectionComponent = /** @class */ (function (_super) {
-    __extends(DirectionComponent, _super);
-    function DirectionComponent(name, container, navigator, directionDOMRenderer) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._renderer = !!directionDOMRenderer ?
-            directionDOMRenderer :
-            new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, { height: container.element.offsetHeight, width: container.element.offsetWidth });
-        _this._hoveredKeySubject$ = new rxjs_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
-        return _this;
-    }
-    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Set highlight key.
-     *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
-     *
-     * @param {string} highlightKey Key of node to be highlighted if existing
-     * among arrows.
-     */
-    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
-    /**
-     * Set min width of container element.
-     *
-     * @description  Set min width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    DirectionComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
-    };
-    /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
-    };
-    DirectionComponent.prototype._activate = function () {
-        var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            _this._renderer.setConfiguration(configuration);
-        });
-        this._resizeSubscription = this._container.renderService.size$
-            .subscribe(function (size) {
-            _this._renderer.resize(size);
-        });
-        this._nodeSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.tap(function (node) {
-            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
-            _this._renderer.setNode(node);
-        }), operators_1.withLatestFrom(this._configuration$), operators_1.switchMap(function (_a) {
-            var node = _a[0], configuration = _a[1];
-            return rxjs_1.combineLatest(node.spatialEdges$, configuration.distinguishSequence ?
-                _this._navigator.graphService
-                    .cacheSequence$(node.sequenceKey).pipe(operators_1.catchError(function (error, caught) {
-                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
-                    return rxjs_1.of(null);
-                })) :
-                rxjs_1.of(null));
-        }))
-            .subscribe(function (_a) {
-            var edgeStatus = _a[0], sequence = _a[1];
-            _this._renderer.setEdges(edgeStatus, sequence);
-        });
-        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$.pipe(operators_1.tap(function (renderCamera) {
-            _this._renderer.setRenderCamera(renderCamera);
-        }), operators_1.map(function () {
-            return _this._renderer;
-        }), operators_1.filter(function (renderer) {
-            return renderer.needsRender;
-        }), operators_1.map(function (renderer) {
-            return { name: _this._name, vnode: renderer.render(_this._navigator) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._hoveredKeySubscription = rxjs_1.combineLatest(this._container.domRenderer.element$, this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$.pipe(operators_1.startWith(null)), this._container.mouseService.mouseUp$.pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
-            var element = _a[0];
-            var elements = element.getElementsByClassName("DirectionsPerspective");
-            for (var i = 0; i < elements.length; i++) {
-                var hovered = elements.item(i).querySelector(":hover");
-                if (hovered != null && hovered.hasAttribute("data-key")) {
-                    return hovered.getAttribute("data-key");
-                }
-            }
-            return null;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(this._hoveredKeySubject$);
-        this._emitHoveredKeySubscription = this._hoveredKey$
-            .subscribe(function (key) {
-            _this.fire(DirectionComponent.hoveredkeychanged, key);
-        });
-    };
-    DirectionComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._emitHoveredKeySubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this._renderCameraSubscription.unsubscribe();
-    };
-    DirectionComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            distinguishSequence: false,
-            maxWidth: 460,
-            minWidth: 260,
-        };
-    };
-    /** @inheritdoc */
-    DirectionComponent.componentName = "direction";
-    /**
-     * Event fired when the hovered key changes.
-     *
-     * @description Emits the key of the node for the direction
-     * arrow that is being hovered. When the mouse leaves a
-     * direction arrow null is emitted.
-     *
-     * @event DirectionComponent#hoveredkeychanged
-     * @type {string} The hovered key, null if no key is hovered.
-     */
-    DirectionComponent.hoveredkeychanged = "hoveredkeychanged";
-    return DirectionComponent;
-}(Component_1.Component));
-exports.DirectionComponent = DirectionComponent;
-Component_1.ComponentService.register(DirectionComponent);
-exports.default = DirectionComponent;
-
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],320:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DirectionDOMCalculator = void 0;
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMCalculator
- * @classdesc Helper class for calculating DOM CSS properties.
- */
-var DirectionDOMCalculator = /** @class */ (function () {
-    function DirectionDOMCalculator(configuration, size) {
-        this._spatial = new Geo_1.Spatial();
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._configure(configuration);
-        this._resize(size);
-        this._reset();
-    }
-    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
-        get: function () {
-            return this._minWidth;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
-        get: function () {
-            return this._maxWidth;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
-        get: function () {
-            return this._containerWidth;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
-        get: function () {
-            return this._containerWidthCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
-        get: function () {
-            return this._containerMarginCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
-        get: function () {
-            return this._containerLeftCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
-        get: function () {
-            return this._containerHeight;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
-        get: function () {
-            return this._containerHeightCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
-        get: function () {
-            return this._containerBottomCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
-        get: function () {
-            return this._stepCircleSize;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
-        get: function () {
-            return this._stepCircleSizeCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
-        get: function () {
-            return this._stepCircleMarginCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
-        get: function () {
-            return this._turnCircleSize;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
-        get: function () {
-            return this._turnCircleSizeCss;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
-        get: function () {
-            return this._outerRadius;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
-        get: function () {
-            return this._innerRadius;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
-        get: function () {
-            return this._shadowOffset;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Configures the min and max width values.
-     *
-     * @param {IDirectionConfiguration} configuration Configuration
-     * with min and max width values.
-     */
-    DirectionDOMCalculator.prototype.configure = function (configuration) {
-        this._configure(configuration);
-        this._reset();
-    };
-    /**
-     * Resizes all properties according to the width and height
-     * of the size object.
-     *
-     * @param {ISize} size The size of the container element.
-     */
-    DirectionDOMCalculator.prototype.resize = function (size) {
-        this._resize(size);
-        this._reset();
-    };
-    /**
-     * Calculates the coordinates on the unit circle for an angle.
-     *
-     * @param {number} angle Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle.
-     */
-    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
-        return [Math.cos(angle), Math.sin(angle)];
-    };
-    /**
-     * Calculates the coordinates on the unit circle for the
-     * relative angle between the first and second angle.
-     *
-     * @param {number} first Angle in radians.
-     * @param {number} second Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle
-     * for the relative angle between the first and second angle.
-     */
-    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
-        var relativeAngle = this._spatial.wrapAngle(first - second);
-        return this.angleToCoordinates(relativeAngle);
-    };
-    DirectionDOMCalculator.prototype._configure = function (configuration) {
-        this._minWidth = configuration.minWidth;
-        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
-    };
-    DirectionDOMCalculator.prototype._resize = function (size) {
-        this._elementWidth = size.width;
-        this._elementHeight = size.height;
-    };
-    DirectionDOMCalculator.prototype._reset = function () {
-        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
-        this._containerHeight = this._getContainerHeight(this.containerWidth);
-        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
-        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
-        this._outerRadius = this._getOuterRadius(this._containerHeight);
-        this._innerRadius = this._getInnerRadius(this._containerHeight);
-        this._shadowOffset = 3;
-        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
-        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
-        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
-        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
-        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
-        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
-        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
-        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
-    };
-    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        coeff = 0.04 * Math.round(25 * coeff);
-        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
-    };
-    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
-        return 0.77 * containerWidth;
-    };
-    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
-        return 0.34 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
-        return 0.3 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
-        return 0.31 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
-        return 0.125 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
-        return value + "px";
-    };
-    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
-        return value > minWidth ? value : minWidth;
-    };
-    return DirectionDOMCalculator;
-}());
-exports.DirectionDOMCalculator = DirectionDOMCalculator;
-exports.default = DirectionDOMCalculator;
-
-
-},{"../../Geo":294}],321:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DirectionDOMRenderer = void 0;
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMRenderer
- * @classdesc DOM renderer for direction arrows.
- */
-var DirectionDOMRenderer = /** @class */ (function () {
-    function DirectionDOMRenderer(configuration, size) {
-        this._isEdge = false;
-        this._spatial = new Geo_1.Spatial();
-        this._calculator = new Component_1.DirectionDOMCalculator(configuration, size);
-        this._node = null;
-        this._rotation = { phi: 0, theta: 0 };
-        this._epsilon = 0.5 * Math.PI / 180;
-        this._highlightKey = null;
-        this._distinguishSequence = false;
-        this._needsRender = false;
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        this._stepDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-        ];
-        this._turnDirections = [
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        this._turnNames = {};
-        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
-        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
-        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
-        // detects IE 8-11, then Edge 20+.
-        var isIE = !!document.documentMode;
-        this._isEdge = !isIE && !!window.StyleMedia;
-    }
-    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
-        /**
-         * Get needs render.
-         *
-         * @returns {boolean} Value indicating whether render should be called.
-         */
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Renders virtual DOM elements.
-     *
-     * @description Calling render resets the needs render property.
-     */
-    DirectionDOMRenderer.prototype.render = function (navigator) {
-        this._needsRender = false;
-        var rotation = this._rotation;
-        var steps = [];
-        var turns = [];
-        if (this._node.pano) {
-            steps = steps.concat(this._createPanoArrows(navigator, rotation));
-        }
-        else {
-            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
-            steps = steps.concat(this._createStepArrows(navigator, rotation));
-            turns = turns.concat(this._createTurnArrows(navigator));
-        }
-        return this._getContainer(steps, turns, rotation);
-    };
-    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
-        this._setEdges(edgeStatus, sequence);
-        this._setNeedsRender();
-    };
-    /**
-     * Set node for which to show edges.
-     *
-     * @param {Node} node
-     */
-    DirectionDOMRenderer.prototype.setNode = function (node) {
-        this._node = node;
-        this._clearEdges();
-        this._setNeedsRender();
-    };
-    /**
-     * Set the render camera to use for calculating rotations.
-     *
-     * @param {RenderCamera} renderCamera
-     */
-    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
-        var rotation = renderCamera.rotation;
-        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
-            return;
-        }
-        this._rotation = rotation;
-        this._setNeedsRender();
-    };
-    /**
-     * Set configuration values.
-     *
-     * @param {IDirectionConfiguration} configuration
-     */
-    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
-        var needsRender = false;
-        if (this._highlightKey !== configuration.highlightKey ||
-            this._distinguishSequence !== configuration.distinguishSequence) {
-            this._highlightKey = configuration.highlightKey;
-            this._distinguishSequence = configuration.distinguishSequence;
-            needsRender = true;
-        }
-        if (this._calculator.minWidth !== configuration.minWidth ||
-            this._calculator.maxWidth !== configuration.maxWidth) {
-            this._calculator.configure(configuration);
-            needsRender = true;
-        }
-        if (needsRender) {
-            this._setNeedsRender();
-        }
-    };
-    /**
-     * Detect the element's width and height and resize
-     * elements accordingly.
-     *
-     * @param {ISize} size Size of vßiewer container element.
-     */
-    DirectionDOMRenderer.prototype.resize = function (size) {
-        this._calculator.resize(size);
-        this._setNeedsRender();
-    };
-    DirectionDOMRenderer.prototype._setNeedsRender = function () {
-        if (this._node != null) {
-            this._needsRender = true;
-        }
-    };
-    DirectionDOMRenderer.prototype._clearEdges = function () {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-    };
-    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            var direction = edge.data.direction;
-            if (this._stepDirections.indexOf(direction) > -1) {
-                this._stepEdges.push(edge);
-                continue;
-            }
-            if (this._turnDirections.indexOf(direction) > -1) {
-                this._turnEdges.push(edge);
-                continue;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
-                this._panoEdges.push(edge);
-            }
-        }
-        if (this._distinguishSequence && sequence != null) {
-            var edges = this._panoEdges
-                .concat(this._stepEdges)
-                .concat(this._turnEdges);
-            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
-                var edge = edges_1[_b];
-                var edgeKey = edge.to;
-                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                    var sequenceKey = _d[_c];
-                    if (sequenceKey === edgeKey) {
-                        this._sequenceEdgeKeys.push(edgeKey);
-                        break;
-                    }
-                }
-            }
-        }
-    };
-    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
-        }
-        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
-            var stepEdge = _c[_b];
-            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
-        var threshold = Math.PI / 8;
-        var relativePhi = rotation.phi;
-        switch (direction) {
-            case Edge_1.EdgeDirection.StepBackward:
-                relativePhi = rotation.phi - Math.PI;
-                break;
-            case Edge_1.EdgeDirection.StepLeft:
-                relativePhi = rotation.phi + Math.PI / 2;
-                break;
-            case Edge_1.EdgeDirection.StepRight:
-                relativePhi = rotation.phi - Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
-            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
-        }
-        return this._createVNodeDisabled(key, azimuth, rotation);
-    };
-    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
-            var stepEdge = _a[_i];
-            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
-        var turns = [];
-        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
-            var turnEdge = _a[_i];
-            var direction = turnEdge.data.direction;
-            var name_1 = this._turnNames[direction];
-            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
-        }
-        return turns;
-    };
-    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
-        var onClick = function (e) {
-            navigator.moveToKey$(key)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
-    };
-    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
-    };
-    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        var style = {
-            height: this._calculator.turnCircleSizeCss,
-            transform: "rotate(0)",
-            width: this._calculator.turnCircleSizeCss,
-        };
-        switch (direction) {
-            case Edge_1.EdgeDirection.TurnLeft:
-                style.left = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnRight:
-                style.right = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnU:
-                style.left = "5px";
-                style.bottom = "5px";
-                break;
-            default:
-                break;
-        }
-        var circleProperties = {
-            attributes: {
-                "data-key": key,
-            },
-            onclick: onClick,
-            style: style,
-        };
-        var circleClassName = "TurnCircle";
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        var turn = vd.h("div." + className, {}, []);
-        return vd.h("div." + circleClassName, circleProperties, [turn]);
-    };
-    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
-    };
-    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
-        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
-        // rotate 90 degrees clockwise and flip over X-axis
-        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
-        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
-        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
-        var shadowOffset = this._calculator.shadowOffset;
-        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
-        var shadowTranslationY = shadowOffset * shadowTranslation[0];
-        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
-        var properties = {
-            style: {
-                "-webkit-filter": filter,
-                filter: filter,
-            },
-        };
-        var chevron = vd.h("div." + className, properties, []);
-        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
-        var circleTransform = shiftVertically ?
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
-        var circleProperties = {
-            attributes: { "data-key": key },
-            onclick: onClick,
-            style: {
-                height: this._calculator.stepCircleSizeCss,
-                marginLeft: this._calculator.stepCircleMarginCss,
-                marginTop: this._calculator.stepCircleMarginCss,
-                transform: circleTransform,
-                width: this._calculator.stepCircleSizeCss,
-            },
-        };
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        return vd.h("div." + circleClassName, circleProperties, [chevron]);
-    };
-    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
-        // edge does not handle hover on perspective transforms.
-        var transform = this._isEdge ?
-            "rotateX(60deg)" :
-            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
-        var properties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: {
-                bottom: this._calculator.containerBottomCss,
-                height: this._calculator.containerHeightCss,
-                left: this._calculator.containerLeftCss,
-                marginLeft: this._calculator.containerMarginCss,
-                transform: transform,
-                width: this._calculator.containerWidthCss,
-            },
-        };
-        return vd.h("div.DirectionsPerspective", properties, turns.concat(steps));
-    };
-    return DirectionDOMRenderer;
-}());
-exports.DirectionDOMRenderer = DirectionDOMRenderer;
-exports.default = DirectionDOMRenderer;
-
-
-},{"../../Component":291,"../../Edge":292,"../../Error":293,"../../Geo":294,"virtual-dom":247}],322:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImagePlaneComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Viewer_1 = require("../../Viewer");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-var ViewportCoords_1 = require("../../geo/ViewportCoords");
-var Spatial_1 = require("../../geo/Spatial");
-var ImagePlaneComponent = /** @class */ (function (_super) {
-    __extends(ImagePlaneComponent, _super);
-    function ImagePlaneComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
-        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
-        _this._rendererOperation$ = new rxjs_1.Subject();
-        _this._rendererCreator$ = new rxjs_1.Subject();
-        _this._rendererDisposer$ = new rxjs_1.Subject();
-        _this._renderer$ = _this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
-            return operation(renderer);
-        }, null), operators_1.filter(function (renderer) {
-            return renderer != null;
-        }), operators_1.distinctUntilChanged(undefined, function (renderer) {
-            return renderer.frameId;
-        }));
-        _this._rendererCreator$.pipe(operators_1.map(function () {
-            return function (renderer) {
-                if (renderer != null) {
-                    throw new Error("Multiple image plane states can not be created at the same time");
-                }
-                return new Component_1.ImagePlaneGLRenderer();
-            };
-        }))
-            .subscribe(_this._rendererOperation$);
-        _this._rendererDisposer$.pipe(operators_1.map(function () {
-            return function (renderer) {
-                renderer.dispose();
-                return null;
-            };
-        }))
-            .subscribe(_this._rendererOperation$);
-        return _this;
-    }
-    ImagePlaneComponent.prototype._activate = function () {
-        var _this = this;
-        this._rendererSubscription = this._renderer$.pipe(operators_1.map(function (renderer) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: renderer.frameId,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            renderer.clearNeedsRender();
-            return renderHash;
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        this._rendererCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return function (renderer) {
-                renderer.updateFrame(frame);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return roiTrigger$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, transform, camera.perspective);
-                if (basic[0] < 0 || basic[1] < 0 || basic[0] > 1 || basic[1] > 1) {
-                    return undefined;
-                }
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }), operators_1.filter(function (args) {
-                return !!args;
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }))
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
-        });
-        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._clearPeripheryPlaneSubscription = this._navigator.panService.panNodes$.pipe(operators_1.filter(function (panNodes) {
-            return panNodes.length === 0;
-        }), operators_1.map(function () {
-            return function (renderer) {
-                renderer.clearPeripheryPlanes();
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var cachedPanNodes$ = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
-            return rxjs_1.from(nts).pipe(operators_1.mergeMap(function (_a) {
-                var n = _a[0], t = _a[1];
-                return rxjs_1.combineLatest(_this._navigator.graphService.cacheNode$(n.key).pipe(operators_1.catchError(function (error) {
-                    console.error("Failed to cache periphery node (" + n.key + ")", error);
-                    return rxjs_1.empty();
-                })), rxjs_1.of(t));
-            }));
-        }), operators_1.share());
-        this._addPeripheryPlaneSubscription = cachedPanNodes$.pipe(operators_1.map(function (_a) {
-            var n = _a[0], t = _a[1];
-            return function (renderer) {
-                renderer.addPeripheryPlane(n, t);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._updatePeripheryPlaneTextureSubscription = cachedPanNodes$.pipe(operators_1.mergeMap(function (_a) {
-            var n = _a[0];
-            return Viewer_1.ImageSize.Size2048 > Math.max(n.image.width, n.image.height) ?
-                n.cacheImage$(Viewer_1.ImageSize.Size2048).pipe(operators_1.catchError(function () {
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }), operators_1.map(function (n) {
-            return function (renderer) {
-                renderer.updateTextureImage(n.image, n);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.alpha < 1;
-        }), operators_1.distinctUntilChanged());
-        var panTrigger$ = rxjs_1.combineLatest(this._container.mouseService.active$, this._container.touchService.active$, this._navigator.stateService.inMotion$, inTransition$).pipe(operators_1.map(function (_a) {
-            var mouseActive = _a[0], touchActive = _a[1], inMotion = _a[2], inTransition = _a[3];
-            return !(mouseActive || touchActive || inMotion || inTransition);
-        }), operators_1.filter(function (trigger) {
-            return trigger;
-        }));
-        this._moveToPeripheryNodeSubscription = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
-            return panTrigger$.pipe(operators_1.withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentNode$, _this._navigator.stateService.currentTransform$), operators_1.mergeMap(function (_a) {
-                var renderCamera = _a[1], currentNode = _a[2], currentTransform = _a[3];
-                return rxjs_1.of([
-                    renderCamera,
-                    currentNode,
-                    currentTransform,
-                    nts,
-                ]);
-            }));
-        }), operators_1.switchMap(function (_a) {
-            var camera = _a[0], cn = _a[1], ct = _a[2], nts = _a[3];
-            var direction = camera.camera.lookat.clone().sub(camera.camera.position);
-            var cd = new Spatial_1.default().viewingDirection(cn.rotation);
-            var ca = cd.angleTo(direction);
-            var closest = [ca, undefined];
-            var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, ct, camera.perspective);
-            if (basic[0] >= 0 && basic[0] <= 1 && basic[1] >= 0 && basic[1] <= 1) {
-                closest[0] = Number.NEGATIVE_INFINITY;
-            }
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var n = nts_1[_i][0];
-                var d = new Spatial_1.default().viewingDirection(n.rotation);
-                var a = d.angleTo(direction);
-                if (a < closest[0]) {
-                    closest[0] = a;
-                    closest[1] = n.key;
-                }
-            }
-            if (!closest[1]) {
-                return rxjs_1.empty();
-            }
-            return _this._navigator.moveToKey$(closest[1]).pipe(operators_1.catchError(function () {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-    };
-    ImagePlaneComponent.prototype._deactivate = function () {
-        this._rendererDisposer$.next(null);
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._rendererSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._setTileSizeSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
-        this._clearPeripheryPlaneSubscription.unsubscribe();
-        this._addPeripheryPlaneSubscription.unsubscribe();
-        this._updatePeripheryPlaneTextureSubscription.unsubscribe();
-        this._moveToPeripheryNodeSubscription.unsubscribe();
-    };
-    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImagePlaneComponent.componentName = "imagePlane";
-    return ImagePlaneComponent;
-}(Component_1.Component));
-exports.ImagePlaneComponent = ImagePlaneComponent;
-Component_1.ComponentService.register(ImagePlaneComponent);
-exports.default = ImagePlaneComponent;
-
-},{"../../Component":291,"../../Render":297,"../../Tiles":300,"../../Utils":301,"../../Viewer":302,"../../geo/Spatial":419,"../../geo/ViewportCoords":421,"rxjs":43,"rxjs/operators":241}],323:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImagePlaneGLRenderer = void 0;
-var Component_1 = require("../../Component");
-var ImagePlaneGLRenderer = /** @class */ (function () {
-    function ImagePlaneGLRenderer() {
-        this._factory = new Component_1.MeshFactory();
-        this._scene = new Component_1.MeshScene();
-        this._alpha = 0;
-        this._alphaOld = 0;
-        this._fadeOutSpeed = 0.05;
-        this._currentKey = null;
-        this._previousKey = null;
-        this._providerDisposers = {};
-        this._frameId = 0;
-        this._needsRender = false;
-    }
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.addPeripheryPlane = function (node, transform) {
-        var mesh = this._factory.createMesh(node, transform);
-        var planes = {};
-        planes[node.key] = mesh;
-        this._scene.addPeripheryPlanes(planes);
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.clearPeripheryPlanes = function () {
-        this._scene.setPeripheryPlanes({});
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
-        this._updateFrameId(frame.id);
-        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
-    };
-    ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) {
-        var _this = this;
-        if (key !== this._currentKey) {
-            return;
-        }
-        var createdSubscription = provider.textureCreated$
-            .subscribe(function (texture) {
-            _this._updateTexture(texture);
-        });
-        var updatedSubscription = provider.textureUpdated$
-            .subscribe(function (updated) {
-            _this._needsRender = true;
-        });
-        var dispose = function () {
-            createdSubscription.unsubscribe();
-            updatedSubscription.unsubscribe();
-            provider.dispose();
-        };
-        if (key in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[key];
-            disposeProvider();
-            delete this._providerDisposers[key];
-        }
-        this._providerDisposers[key] = dispose;
-    };
-    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
-        this._needsRender = true;
-        var planes = this._extend({}, this._scene.planes, this._scene.planesOld, this._scene.planesPeriphery);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            if (key !== node.key) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        var planes = this._scene.planes;
-        var planesOld = this._scene.planesOld;
-        var planesPeriphery = this._scene.planesPeriphery;
-        var planeAlpha = Object.keys(planesOld).length ? 1 : this._alpha;
-        var peripheryAlpha = Object.keys(planesOld).length ? 1 : Math.floor(this._alpha);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            plane.material.uniforms.opacity.value = planeAlpha;
-        }
-        for (var key in planesOld) {
-            if (!planesOld.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planesOld[key];
-            plane.material.uniforms.opacity.value = this._alphaOld;
-        }
-        for (var key in planesPeriphery) {
-            if (!planesPeriphery.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planesPeriphery[key];
-            plane.material.uniforms.opacity.value = peripheryAlpha;
-        }
-        renderer.render(this._scene.scenePeriphery, perspectiveCamera);
-        renderer.render(this._scene.scene, perspectiveCamera);
-        renderer.render(this._scene.sceneOld, perspectiveCamera);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            plane.material.uniforms.opacity.value = this._alpha;
-        }
-        renderer.render(this._scene.scene, perspectiveCamera);
-    };
-    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
-        this._needsRender = false;
-    };
-    ImagePlaneGLRenderer.prototype.dispose = function () {
-        this._scene.clear();
-    };
-    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
-    };
-    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
-        if (alpha === this._alpha) {
-            return false;
-        }
-        this._alpha = alpha;
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
-        if (alpha < 1 || this._alphaOld === 0) {
-            return false;
-        }
-        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
-            return false;
-        }
-        var previousKey = state.previousNode != null ? state.previousNode.key : null;
-        var currentKey = state.currentNode.key;
-        if (this._previousKey !== previousKey &&
-            this._previousKey !== currentKey &&
-            this._previousKey in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[this._previousKey];
-            disposeProvider();
-            delete this._providerDisposers[this._previousKey];
-        }
-        if (previousKey != null) {
-            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {
-                var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform);
-                var previousPlanes = {};
-                previousPlanes[previousKey] = previousMesh;
-                this._scene.updateImagePlanes(previousPlanes);
-            }
-            this._previousKey = previousKey;
-        }
-        this._currentKey = currentKey;
-        var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform);
-        var planes = {};
-        planes[currentKey] = currentMesh;
-        this._scene.updateImagePlanes(planes);
-        this._alphaOld = 1;
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateTexture = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    ImagePlaneGLRenderer.prototype._extend = function (dest) {
-        var sources = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            sources[_i - 1] = arguments[_i];
-        }
-        for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
-            var src = sources_1[_a];
-            for (var k in src) {
-                if (!src.hasOwnProperty(k)) {
-                    continue;
-                }
-                dest[k] = src[k];
-            }
-        }
-        return dest;
-    };
-    return ImagePlaneGLRenderer;
-}());
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
-exports.default = ImagePlaneGLRenderer;
-
-},{"../../Component":291}],324:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],325:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CoverState = void 0;
-var CoverState;
-(function (CoverState) {
-    CoverState[CoverState["Hidden"] = 0] = "Hidden";
-    CoverState[CoverState["Loading"] = 1] = "Loading";
-    CoverState[CoverState["Visible"] = 2] = "Visible";
-})(CoverState = exports.CoverState || (exports.CoverState = {}));
-
-},{}],326:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SliderMode = void 0;
-/**
- * Enumeration for slider mode.
- *
- * @enum {number}
- * @readonly
- *
- * @description Modes for specifying how transitions
- * between nodes are performed in slider mode. Only
- * applicable when the slider component determines
- * that transitions with motion is possilble. When it
- * is not, the stationary mode will be applied.
- */
-var SliderMode;
-(function (SliderMode) {
-    /**
-     * Transitions with motion.
-     *
-     * @description The slider component moves the
-     * camera between the node origins.
-     *
-     * In this mode it is not possible to zoom or pan.
-     *
-     * The slider component falls back to stationary
-     * mode when it determines that the pair of nodes
-     * does not have a strong enough relation.
-     */
-    SliderMode[SliderMode["Motion"] = 0] = "Motion";
-    /**
-     * Stationary transitions.
-     *
-     * @description The camera is stationary.
-     *
-     * In this mode it is possible to zoom and pan.
-     */
-    SliderMode[SliderMode["Stationary"] = 1] = "Stationary";
-})(SliderMode = exports.SliderMode || (exports.SliderMode = {}));
-
-},{}],327:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var ICoverConfiguration_1 = require("./ICoverConfiguration");
-Object.defineProperty(exports, "CoverState", { enumerable: true, get: function () { return ICoverConfiguration_1.CoverState; } });
-var ISliderConfiguration_1 = require("./ISliderConfiguration");
-Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return ISliderConfiguration_1.SliderMode; } });
-__exportStar(require("../imageplane/interfaces/interfaces"), exports);
-__exportStar(require("../marker/interfaces/interfaces"), exports);
-__exportStar(require("../spatialdata/interfaces/interfaces"), exports);
-__exportStar(require("../tag/interfaces/interfaces"), exports);
-
-},{"../imageplane/interfaces/interfaces":324,"../marker/interfaces/interfaces":337,"../spatialdata/interfaces/interfaces":365,"../tag/interfaces/interfaces":390,"./ICoverConfiguration":325,"./ISliderConfiguration":326}],328:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeyPlayHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-/**
- * The `KeyPlayHandler` allows the user to control the play behavior
- * using the following key commands:
- *
- * `Spacebar`: Start or stop playing.
- * `SHIFT` + `D`: Switch direction.
- * `<`: Decrease speed.
- * `>`: Increase speed.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keyPlay.disable();
- * keyboardComponent.keyPlay.enable();
- *
- * var isEnabled = keyboardComponent.keyPlay.isEnabled;
- * ```
- */
-var KeyPlayHandler = /** @class */ (function (_super) {
-    __extends(KeyPlayHandler, _super);
-    function KeyPlayHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    KeyPlayHandler.prototype._enable = function () {
-        var _this = this;
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }))))
-            .subscribe(function (_a) {
-            var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4];
-            if (event.altKey || event.ctrlKey || event.metaKey) {
-                return;
-            }
-            switch (event.key) {
-                case "D":
-                    if (!event.shiftKey) {
-                        return;
-                    }
-                    var newDirection = playing ?
-                        null : direction === Edge_1.EdgeDirection.Next ?
-                        Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ?
-                        Edge_1.EdgeDirection.Next : null;
-                    if (newDirection != null) {
-                        _this._navigator.playService.setDirection(newDirection);
-                    }
-                    break;
-                case " ":
-                    if (event.shiftKey) {
-                        return;
-                    }
-                    if (playing) {
-                        _this._navigator.playService.stop();
-                    }
-                    else {
-                        for (var _i = 0, _b = status.edges; _i < _b.length; _i++) {
-                            var edge = _b[_i];
-                            if (edge.data.direction === direction) {
-                                _this._navigator.playService.play();
-                            }
-                        }
-                    }
-                    break;
-                case "<":
-                    _this._navigator.playService.setSpeed(speed - 0.05);
-                    break;
-                case ">":
-                    _this._navigator.playService.setSpeed(speed + 0.05);
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-        });
-    };
-    KeyPlayHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeyPlayHandler.prototype._getConfiguration = function (enable) {
-        return { keyZoom: enable };
-    };
-    return KeyPlayHandler;
-}(Component_1.HandlerBase));
-exports.KeyPlayHandler = KeyPlayHandler;
-exports.default = KeyPlayHandler;
-
-},{"../../Component":291,"../../Edge":292,"rxjs/operators":241}],329:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeySequenceNavigationHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-/**
- * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
- * following key commands:
- *
- * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
- * `ALT` + `Down Arrow`: Navigate to previous image in sequence.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keySequenceNavigation.disable();
- * keyboardComponent.keySequenceNavigation.enable();
- *
- * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
- * ```
- */
-var KeySequenceNavigationHandler = /** @class */ (function (_super) {
-    __extends(KeySequenceNavigationHandler, _super);
-    function KeySequenceNavigationHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    KeySequenceNavigationHandler.prototype._enable = function () {
-        var _this = this;
-        var sequenceEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }));
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(sequenceEdges$))
-            .subscribe(function (_a) {
-            var event = _a[0], edgeStatus = _a[1];
-            var direction = null;
-            switch (event.keyCode) {
-                case 38: // up
-                    direction = Edge_1.EdgeDirection.Next;
-                    break;
-                case 40: // down
-                    direction = Edge_1.EdgeDirection.Prev;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            if (!event.altKey || event.shiftKey || !edgeStatus.cached) {
-                return;
-            }
-            for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) {
-                var edge = _b[_i];
-                if (edge.data.direction === direction) {
-                    _this._navigator.moveToKey$(edge.to)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                    return;
-                }
-            }
-        });
-    };
-    KeySequenceNavigationHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) {
-        return { keySequenceNavigation: enable };
-    };
-    return KeySequenceNavigationHandler;
-}(Component_1.HandlerBase));
-exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler;
-exports.default = KeySequenceNavigationHandler;
-
-},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],330:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeySpatialNavigationHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-/**
- * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
- * following key commands:
- *
- * `Up Arrow`: Step forward.
- * `Down Arrow`: Step backward.
- * `Left Arrow`: Step to the left.
- * `Rigth Arrow`: Step to the right.
- * `SHIFT` + `Down Arrow`: Turn around.
- * `SHIFT` + `Left Arrow`: Turn to the left.
- * `SHIFT` + `Rigth Arrow`: Turn to the right.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keySpatialNavigation.disable();
- * keyboardComponent.keySpatialNavigation.enable();
- *
- * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
- * ```
- */
-var KeySpatialNavigationHandler = /** @class */ (function (_super) {
-    __extends(KeySpatialNavigationHandler, _super);
-    /** @ignore */
-    function KeySpatialNavigationHandler(component, container, navigator, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        return _this;
-    }
-    KeySpatialNavigationHandler.prototype._enable = function () {
-        var _this = this;
-        var spatialEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.spatialEdges$;
-        }));
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$))
-            .subscribe(function (_a) {
-            var event = _a[0], edgeStatus = _a[1], frame = _a[2];
-            var pano = frame.state.currentNode.pano;
-            var direction = null;
-            switch (event.keyCode) {
-                case 37: // left
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
-                    break;
-                case 38: // up
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
-                    break;
-                case 39: // right
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
-                    break;
-                case 40: // down
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            if (event.altKey || !edgeStatus.cached ||
-                (event.shiftKey && pano)) {
-                return;
-            }
-            if (!pano) {
-                _this._moveDir(direction, edgeStatus);
-            }
-            else {
-                var shifts = {};
-                shifts[Edge_1.EdgeDirection.StepBackward] = Math.PI;
-                shifts[Edge_1.EdgeDirection.StepForward] = 0;
-                shifts[Edge_1.EdgeDirection.StepLeft] = Math.PI / 2;
-                shifts[Edge_1.EdgeDirection.StepRight] = -Math.PI / 2;
-                var phi = _this._rotationFromCamera(frame.state.camera).phi;
-                var navigationAngle = _this._spatial.wrapAngle(phi + shifts[direction]);
-                var threshold = Math.PI / 4;
-                var edges = edgeStatus.edges.filter(function (e) {
-                    return e.data.direction === Edge_1.EdgeDirection.Pano || e.data.direction === direction;
-                });
-                var smallestAngle = Number.MAX_VALUE;
-                var toKey = null;
-                for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-                    var edge = edges_1[_i];
-                    var angle = Math.abs(_this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
-                    if (angle < Math.min(smallestAngle, threshold)) {
-                        smallestAngle = angle;
-                        toKey = edge.to;
-                    }
-                }
-                if (toKey == null) {
-                    return;
-                }
-                _this._moveToKey(toKey);
-            }
-        });
-    };
-    KeySpatialNavigationHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeySpatialNavigationHandler.prototype._getConfiguration = function (enable) {
-        return { keySpatialNavigation: enable };
-    };
-    KeySpatialNavigationHandler.prototype._moveDir = function (direction, edgeStatus) {
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === direction) {
-                this._moveToKey(edge.to);
-                return;
-            }
-        }
-    };
-    KeySpatialNavigationHandler.prototype._moveToKey = function (key) {
-        this._navigator.moveToKey$(key)
-            .subscribe(undefined, function (error) {
-            if (!(error instanceof Error_1.AbortMapillaryError)) {
-                console.error(error);
-            }
-        });
-    };
-    KeySpatialNavigationHandler.prototype._rotationFromCamera = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var upProjection = direction.clone().dot(camera.up);
-        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    return KeySpatialNavigationHandler;
-}(Component_1.HandlerBase));
-exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler;
-exports.default = KeySpatialNavigationHandler;
-
-},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],331:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeyZoomHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `KeyZoomHandler` allows the user to zoom in and out using the
- * following key commands:
- *
- * `+`: Zoom in.
- * `-`: Zoom out.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keyZoom.disable();
- * keyboardComponent.keyZoom.enable();
- *
- * var isEnabled = keyboardComponent.keyZoom.isEnabled;
- * ```
- */
-var KeyZoomHandler = /** @class */ (function (_super) {
-    __extends(KeyZoomHandler, _super);
-    /** @ignore */
-    function KeyZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    KeyZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var event = _a[0], render = _a[1], transform = _a[2];
-            if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
-                return;
-            }
-            var delta = 0;
-            switch (event.key) {
-                case "+":
-                    delta = 1;
-                    break;
-                case "-":
-                    delta = -1;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            _this._navigator.stateService.zoomIn(delta, reference);
-        });
-    };
-    KeyZoomHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeyZoomHandler.prototype._getConfiguration = function (enable) {
-        return { keyZoom: enable };
-    };
-    return KeyZoomHandler;
-}(Component_1.HandlerBase));
-exports.KeyZoomHandler = KeyZoomHandler;
-exports.default = KeyZoomHandler;
-
-},{"../../Component":291,"rxjs/operators":241}],332:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeyboardComponent = void 0;
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-/**
- * @class KeyboardComponent
- *
- * @classdesc Component for keyboard event handling.
- *
- * To retrive and use the keyboard component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var keyboardComponent = viewer.getComponent("keyboard");
- * ```
- */
-var KeyboardComponent = /** @class */ (function (_super) {
-    __extends(KeyboardComponent, _super);
-    /** @ignore */
-    function KeyboardComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator);
-        _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator);
-        _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial());
-        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
-        return _this;
-    }
-    Object.defineProperty(KeyboardComponent.prototype, "keyPlay", {
-        /**
-         * Get key play.
-         *
-         * @returns {KeyPlayHandler} The key play handler.
-         */
-        get: function () {
-            return this._keyPlayHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", {
-        /**
-         * Get key sequence navigation.
-         *
-         * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.
-         */
-        get: function () {
-            return this._keySequenceNavigationHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", {
-        /**
-         * Get spatial.
-         *
-         * @returns {KeySpatialNavigationHandler} The spatial handler.
-         */
-        get: function () {
-            return this._keySpatialNavigationHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
-        /**
-         * Get key zoom.
-         *
-         * @returns {KeyZoomHandler} The key zoom handler.
-         */
-        get: function () {
-            return this._keyZoomHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    KeyboardComponent.prototype._activate = function () {
-        var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            if (configuration.keyPlay) {
-                _this._keyPlayHandler.enable();
-            }
-            else {
-                _this._keyPlayHandler.disable();
-            }
-            if (configuration.keySequenceNavigation) {
-                _this._keySequenceNavigationHandler.enable();
-            }
-            else {
-                _this._keySequenceNavigationHandler.disable();
-            }
-            if (configuration.keySpatialNavigation) {
-                _this._keySpatialNavigationHandler.enable();
-            }
-            else {
-                _this._keySpatialNavigationHandler.disable();
-            }
-            if (configuration.keyZoom) {
-                _this._keyZoomHandler.enable();
-            }
-            else {
-                _this._keyZoomHandler.disable();
-            }
-        });
-    };
-    KeyboardComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._keyPlayHandler.disable();
-        this._keySequenceNavigationHandler.disable();
-        this._keySpatialNavigationHandler.disable();
-        this._keyZoomHandler.disable();
-    };
-    KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
-    };
-    KeyboardComponent.componentName = "keyboard";
-    return KeyboardComponent;
-}(Component_1.Component));
-exports.KeyboardComponent = KeyboardComponent;
-Component_1.ComponentService.register(KeyboardComponent);
-exports.default = KeyboardComponent;
-
-},{"../../Component":291,"../../Geo":294}],333:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var MarkerComponent_1 = require("./MarkerComponent");
-Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
-var SimpleMarker_1 = require("./marker/SimpleMarker");
-Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
-var CircleMarker_1 = require("./marker/CircleMarker");
-Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
-
-},{"./MarkerComponent":334,"./marker/CircleMarker":338,"./marker/SimpleMarker":340}],334:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MarkerComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var when = require("when");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Graph_1 = require("../../Graph");
-var Geo_1 = require("../../Geo");
-/**
- * @class MarkerComponent
- *
- * @classdesc Component for showing and editing 3D marker objects.
- *
- * The `add` method is used for adding new markers or replacing
- * markers already in the set.
- *
- * If a marker already in the set has the same
- * id as one of the markers added, the old marker will be removed and
- * the added marker will take its place.
- *
- * It is not possible to update markers in the set by updating any properties
- * directly on the marker object. Markers need to be replaced by
- * re-adding them for updates to geographic position or configuration
- * to be reflected.
- *
- * Markers added to the marker component can be either interactive
- * or non-interactive. Different marker types define their behavior.
- * Markers with interaction support can be configured with options
- * to respond to dragging inside the viewer and be detected when
- * retrieving markers from pixel points with the `getMarkerIdAt` method.
- *
- * To retrive and use the marker component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { marker: true } });
- *
- * var markerComponent = viewer.getComponent("marker");
- * ```
- */
-var MarkerComponent = /** @class */ (function (_super) {
-    __extends(MarkerComponent, _super);
-    /** @ignore */
-    function MarkerComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._relativeGroundAltitude = -2;
-        _this._geoCoords = new Geo_1.GeoCoords();
-        _this._graphCalculator = new Graph_1.GraphCalculator();
-        _this._markerScene = new Component_1.MarkerScene();
-        _this._markerSet = new Component_1.MarkerSet();
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        return _this;
-    }
-    /**
-     * Add markers to the marker set or replace markers in the marker set.
-     *
-     * @description If a marker already in the set has the same
-     * id as one of the markers added, the old marker will be removed
-     * the added marker will take its place.
-     *
-     * Any marker inside the visible bounding bbox
-     * will be initialized and placed in the viewer.
-     *
-     * @param {Array<Marker>} markers - Markers to add.
-     *
-     * @example ```markerComponent.add([marker1, marker2]);```
-     */
-    MarkerComponent.prototype.add = function (markers) {
-        this._markerSet.add(markers);
-    };
-    /**
-     * Returns the marker in the marker set with the specified id, or
-     * undefined if the id matches no marker.
-     *
-     * @param {string} markerId - Id of the marker.
-     *
-     * @example ```var marker = markerComponent.get("markerId");```
-     *
-     */
-    MarkerComponent.prototype.get = function (markerId) {
-        return this._markerSet.get(markerId);
-    };
-    /**
-     * Returns an array of all markers.
-     *
-     * @example ```var markers = markerComponent.getAll();```
-     */
-    MarkerComponent.prototype.getAll = function () {
-        return this._markerSet.getAll();
-    };
-    /**
-     * Returns the id of the interactive marker closest to the current camera
-     * position at the specified point.
-     *
-     * @description Notice that the pixelPoint argument requires x, y
-     * coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the marker component.
-     *
-     * If no interactive geometry of an interactive marker exist at the pixel
-     * point, `null` will be returned.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {string} Id of the interactive marker closest to the camera. If no
-     * interactive marker exist at the pixel point, `null` will be returned.
-     *
-     * @example
-     * ```
-     * markerComponent.getMarkerIdAt([100, 100])
-     *     .then((markerId) => { console.log(markerId); });
-     * ```
-     */
-    MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var id = _this._markerScene.intersectObjects(viewport, render.perspective);
-                return id;
-            }))
-                .subscribe(function (id) {
-                resolve(id);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Check if a marker exist in the marker set.
-     *
-     * @param {string} markerId - Id of the marker.
-     *
-     * @example ```var markerExists = markerComponent.has("markerId");```
-     */
-    MarkerComponent.prototype.has = function (markerId) {
-        return this._markerSet.has(markerId);
-    };
-    /**
-     * Remove markers with the specified ids from the marker set.
-     *
-     * @param {Array<string>} markerIds - Ids for markers to remove.
-     *
-     * @example ```markerComponent.remove(["id-1", "id-2"]);```
-     */
-    MarkerComponent.prototype.remove = function (markerIds) {
-        this._markerSet.remove(markerIds);
-    };
-    /**
-     * Remove all markers from the marker set.
-     *
-     * @example ```markerComponent.removeAll();```
-     */
-    MarkerComponent.prototype.removeAll = function () {
-        this._markerSet.removeAll();
-    };
-    MarkerComponent.prototype._activate = function () {
-        var _this = this;
-        var groundAltitude$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.camera.position.z + _this._relativeGroundAltitude;
-        }), operators_1.distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a1 - a2) < 0.01;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var geoInitiated$ = rxjs_1.combineLatest(groundAltitude$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
-        var clampedConfiguration$ = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };
-        }));
-        var currentlatLon$ = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.latLon; }), operators_1.publishReplay(1), operators_1.refCount());
-        var visibleBBox$ = rxjs_1.combineLatest(clampedConfiguration$, currentlatLon$).pipe(operators_1.map(function (_a) {
-            var configuration = _a[0], latLon = _a[1];
-            return _this._graphCalculator
-                .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var visibleMarkers$ = rxjs_1.combineLatest(rxjs_1.concat(rxjs_1.of(this._markerSet), this._markerSet.changed$), visibleBBox$).pipe(operators_1.map(function (_a) {
-            var set = _a[0], bbox = _a[1];
-            return set.search(bbox);
-        }));
-        this._setChangedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
-            return visibleMarkers$.pipe(operators_1.withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$));
-        }))
-            .subscribe(function (_a) {
-            var markers = _a[0], reference = _a[1], alt = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var sceneMarkers = markerScene.markers;
-            var markersToRemove = Object.assign({}, sceneMarkers);
-            for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-                var marker = markers_1[_i];
-                if (marker.id in sceneMarkers) {
-                    delete markersToRemove[marker.id];
-                }
-                else {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-            }
-            for (var id in markersToRemove) {
-                if (!markersToRemove.hasOwnProperty(id)) {
-                    continue;
-                }
-                markerScene.remove(id);
-            }
-        });
-        this._markersUpdatedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
-            return _this._markerSet.updated$.pipe(operators_1.withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$));
-        }))
-            .subscribe(function (_a) {
-            var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
-                var marker = markers_2[_i];
-                var exists = markerScene.has(marker.id);
-                var visible = marker.latLon.lat > sw.lat &&
-                    marker.latLon.lat < ne.lat &&
-                    marker.latLon.lon > sw.lon &&
-                    marker.latLon.lon < ne.lon;
-                if (visible) {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-                else if (!visible && exists) {
-                    markerScene.remove(marker.id);
-                }
-            }
-        });
-        this._referenceSubscription = this._navigator.stateService.reference$.pipe(operators_1.skip(1), operators_1.withLatestFrom(groundAltitude$))
-            .subscribe(function (_a) {
-            var reference = _a[0], alt = _a[1];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                markerScene.update(marker.id, point3d);
-            }
-        });
-        this._adjustHeightSubscription = groundAltitude$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._navigator.stateService.reference$, currentlatLon$))
-            .subscribe(function (_a) {
-            var alt = _a[0], reference = _a[1], latLon = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var position = geoCoords
-                .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                var distanceX = point3d[0] - position[0];
-                var distanceY = point3d[1] - position[1];
-                var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
-                if (groundDistance > 50) {
-                    continue;
-                }
-                markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));
-            }
-        });
-        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var scene = _this._markerScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: scene.needsRender,
-                    render: scene.render.bind(scene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        var hoveredMarkerId$ = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$).pipe(operators_1.map(function (_a) {
-            var render = _a[0], event = _a[1];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
-            var markerId = _this._markerScene.intersectObjects(viewport, render.perspective);
-            return markerId;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function (event) {
-            return true;
-        }));
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function (event) {
-            return false;
-        }));
-        var filteredDragging$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.startWith(false));
-        this._dragEventSubscription = rxjs_1.merge(draggingStarted$.pipe(operators_1.withLatestFrom(hoveredMarkerId$)), rxjs_1.combineLatest(draggingStopped$, rxjs_1.of(null))).pipe(operators_1.startWith([false, null]), operators_1.pairwise())
-            .subscribe(function (_a) {
-            var previous = _a[0], current = _a[1];
-            var dragging = current[0];
-            var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;
-            var id = dragging ? current[1] : previous[1];
-            var marker = _this._markerScene.get(id);
-            var markerEvent = { marker: marker, target: _this, type: eventType };
-            _this.fire(eventType, markerEvent);
-        });
-        var mouseDown$ = rxjs_1.merge(this._container.mouseService.mouseDown$.pipe(operators_1.map(function (event) { return true; })), this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function (event) { return false; }))).pipe(operators_1.startWith(false));
-        this._mouseClaimSubscription = rxjs_1.combineLatest(this._container.mouseService.active$, hoveredMarkerId$.pipe(operators_1.distinctUntilChanged()), mouseDown$, filteredDragging$).pipe(operators_1.map(function (_a) {
-            var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3];
-            return (!active && markerId != null && mouseDown) || filteredDragging;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (claim) {
-            if (claim) {
-                _this._container.mouseService.claimMouse(_this._name, 1);
-                _this._container.mouseService.claimWheel(_this._name, 1);
-            }
-            else {
-                _this._container.mouseService.unclaimMouse(_this._name);
-                _this._container.mouseService.unclaimWheel(_this._name);
-            }
-        });
-        var offset$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$), operators_1.map(function (_a) {
-            var e = _a[0], id = _a[1], r = _a[2];
-            var marker = _this._markerScene.get(id);
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1];
-            var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1];
-            var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY];
-            return [marker, offset, r];
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._updateMarkerSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDrag$).pipe(operators_1.withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$))
-            .subscribe(function (_a) {
-            var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3];
-            if (!_this._markerScene.has(marker.id)) {
-                return;
-            }
-            var element = _this._container.element;
-            var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1];
-            var groundX = canvasX - offset[0];
-            var groundY = canvasY - offset[1];
-            var _d = _this._viewportCoords
-                .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1];
-            var direction = new THREE.Vector3(viewportX, viewportY, 1)
-                .unproject(render.perspective)
-                .sub(render.perspective.position)
-                .normalize();
-            var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1);
-            if (distance < 0) {
-                return;
-            }
-            var intersection = direction
-                .clone()
-                .multiplyScalar(distance)
-                .add(render.perspective.position);
-            intersection.z = render.perspective.position.z + _this._relativeGroundAltitude;
-            var _e = _this._geoCoords
-                .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1];
-            _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });
-            _this._markerSet.update(marker);
-            var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed };
-            _this.fire(MarkerComponent.changed, markerEvent);
-        });
-    };
-    MarkerComponent.prototype._deactivate = function () {
-        this._adjustHeightSubscription.unsubscribe();
-        this._dragEventSubscription.unsubscribe();
-        this._markersUpdatedSubscription.unsubscribe();
-        this._mouseClaimSubscription.unsubscribe();
-        this._referenceSubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._setChangedSubscription.unsubscribe();
-        this._updateMarkerSubscription.unsubscribe();
-        this._markerScene.clear();
-    };
-    MarkerComponent.prototype._getDefaultConfiguration = function () {
-        return { visibleBBoxSize: 100 };
-    };
-    MarkerComponent.componentName = "marker";
-    /**
-     * Fired when the position of a marker is changed.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("changed", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.changed = "changed";
-    /**
-     * Fired when a marker drag interaction starts.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragstart", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.dragstart = "dragstart";
-    /**
-     * Fired when a marker drag interaction ends.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragend", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.dragend = "dragend";
-    return MarkerComponent;
-}(Component_1.Component));
-exports.MarkerComponent = MarkerComponent;
-Component_1.ComponentService.register(MarkerComponent);
-exports.default = MarkerComponent;
-
-
-},{"../../Component":291,"../../Geo":294,"../../Graph":295,"../../Render":297,"rxjs":43,"rxjs/operators":241,"three":242,"when":288}],335:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MarkerScene = void 0;
-var THREE = require("three");
-var MarkerScene = /** @class */ (function () {
-    function MarkerScene(scene, raycaster) {
-        this._needsRender = false;
-        this._interactiveObjects = [];
-        this._markers = {};
-        this._objectMarkers = {};
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-    }
-    Object.defineProperty(MarkerScene.prototype, "markers", {
-        get: function () {
-            return this._markers;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MarkerScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    MarkerScene.prototype.add = function (marker, position) {
-        if (marker.id in this._markers) {
-            this._dispose(marker.id);
-        }
-        marker.createGeometry(position);
-        this._scene.add(marker.geometry);
-        this._markers[marker.id] = marker;
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            this._interactiveObjects.push(interactiveObject);
-            this._objectMarkers[interactiveObject.uuid] = marker.id;
-        }
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.clear = function () {
-        for (var id in this._markers) {
-            if (!this._markers.hasOwnProperty) {
-                continue;
-            }
-            this._dispose(id);
-        }
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.get = function (id) {
-        return this._markers[id];
-    };
-    MarkerScene.prototype.getAll = function () {
-        var _this = this;
-        return Object
-            .keys(this._markers)
-            .map(function (id) { return _this._markers[id]; });
-    };
-    MarkerScene.prototype.has = function (id) {
-        return id in this._markers;
-    };
-    MarkerScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectMarkers) {
-                return this._objectMarkers[intersect.object.uuid];
-            }
-        }
-        return null;
-    };
-    MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._markers[id].lerpAltitude(alt, alpha);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.remove = function (id) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._dispose(id);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    MarkerScene.prototype.update = function (id, position, latLon) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        var marker = this._markers[id];
-        marker.updatePosition(position, latLon);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype._dispose = function (id) {
-        var marker = this._markers[id];
-        this._scene.remove(marker.geometry);
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            var index = this._interactiveObjects.indexOf(interactiveObject);
-            if (index !== -1) {
-                this._interactiveObjects.splice(index, 1);
-            }
-            else {
-                console.warn("Object does not exist (" + interactiveObject.id + ") for " + id);
-            }
-            delete this._objectMarkers[interactiveObject.uuid];
-        }
-        marker.disposeGeometry();
-        delete this._markers[id];
-    };
-    return MarkerScene;
-}());
-exports.MarkerScene = MarkerScene;
-exports.default = MarkerScene;
-
-},{"three":242}],336:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MarkerSet = void 0;
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../Geo");
-var MarkerSet = /** @class */ (function () {
-    function MarkerSet() {
-        this._hash = {};
-        this._index = new Geo_1.GeoRBush(16);
-        this._indexChanged$ = new rxjs_1.Subject();
-        this._updated$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(MarkerSet.prototype, "changed$", {
-        get: function () {
-            return this._indexChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MarkerSet.prototype, "updated$", {
-        get: function () {
-            return this._updated$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    MarkerSet.prototype.add = function (markers) {
-        var updated = [];
-        var hash = this._hash;
-        var index = this._index;
-        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-            var marker = markers_1[_i];
-            var id = marker.id;
-            if (id in hash) {
-                index.remove(hash[id]);
-                updated.push(marker);
-            }
-            var item = {
-                lat: marker.latLon.lat,
-                lon: marker.latLon.lon,
-                marker: marker,
-            };
-            hash[id] = item;
-            index.insert(item);
-        }
-        if (updated.length > 0) {
-            this._updated$.next(updated);
-        }
-        if (markers.length > updated.length) {
-            this._indexChanged$.next(this);
-        }
-    };
-    MarkerSet.prototype.has = function (id) {
-        return id in this._hash;
-    };
-    MarkerSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id].marker : undefined;
-    };
-    MarkerSet.prototype.getAll = function () {
-        return this._index
-            .all()
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
-    };
-    MarkerSet.prototype.remove = function (ids) {
-        var hash = this._hash;
-        var index = this._index;
-        var changed = false;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            var item = hash[id];
-            index.remove(item);
-            delete hash[id];
-            changed = true;
-        }
-        if (changed) {
-            this._indexChanged$.next(this);
-        }
-    };
-    MarkerSet.prototype.removeAll = function () {
-        this._hash = {};
-        this._index.clear();
-        this._indexChanged$.next(this);
-    };
-    MarkerSet.prototype.search = function (_a) {
-        var sw = _a[0], ne = _a[1];
-        return this._index
-            .search({
-            maxX: ne.lat,
-            maxY: ne.lon,
-            minX: sw.lat,
-            minY: sw.lon,
-        })
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
-    };
-    MarkerSet.prototype.update = function (marker) {
-        var hash = this._hash;
-        var index = this._index;
-        var id = marker.id;
-        if (!(id in hash)) {
-            return;
-        }
-        index.remove(hash[id]);
-        var item = {
-            lat: marker.latLon.lat,
-            lon: marker.latLon.lon,
-            marker: marker,
-        };
-        hash[id] = item;
-        index.insert(item);
-    };
-    return MarkerSet;
-}());
-exports.MarkerSet = MarkerSet;
-exports.default = MarkerSet;
-
-},{"../../Geo":294,"rxjs":43}],337:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],338:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CircleMarker = void 0;
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class CircleMarker
- *
- * @classdesc Non-interactive marker with a flat circle shape. The circle
- * marker can not be configured to be interactive.
- *
- * Circle marker properties can not be updated after creation.
- *
- * To create and add one `CircleMarker` with default configuration
- * and one with configuration use
- *
- * @example
- * ```
- * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
- *
- * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         color: "#0Ff",
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
- *
- * markerComponent.add([defaultMarker, configuredMarker]);
- * ```
- */
-var CircleMarker = /** @class */ (function (_super) {
-    __extends(CircleMarker, _super);
-    function CircleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._color = options.color != null ? options.color : 0xffffff;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
-        return _this;
-    }
-    CircleMarker.prototype._createGeometry = function (position) {
-        var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            transparent: true,
-        }));
-        circle.up.fromArray([0, 0, 1]);
-        circle.renderOrder = -1;
-        var group = new THREE.Object3D();
-        group.add(circle);
-        group.position.fromArray(position);
-        this._geometry = group;
-    };
-    CircleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
-        }
-    };
-    CircleMarker.prototype._getInteractiveObjects = function () {
-        return [];
-    };
-    return CircleMarker;
-}(Component_1.Marker));
-exports.CircleMarker = CircleMarker;
-exports.default = CircleMarker;
-
-},{"../../../Component":291,"three":242}],339:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Marker = void 0;
-/**
- * @class Marker
- *
- * @classdesc Represents an abstract marker class that should be extended
- * by marker implementations used in the marker component.
- */
-var Marker = /** @class */ (function () {
-    function Marker(id, latLon) {
-        this._id = id;
-        this._latLon = latLon;
-    }
-    Object.defineProperty(Marker.prototype, "id", {
-        /**
-         * Get id.
-         * @returns {string} The id of the marker.
-         */
-        get: function () {
-            return this._id;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "geometry", {
-        /**
-         * Get geometry.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "latLon", {
-        /**
-         * Get lat lon.
-         * @returns {ILatLon} The geographic coordinates of the marker.
-         */
-        get: function () {
-            return this._latLon;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /** @ignore */
-    Marker.prototype.createGeometry = function (position) {
-        if (!!this._geometry) {
-            return;
-        }
-        this._createGeometry(position);
-        // update matrix world if raycasting occurs before first render
-        this._geometry.updateMatrixWorld(true);
-    };
-    /** @ignore */
-    Marker.prototype.disposeGeometry = function () {
-        if (!this._geometry) {
-            return;
-        }
-        this._disposeGeometry();
-        this._geometry = undefined;
-    };
-    /** @ignore */
-    Marker.prototype.getInteractiveObjects = function () {
-        if (!this._geometry) {
-            return [];
-        }
-        return this._getInteractiveObjects();
-    };
-    /** @ignore */
-    Marker.prototype.lerpAltitude = function (alt, alpha) {
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;
-    };
-    /** @ignore */
-    Marker.prototype.updatePosition = function (position, latLon) {
-        if (!!latLon) {
-            this._latLon.lat = latLon.lat;
-            this._latLon.lon = latLon.lon;
-        }
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.fromArray(position);
-        this._geometry.updateMatrixWorld(true);
-    };
-    return Marker;
-}());
-exports.Marker = Marker;
-exports.default = Marker;
-
-},{}],340:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SimpleMarker = void 0;
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class SimpleMarker
- *
- * @classdesc Interactive marker with ice cream shape. The sphere
- * inside the ice cream can be configured to be interactive.
- *
- * Simple marker properties can not be updated after creation.
- *
- * To create and add one `SimpleMarker` with default configuration
- * (non-interactive) and one interactive with configuration use
- *
- * @example
- * ```
- * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
- *
- * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         ballColor: "#00f",
- *         ballOpacity: 0.5,
- *         color: "#00f",
- *         interactive: true,
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
- *
- * markerComponent.add([defaultMarker, interactiveMarker]);
- * ```
- */
-var SimpleMarker = /** @class */ (function (_super) {
-    __extends(SimpleMarker, _super);
-    function SimpleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;
-        _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;
-        _this._circleToRayAngle = 2;
-        _this._color = options.color != null ? options.color : 0xff0000;
-        _this._interactive = !!options.interactive;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
-        return _this;
-    }
-    SimpleMarker.prototype._createGeometry = function (position) {
-        var radius = this._radius;
-        var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            transparent: true,
-        }));
-        cone.renderOrder = 1;
-        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._ballColor,
-            opacity: this._ballOpacity,
-            transparent: true,
-        }));
-        ball.position.z = this._markerHeight(radius);
-        var group = new THREE.Object3D();
-        group.add(ball);
-        group.add(cone);
-        group.position.fromArray(position);
-        this._geometry = group;
-    };
-    SimpleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
-        }
-    };
-    SimpleMarker.prototype._getInteractiveObjects = function () {
-        return this._interactive ? [this._geometry.children[0]] : [];
-    };
-    SimpleMarker.prototype._markerHeight = function (radius) {
-        var t = Math.tan(Math.PI - this._circleToRayAngle);
-        return radius * Math.sqrt(1 + t * t);
-    };
-    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
-        var geometry = new THREE.Geometry();
-        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
-        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
-        var height = this._markerHeight(radius);
-        var vertices = [];
-        for (var y = 0; y <= heightSegments; ++y) {
-            var verticesRow = [];
-            for (var x = 0; x <= widthSegments; ++x) {
-                var u = x / widthSegments * Math.PI * 2;
-                var v = y / heightSegments * Math.PI;
-                var r = void 0;
-                if (v < this._circleToRayAngle) {
-                    r = radius;
-                }
-                else {
-                    var t = Math.tan(v - this._circleToRayAngle);
-                    r = radius * Math.sqrt(1 + t * t);
-                }
-                var vertex = new THREE.Vector3();
-                vertex.x = r * Math.cos(u) * Math.sin(v);
-                vertex.y = r * Math.sin(u) * Math.sin(v);
-                vertex.z = r * Math.cos(v) + height;
-                geometry.vertices.push(vertex);
-                verticesRow.push(geometry.vertices.length - 1);
-            }
-            vertices.push(verticesRow);
-        }
-        for (var y = 0; y < heightSegments; ++y) {
-            for (var x = 0; x < widthSegments; ++x) {
-                var v1 = vertices[y][x + 1];
-                var v2 = vertices[y][x];
-                var v3 = vertices[y + 1][x];
-                var v4 = vertices[y + 1][x + 1];
-                var n1 = geometry.vertices[v1].clone().normalize();
-                var n2 = geometry.vertices[v2].clone().normalize();
-                var n3 = geometry.vertices[v3].clone().normalize();
-                var n4 = geometry.vertices[v4].clone().normalize();
-                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
-                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
-            }
-        }
-        geometry.computeFaceNormals();
-        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
-        return geometry;
-    };
-    return SimpleMarker;
-}(Component_1.Marker));
-exports.SimpleMarker = SimpleMarker;
-exports.default = SimpleMarker;
-
-},{"../../../Component":291,"three":242}],341:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.BounceHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `BounceHandler` ensures that the viewer bounces back to the image
- * when drag panning outside of the image edge.
- */
-var BounceHandler = /** @class */ (function (_super) {
-    __extends(BounceHandler, _super);
-    function BounceHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    BounceHandler.prototype._enable = function () {
-        var _this = this;
-        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.alpha < 1;
-        }), operators_1.distinctUntilChanged());
-        this._bounceSubscription = rxjs_1.combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (noForce) {
-            return noForce[0] || noForce[1] || noForce[2] || noForce[3];
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (noForce) {
-            return noForce ?
-                rxjs_1.empty() :
-                rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.pipe(operators_1.first()));
-        }), operators_1.withLatestFrom(this._navigator.panService.panNodes$))
-            .subscribe(function (_a) {
-            var _b = _a[0], render = _b[0], transform = _b[1], nts = _a[1];
-            if (!transform.hasValidScale && render.camera.focal < 0.1) {
-                return;
-            }
-            if (render.perspective.aspect === 0 || render.perspective.aspect === Number.POSITIVE_INFINITY) {
-                return;
-            }
-            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
-            var basic = _this._viewportCoords.viewportToBasic(0, 0, transform, render.perspective);
-            if ((basic[0] < 0 || basic[0] > 1) && nts.length > 0) {
-                distances[0] = distances[2] = 0;
-            }
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var _c = nts_1[_i], t = _c[1];
-                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
-                for (var i = 1; i < distances.length; i += 2) {
-                    if (d[i] < distances[i]) {
-                        distances[i] = d[i];
-                    }
-                }
-            }
-            if (Math.max.apply(Math, distances) < 0.01) {
-                return;
-            }
-            var horizontalDistance = distances[1] - distances[3];
-            var verticalDistance = distances[0] - distances[2];
-            var currentDirection = _this._viewportCoords
-                .unprojectFromViewport(0, 0, render.perspective)
-                .sub(render.perspective.position);
-            var directionPhi = _this._viewportCoords
-                .unprojectFromViewport(horizontalDistance, 0, render.perspective)
-                .sub(render.perspective.position);
-            var directionTheta = _this._viewportCoords
-                .unprojectFromViewport(0, verticalDistance, render.perspective)
-                .sub(render.perspective.position);
-            var phi = (horizontalDistance > 0 ? 1 : -1) * directionPhi.angleTo(currentDirection);
-            var theta = (verticalDistance > 0 ? 1 : -1) * directionTheta.angleTo(currentDirection);
-            var threshold = Math.PI / 60;
-            var coeff = 1e-1;
-            phi = _this._spatial.clamp(coeff * phi, -threshold, threshold);
-            theta = _this._spatial.clamp(coeff * theta, -threshold, threshold);
-            _this._navigator.stateService.rotateUnbounded({ phi: phi, theta: theta });
-        });
-    };
-    BounceHandler.prototype._disable = function () {
-        this._bounceSubscription.unsubscribe();
-    };
-    BounceHandler.prototype._getConfiguration = function () {
-        return {};
-    };
-    return BounceHandler;
-}(Component_1.HandlerBase));
-exports.BounceHandler = BounceHandler;
-exports.default = BounceHandler;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],342:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DoubleClickZoomHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.doubleClickZoom.disable();
- * mouseComponent.doubleClickZoom.enable();
- *
- * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
- * ```
- */
-var DoubleClickZoomHandler = /** @class */ (function (_super) {
-    __extends(DoubleClickZoomHandler, _super);
-    /** @ignore */
-    function DoubleClickZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    DoubleClickZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._zoomSubscription = rxjs_1.merge(this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$.pipe(operators_1.map(function (e) {
-            var touch = e.touches[0];
-            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };
-        }))).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var event = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var delta = !!event.shiftKey ? -1 : 1;
-            _this._navigator.stateService.zoomIn(delta, reference);
-        });
-    };
-    DoubleClickZoomHandler.prototype._disable = function () {
-        this._zoomSubscription.unsubscribe();
-    };
-    DoubleClickZoomHandler.prototype._getConfiguration = function (enable) {
-        return { doubleClickZoom: enable };
-    };
-    return DoubleClickZoomHandler;
-}(Component_1.HandlerBase));
-exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
-exports.default = DoubleClickZoomHandler;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],343:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DragPanHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.dragPan.disable();
- * mouseComponent.dragPan.enable();
- *
- * var isEnabled = mouseComponent.dragPan.isEnabled;
- * ```
- */
-var DragPanHandler = /** @class */ (function (_super) {
-    __extends(DragPanHandler, _super);
-    /** @ignore */
-    function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    DragPanHandler.prototype._enable = function () {
-        var _this = this;
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function () {
-            return true;
-        }), operators_1.share());
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
-            return false;
-        }), operators_1.share());
-        this._activeMouseSubscription = rxjs_1.merge(draggingStarted$, draggingStopped$)
-            .subscribe(this._container.mouseService.activate$);
-        var documentMouseMove$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.switchMap(function (dragging) {
-            return dragging ?
-                _this._container.mouseService.documentMouseMove$ :
-                rxjs_1.empty();
-        }));
-        this._preventDefaultSubscription = rxjs_1.merge(documentMouseMove$, this._container.touchService.touchMove$)
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$.pipe(operators_1.map(function () {
-            return true;
-        }));
-        var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () {
-            return false;
-        }));
-        this._activeTouchSubscription = rxjs_1.merge(touchMovingStarted$, touchMovingStopped$)
-            .subscribe(this._container.touchService.activate$);
-        var rotation$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (enable) {
-            if (!enable) {
-                return rxjs_1.empty();
-            }
-            var mouseDrag$ = Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService);
-            var singleTouchDrag$ = rxjs_1.merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () { return null; }))).pipe(operators_1.map(function (event) {
-                return event != null && event.touches.length > 0 ?
-                    event.touches[0] : null;
-            }), operators_1.pairwise(), operators_1.filter(function (pair) {
-                return pair[0] != null && pair[1] != null;
-            }));
-            return rxjs_1.merge(mouseDrag$, singleTouchDrag$);
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.panService.panNodes$), operators_1.map(function (_a) {
-            var events = _a[0], render = _a[1], transform = _a[2], nts = _a[3];
-            var previousEvent = events[0];
-            var event = events[1];
-            var movementX = event.clientX - previousEvent.clientX;
-            var movementY = event.clientY - previousEvent.clientY;
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective)
-                .sub(render.perspective.position);
-            var phi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
-            var theta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
-            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var _c = nts_1[_i], t = _c[1];
-                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
-                for (var i = 0; i < distances.length; i++) {
-                    if (d[i] < distances[i]) {
-                        distances[i] = d[i];
-                    }
-                }
-            }
-            if (distances[0] > 0 && theta < 0) {
-                theta /= Math.max(1, 2e2 * distances[0]);
-            }
-            if (distances[2] > 0 && theta > 0) {
-                theta /= Math.max(1, 2e2 * distances[2]);
-            }
-            if (distances[1] > 0 && phi < 0) {
-                phi /= Math.max(1, 2e2 * distances[1]);
-            }
-            if (distances[3] > 0 && phi > 0) {
-                phi /= Math.max(1, 2e2 * distances[3]);
-            }
-            return { phi: phi, theta: theta };
-        }), operators_1.share());
-        this._rotateWithoutInertiaSubscription = rotation$
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.rotateWithoutInertia(rotation);
-        });
-        this._rotateSubscription = rotation$.pipe(operators_1.scan(function (rotationBuffer, rotation) {
-            _this._drainBuffer(rotationBuffer);
-            rotationBuffer.push([Date.now(), rotation]);
-            return rotationBuffer;
-        }, []), operators_1.sample(rxjs_1.merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)), operators_1.map(function (rotationBuffer) {
-            var drainedBuffer = _this._drainBuffer(rotationBuffer.slice());
-            var rotation = { phi: 0, theta: 0 };
-            for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) {
-                var bufferedRotation = drainedBuffer_1[_i];
-                rotation.phi += bufferedRotation[1].phi;
-                rotation.theta += bufferedRotation[1].theta;
-            }
-            var count = drainedBuffer.length;
-            if (count > 0) {
-                rotation.phi /= count;
-                rotation.theta /= count;
-            }
-            var threshold = Math.PI / 18;
-            rotation.phi = _this._spatial.clamp(rotation.phi, -threshold, threshold);
-            rotation.theta = _this._spatial.clamp(rotation.theta, -threshold, threshold);
-            return rotation;
-        }))
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.rotate(rotation);
-        });
-    };
-    DragPanHandler.prototype._disable = function () {
-        this._activeMouseSubscription.unsubscribe();
-        this._activeTouchSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._rotateSubscription.unsubscribe();
-        this._rotateWithoutInertiaSubscription.unsubscribe();
-        this._activeMouseSubscription = null;
-        this._activeTouchSubscription = null;
-        this._preventDefaultSubscription = null;
-        this._rotateSubscription = null;
-    };
-    DragPanHandler.prototype._getConfiguration = function (enable) {
-        return { dragPan: enable };
-    };
-    DragPanHandler.prototype._drainBuffer = function (buffer) {
-        var cutoff = 50;
-        var now = Date.now();
-        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {
-            buffer.shift();
-        }
-        return buffer;
-    };
-    return DragPanHandler;
-}(Component_1.HandlerBase));
-exports.DragPanHandler = DragPanHandler;
-exports.default = DragPanHandler;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],344:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EarthControlHandler = void 0;
-var THREE = require("three");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var State_1 = require("../../State");
-var EarthControlHandler = /** @class */ (function (_super) {
-    __extends(EarthControlHandler, _super);
-    function EarthControlHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    EarthControlHandler.prototype._enable = function () {
-        var _this = this;
-        var earth$ = this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
-            return state === State_1.State.Earth;
-        }), operators_1.share());
-        this._preventDefaultSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            return earth ?
-                _this._container.mouseService.mouseWheel$ :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._truckSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
-                var e1 = _a[0], e2 = _a[1];
-                return !(e1.ctrlKey && e2.ctrlKey);
-            }));
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], previous = _b[0], current = _b[1], render = _a[1], transform = _a[2];
-            var planeNormal = [0, 0, 1];
-            var planePoint = transform.unprojectBasic([0.5, 0.5], 0);
-            planePoint[2] -= 2;
-            var currentIntersection = _this._planeIntersection(current, planeNormal, planePoint, render.perspective, _this._container.element);
-            var previousIntersection = _this._planeIntersection(previous, planeNormal, planePoint, render.perspective, _this._container.element);
-            if (!currentIntersection || !previousIntersection) {
-                return null;
-            }
-            var direction = new THREE.Vector3()
-                .subVectors(currentIntersection, previousIntersection)
-                .multiplyScalar(-1)
-                .toArray();
-            return direction;
-        }), operators_1.filter(function (direction) {
-            return !!direction;
-        }))
-            .subscribe(function (direction) {
-            _this._navigator.stateService.truck(direction);
-        });
-        this._orbitSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
-                var e1 = _a[0], e2 = _a[1];
-                return e1.ctrlKey && e2.ctrlKey;
-            }));
-        }), operators_1.map(function (_a) {
-            var previous = _a[0], current = _a[1];
-            var _b = _this._eventToViewport(current, _this._container.element), currentX = _b[0], currentY = _b[1];
-            var _c = _this._eventToViewport(previous, _this._container.element), previousX = _c[0], previousY = _c[1];
-            var phi = (previousX - currentX) * Math.PI;
-            var theta = (currentY - previousY) * Math.PI / 2;
-            return { phi: phi, theta: theta };
-        }))
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.orbit(rotation);
-        });
-        this._dollySubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return _this._container.mouseService
-                .filteredWheel$(_this._component.name, _this._container.mouseService.mouseWheel$);
-        }), operators_1.map(function (event) {
-            var delta = event.deltaY;
-            if (event.deltaMode === 1) {
-                delta = 40 * delta;
-            }
-            else if (event.deltaMode === 2) {
-                delta = 800 * delta;
-            }
-            var canvasSize = _this._viewportCoords.containerToCanvas(_this._container.element);
-            return -delta / canvasSize[1];
-        }))
-            .subscribe(function (delta) {
-            _this._navigator.stateService.dolly(delta);
-        });
-    };
-    EarthControlHandler.prototype._disable = function () {
-        this._dollySubscription.unsubscribe();
-        this._orbitSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._truckSubscription.unsubscribe();
-    };
-    EarthControlHandler.prototype._getConfiguration = function () {
-        return {};
-    };
-    EarthControlHandler.prototype._eventToViewport = function (event, element) {
-        var previousCanvas = this._viewportCoords.canvasPosition(event, element);
-        return this._viewportCoords.canvasToViewport(previousCanvas[0], previousCanvas[1], element);
-    };
-    EarthControlHandler.prototype._planeIntersection = function (event, planeNormal, planePoint, camera, element) {
-        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-        var direction = this._viewportCoords
-            .unprojectFromCanvas(canvasX, canvasY, element, camera)
-            .sub(camera.position)
-            .normalize();
-        if (Math.abs(this._spatial.angleToPlane(direction.toArray(), planeNormal)) < Math.PI / 90) {
-            return null;
-        }
-        var l0 = camera.position.clone();
-        var n = new THREE.Vector3().fromArray(planeNormal);
-        var p0 = new THREE.Vector3().fromArray(planePoint);
-        var d = new THREE.Vector3().subVectors(p0, l0).dot(n) / direction.clone().dot(n);
-        var intersection = new THREE.Vector3().addVectors(l0, direction.multiplyScalar(d));
-        if (this._viewportCoords.worldToCamera(intersection.toArray(), camera)[2] > 0) {
-            return null;
-        }
-        return intersection;
-    };
-    return EarthControlHandler;
-}(Component_1.HandlerBase));
-exports.EarthControlHandler = EarthControlHandler;
-exports.default = EarthControlHandler;
-
-},{"../../Component":291,"../../State":298,"rxjs":43,"rxjs/operators":241,"three":242}],345:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],346:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.viewportDistances = void 0;
-var Geo_1 = require("../../../src/Geo");
-function basicBoundaryPoints(pointsPerSide) {
-    var points = [];
-    var os = [[0, 0], [1, 0], [1, 1], [0, 1]];
-    var ds = [[1, 0], [0, 1], [-1, 0], [0, -1]];
-    for (var side = 0; side < 4; ++side) {
-        var o = os[side];
-        var d = ds[side];
-        for (var i = 0; i < pointsPerSide; ++i) {
-            points.push([o[0] + d[0] * i / pointsPerSide,
-                o[1] + d[1] * i / pointsPerSide]);
-        }
-    }
-    return points;
-}
-function insideViewport(x, y) {
-    return x >= -1 && x <= 1 && y >= -1 && y <= 1;
-}
-function insideBasic(x, y) {
-    return x >= 0 && x <= 1 && y >= 0 && y <= 1;
-}
-function viewportDistances(transform, perspective, viewportCoords) {
-    var boundaryPointsBasic = basicBoundaryPoints(100);
-    var boundaryPointsViewport = boundaryPointsBasic
-        .map(function (basic) {
-        return viewportCoords.basicToViewportSafe(basic[0], basic[1], transform, perspective);
-    });
-    var visibleBoundaryPoints = [];
-    var viewportSides = [
-        { x: -1, y: 1 },
-        { x: 1, y: 1 },
-        { x: 1, y: -1 },
-        { x: -1, y: -1 }
-    ];
-    var intersections = [false, false, false, false];
-    for (var i = 0; i < boundaryPointsViewport.length; i++) {
-        var p1 = boundaryPointsViewport[i];
-        var p2 = boundaryPointsViewport[(i + 1) % boundaryPointsViewport.length];
-        if (p1 === null) {
-            continue;
-        }
-        if (p2 === null) {
-            if (insideViewport(p1[0], p1[1])) {
-                visibleBoundaryPoints.push(p1);
-            }
-            continue;
-        }
-        var x1 = p1[0], y1 = p1[1];
-        var x2 = p2[0], y2 = p2[1];
-        if (insideViewport(x1, y1)) {
-            if (insideViewport(x2, y2)) {
-                visibleBoundaryPoints.push(p1);
-            }
-            else {
-                for (var side = 0; side < 4; side++) {
-                    var s1 = { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } };
-                    var s2 = { p1: viewportSides[side], p2: viewportSides[(side + 1) % 4] };
-                    var intersecting = Geo_1.Lines.segmentsIntersect(s1, s2);
-                    if (intersecting) {
-                        var intersection = Geo_1.Lines.segmentIntersection(s1, s2);
-                        visibleBoundaryPoints.push(p1, [intersection.x, intersection.y]);
-                        intersections[side] = true;
-                    }
-                }
-            }
-        }
-    }
-    var _a = viewportCoords.viewportToBasic(-1, 1, transform, perspective), topLeftBasicX = _a[0], topLeftBasicY = _a[1];
-    var _b = viewportCoords.viewportToBasic(1, 1, transform, perspective), topRightBasicX = _b[0], topRightBasicY = _b[1];
-    var _c = viewportCoords.viewportToBasic(1, -1, transform, perspective), bottomRightBasicX = _c[0], bottomRightBasicY = _c[1];
-    var _d = viewportCoords.viewportToBasic(-1, -1, transform, perspective), bottomLeftBasicX = _d[0], bottomLeftBasicY = _d[1];
-    if (insideBasic(topLeftBasicX, topLeftBasicY)) {
-        intersections[3] = intersections[0] = true;
-    }
-    if (insideBasic(topRightBasicX, topRightBasicY)) {
-        intersections[0] = intersections[1] = true;
-    }
-    if (insideBasic(bottomRightBasicX, bottomRightBasicY)) {
-        intersections[1] = intersections[2] = true;
-    }
-    if (insideBasic(bottomLeftBasicX, bottomLeftBasicY)) {
-        intersections[2] = intersections[3] = true;
-    }
-    var maximums = [-1, -1, 1, 1];
-    for (var _i = 0, visibleBoundaryPoints_1 = visibleBoundaryPoints; _i < visibleBoundaryPoints_1.length; _i++) {
-        var visibleBoundaryPoint = visibleBoundaryPoints_1[_i];
-        var x = visibleBoundaryPoint[0];
-        var y = visibleBoundaryPoint[1];
-        if (x > maximums[1]) {
-            maximums[1] = x;
-        }
-        if (x < maximums[3]) {
-            maximums[3] = x;
-        }
-        if (y > maximums[0]) {
-            maximums[0] = y;
-        }
-        if (y < maximums[2]) {
-            maximums[2] = y;
-        }
-    }
-    var boundary = [1, 1, -1, -1];
-    var distances = [];
-    for (var side = 0; side < 4; side++) {
-        if (intersections[side]) {
-            distances.push(0);
-            continue;
-        }
-        distances.push(Math.abs(boundary[side] - maximums[side]));
-    }
-    return distances;
-}
-exports.viewportDistances = viewportDistances;
-
-},{"../../../src/Geo":294}],347:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MouseComponent = void 0;
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-/**
- * @class MouseComponent
- *
- * @classdesc Component handling mouse and touch events for camera movement.
- *
- * To retrive and use the mouse component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var mouseComponent = viewer.getComponent("mouse");
- * ```
- */
-var MouseComponent = /** @class */ (function (_super) {
-    __extends(MouseComponent, _super);
-    /** @ignore */
-    function MouseComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        var spatial = new Geo_1.Spatial();
-        var viewportCoords = new Geo_1.ViewportCoords();
-        _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
-        _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._earthControlHandler = new Component_1.EarthControlHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords);
-        _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords);
-        return _this;
-    }
-    Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", {
-        /**
-         * Get double click zoom.
-         *
-         * @returns {DoubleClickZoomHandler} The double click zoom handler.
-         */
-        get: function () {
-            return this._doubleClickZoomHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "dragPan", {
-        /**
-         * Get drag pan.
-         *
-         * @returns {DragPanHandler} The drag pan handler.
-         */
-        get: function () {
-            return this._dragPanHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "scrollZoom", {
-        /**
-         * Get scroll zoom.
-         *
-         * @returns {ScrollZoomHandler} The scroll zoom handler.
-         */
-        get: function () {
-            return this._scrollZoomHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "touchZoom", {
-        /**
-         * Get touch zoom.
-         *
-         * @returns {TouchZoomHandler} The touch zoom handler.
-         */
-        get: function () {
-            return this._touchZoomHandler;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    MouseComponent.prototype._activate = function () {
-        var _this = this;
-        this._bounceHandler.enable();
-        this._earthControlHandler.enable();
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            if (configuration.doubleClickZoom) {
-                _this._doubleClickZoomHandler.enable();
-            }
-            else {
-                _this._doubleClickZoomHandler.disable();
-            }
-            if (configuration.dragPan) {
-                _this._dragPanHandler.enable();
-            }
-            else {
-                _this._dragPanHandler.disable();
-            }
-            if (configuration.scrollZoom) {
-                _this._scrollZoomHandler.enable();
-            }
-            else {
-                _this._scrollZoomHandler.disable();
-            }
-            if (configuration.touchZoom) {
-                _this._touchZoomHandler.enable();
-            }
-            else {
-                _this._touchZoomHandler.disable();
-            }
-        });
-        this._container.mouseService.claimMouse(this._name, 0);
-    };
-    MouseComponent.prototype._deactivate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._configurationSubscription.unsubscribe();
-        this._bounceHandler.disable();
-        this._doubleClickZoomHandler.disable();
-        this._dragPanHandler.disable();
-        this._earthControlHandler.disable();
-        this._scrollZoomHandler.disable();
-        this._touchZoomHandler.disable();
-    };
-    MouseComponent.prototype._getDefaultConfiguration = function () {
-        return { doubleClickZoom: false, dragPan: true, scrollZoom: true, touchZoom: true };
-    };
-    /** @inheritdoc */
-    MouseComponent.componentName = "mouse";
-    return MouseComponent;
-}(Component_1.Component));
-exports.MouseComponent = MouseComponent;
-Component_1.ComponentService.register(MouseComponent);
-exports.default = MouseComponent;
-
-},{"../../Component":291,"../../Geo":294}],348:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ScrollZoomHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.scrollZoom.disable();
- * mouseComponent.scrollZoom.enable();
- *
- * var isEnabled = mouseComponent.scrollZoom.isEnabled;
- * ```
- */
-var ScrollZoomHandler = /** @class */ (function (_super) {
-    __extends(ScrollZoomHandler, _super);
-    /** @ignore */
-    function ScrollZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    ScrollZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._container.mouseService.claimWheel(this._component.name, 0);
-        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._zoomSubscription = this._container.mouseService
-            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
-            return [w, f];
-        }), operators_1.filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
-            return [w, r, t];
-        }))
-            .subscribe(function (args) {
-            var event = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var deltaY = event.deltaY;
-            if (event.deltaMode === 1) {
-                deltaY = 40 * deltaY;
-            }
-            else if (event.deltaMode === 2) {
-                deltaY = 800 * deltaY;
-            }
-            var canvasSize = _this._viewportCoords.containerToCanvas(element);
-            var zoom = -3 * deltaY / canvasSize[1];
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-    };
-    ScrollZoomHandler.prototype._disable = function () {
-        this._container.mouseService.unclaimWheel(this._component.name);
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
-    };
-    ScrollZoomHandler.prototype._getConfiguration = function (enable) {
-        return { scrollZoom: enable };
-    };
-    return ScrollZoomHandler;
-}(Component_1.HandlerBase));
-exports.ScrollZoomHandler = ScrollZoomHandler;
-exports.default = ScrollZoomHandler;
-
-},{"../../Component":291,"rxjs/operators":241}],349:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TouchZoomHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.touchZoom.disable();
- * mouseComponent.touchZoom.enable();
- *
- * var isEnabled = mouseComponent.touchZoom.isEnabled;
- * ```
- */
-var TouchZoomHandler = /** @class */ (function (_super) {
-    __extends(TouchZoomHandler, _super);
-    /** @ignore */
-    function TouchZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    TouchZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._preventDefaultSubscription = this._container.touchService.pinch$
-            .subscribe(function (pinch) {
-            pinch.originalEvent.preventDefault();
-        });
-        var pinchStarted$ = this._container.touchService.pinchStart$.pipe(operators_1.map(function (event) {
-            return true;
-        }));
-        var pinchStopped$ = this._container.touchService.pinchEnd$.pipe(operators_1.map(function (event) {
-            return false;
-        }));
-        this._activeSubscription = rxjs_1.merge(pinchStarted$, pinchStopped$)
-            .subscribe(this._container.touchService.activate$);
-        this._zoomSubscription = this._container.touchService.pinch$.pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$), operators_1.filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var pinch = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1];
-            var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-    };
-    TouchZoomHandler.prototype._disable = function () {
-        this._activeSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
-    };
-    TouchZoomHandler.prototype._getConfiguration = function (enable) {
-        return { touchZoom: enable };
-    };
-    return TouchZoomHandler;
-}(Component_1.HandlerBase));
-exports.TouchZoomHandler = TouchZoomHandler;
-exports.default = TouchZoomHandler;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],350:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Popup_1 = require("./popup/Popup");
-Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
-var PopupComponent_1 = require("./PopupComponent");
-Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
-
-},{"./PopupComponent":351,"./popup/Popup":352}],351:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PopupComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Utils_1 = require("../../Utils");
-/**
- * @class PopupComponent
- *
- * @classdesc Component for showing HTML popup objects.
- *
- * The `add` method is used for adding new popups. Popups are removed by reference.
- *
- * It is not possible to update popups in the set by updating any properties
- * directly on the popup object. Popups need to be replaced by
- * removing them and creating new ones with relevant changed properties and
- * adding those instead.
- *
- * Popups are only relevant to a single image because they are based on
- * 2D basic image coordinates. Popups related to a certain image should
- * be removed when the viewer is moved to another node.
- *
- * To retrive and use the popup component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { popup: true } });
- *
- * var popupComponent = viewer.getComponent("popup");
- * ```
- */
-var PopupComponent = /** @class */ (function (_super) {
-    __extends(PopupComponent, _super);
-    /** @ignore */
-    function PopupComponent(name, container, navigator, dom) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._dom = !!dom ? dom : new Utils_1.DOM();
-        _this._popups = [];
-        _this._added$ = new rxjs_1.Subject();
-        _this._popups$ = new rxjs_1.Subject();
-        return _this;
-    }
-    /**
-     * Add popups to the popups set.
-     *
-     * @description Adding a new popup never replaces an old one
-     * because they are stored by reference. Adding an already
-     * existing popup has no effect.
-     *
-     * @param {Array<Popup>} popups - Popups to add.
-     *
-     * @example ```popupComponent.add([popup1, popup2]);```
-     */
-    PopupComponent.prototype.add = function (popups) {
-        for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) {
-            var popup = popups_1[_i];
-            if (this._popups.indexOf(popup) !== -1) {
-                continue;
-            }
-            this._popups.push(popup);
-            if (this._activated) {
-                popup.setParentContainer(this._popupContainer);
-            }
-        }
-        this._added$.next(popups);
-        this._popups$.next(this._popups);
-    };
-    /**
-     * Returns an array of all popups.
-     *
-     * @example ```var popups = popupComponent.getAll();```
-     */
-    PopupComponent.prototype.getAll = function () {
-        return this._popups.slice();
-    };
-    /**
-     * Remove popups based on reference from the popup set.
-     *
-     * @param {Array<Popup>} popups - Popups to remove.
-     *
-     * @example ```popupComponent.remove([popup1, popup2]);```
-     */
-    PopupComponent.prototype.remove = function (popups) {
-        for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) {
-            var popup = popups_2[_i];
-            this._remove(popup);
-        }
-        this._popups$.next(this._popups);
-    };
-    /**
-     * Remove all popups from the popup set.
-     *
-     * @example ```popupComponent.removeAll();```
-     */
-    PopupComponent.prototype.removeAll = function () {
-        for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) {
-            var popup = _a[_i];
-            this._remove(popup);
-        }
-        this._popups$.next(this._popups);
-    };
-    PopupComponent.prototype._activate = function () {
-        var _this = this;
-        this._popupContainer = this._dom.createElement("div", "mapillary-js-popup-container", this._container.element);
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.setParentContainer(this._popupContainer);
-        }
-        this._updateAllSubscription = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var renderCamera = _a[0], size = _a[1], transform = _a[2];
-            for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) {
-                var popup = _b[_i];
-                popup.update(renderCamera, size, transform);
-            }
-        });
-        var changed$ = this._popups$.pipe(operators_1.startWith(this._popups), operators_1.switchMap(function (popups) {
-            return rxjs_1.from(popups).pipe(operators_1.mergeMap(function (popup) {
-                return popup.changed$;
-            }));
-        }), operators_1.map(function (popup) {
-            return [popup];
-        }));
-        this._updateAddedChangedSubscription = rxjs_1.merge(this._added$, changed$).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3];
-            for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) {
-                var popup = popups_3[_i];
-                popup.update(renderCamera, size, transform);
-            }
-        });
-    };
-    PopupComponent.prototype._deactivate = function () {
-        this._updateAllSubscription.unsubscribe();
-        this._updateAddedChangedSubscription.unsubscribe();
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.remove();
-        }
-        this._container.element.removeChild(this._popupContainer);
-        delete this._popupContainer;
-    };
-    PopupComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    PopupComponent.prototype._remove = function (popup) {
-        var index = this._popups.indexOf(popup);
-        if (index === -1) {
-            return;
-        }
-        var removed = this._popups.splice(index, 1)[0];
-        if (this._activated) {
-            removed.remove();
-        }
-    };
-    PopupComponent.componentName = "popup";
-    return PopupComponent;
-}(Component_1.Component));
-exports.PopupComponent = PopupComponent;
-Component_1.ComponentService.register(PopupComponent);
-exports.default = PopupComponent;
-
-},{"../../Component":291,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],352:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Popup = void 0;
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../../Geo");
-var Utils_1 = require("../../../Utils");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class Popup
- *
- * @classdesc Popup instance for rendering custom HTML content
- * on top of images. Popups are based on 2D basic image coordinates
- * (see the {@link Viewer} class documentation for more information about coordinate
- * systems) and a certain popup is therefore only relevant to a single image.
- * Popups related to a certain image should be removed when moving
- * to another image.
- *
- * A popup must have both its content and its point or rect set to be
- * rendered. Popup options can not be updated after creation but the
- * basic point or rect as well as its content can be changed by calling
- * the appropriate methods.
- *
- * To create and add one `Popup` with default configuration
- * (tooltip visuals and automatic float) and one with specific options
- * use
- *
- * @example
- * ```
- * var defaultSpan = document.createElement('span');
- * defaultSpan.innerHTML = 'hello default';
- *
- * var defaultPopup = new Mapillary.PopupComponent.Popup();
- * defaultPopup.setDOMContent(defaultSpan);
- * defaultPopup.setBasicPoint([0.3, 0.3]);
- *
- * var cleanSpan = document.createElement('span');
- * cleanSpan.innerHTML = 'hello clean';
- *
- * var cleanPopup = new Mapillary.PopupComponent.Popup({
- *     clean: true,
- *     float: Mapillary.Alignment.Top,
- *     offset: 10,
- *     opacity: 0.7,
- * });
- *
- * cleanPopup.setDOMContent(cleanSpan);
- * cleanPopup.setBasicPoint([0.6, 0.6]);
- *
- * popupComponent.add([defaultPopup, cleanPopup]);
- * ```
- *
- * @description Implementation of API methods and API documentation inspired
- * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
- */
-var Popup = /** @class */ (function () {
-    function Popup(options, viewportCoords, dom) {
-        this._options = {};
-        options = !!options ? options : {};
-        this._options.capturePointer = options.capturePointer === false ?
-            options.capturePointer : true;
-        this._options.clean = options.clean;
-        this._options.float = options.float;
-        this._options.offset = options.offset;
-        this._options.opacity = options.opacity;
-        this._options.position = options.position;
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(Popup.prototype, "changed$", {
-        /**
-         * @description Internal observable used by the component to
-         * render the popup when its position or content has changed.
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * @description Internal method used by the component to
-     * remove all references to the popup.
-     * @ignore
-     */
-    Popup.prototype.remove = function () {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
-        }
-        if (this._container) {
-            this._container.parentNode.removeChild(this._container);
-            delete this._container;
-        }
-        if (this._parentContainer) {
-            delete this._parentContainer;
-        }
-    };
-    /**
-     * Sets a 2D basic image coordinates point to the popup's anchor, and
-     * moves the popup to it.
-     *
-     * @description Overwrites any previously set point or rect.
-     *
-     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setBasicPoint = function (basicPoint) {
-        this._point = basicPoint.slice();
-        this._rect = null;
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets a 2D basic image coordinates rect to the popup's anchor, and
-     * moves the popup to it.
-     *
-     * @description Overwrites any previously set point or rect.
-     *
-     * @param {Array<number>} basicRect - Rect in 2D basic image
-     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setBasicRect = function (basicRect) {
-        this._rect = basicRect.slice();
-        this._point = null;
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets the popup's content to the element provided as a DOM node.
-     *
-     * @param {Node} htmlNode - A DOM node to be used as content for the popup.
-     *
-     * @example
-     * ```
-     * var div = document.createElement('div');
-     * div.innerHTML = 'hello image';
-     *
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setDOMContent(div);
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setDOMContent = function (htmlNode) {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
-        }
-        var className = "mapillaryjs-popup-content" +
-            (this._options.clean === true ? "-clean" : "") +
-            (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
-        this._content = this._dom.createElement("div", className, this._container);
-        this._content.appendChild(htmlNode);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets the popup's content to the HTML provided as a string.
-     *
-     * @description This method does not perform HTML filtering or sanitization,
-     * and must be used only with trusted content. Consider Popup#setText if the
-     * content is an untrusted text string.
-     *
-     * @param {string} html - A string representing HTML content for the popup.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setHTML('<div>hello image</div>');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setHTML = function (html) {
-        var frag = this._dom.document.createDocumentFragment();
-        var temp = this._dom.createElement("body");
-        var child;
-        temp.innerHTML = html;
-        while (true) {
-            child = temp.firstChild;
-            if (!child) {
-                break;
-            }
-            frag.appendChild(child);
-        }
-        this.setDOMContent(frag);
-    };
-    /**
-     * Sets the popup's content to a string of text.
-     *
-     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
-     * Use this method for security against XSS if the popup content is user-provided.
-     *
-     * @param {string} text - Textual content for the popup.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setText = function (text) {
-        this.setDOMContent(this._dom.document.createTextNode(text));
-    };
-    /**
-     * @description Internal method for attaching the popup to
-     * its parent container so that it is rendered in the DOM tree.
-     * @ignore
-     */
-    Popup.prototype.setParentContainer = function (parentContainer) {
-        this._parentContainer = parentContainer;
-    };
-    /**
-     * @description Internal method for updating the rendered
-     * position of the popup called by the popup component.
-     * @ignore
-     */
-    Popup.prototype.update = function (renderCamera, size, transform) {
-        var _a;
-        if (!this._parentContainer || !this._content) {
-            return;
-        }
-        if (!this._point && !this._rect) {
-            return;
-        }
-        if (!this._container) {
-            this._container = this._dom.createElement("div", "mapillaryjs-popup", this._parentContainer);
-            var showTip = this._options.clean !== true &&
-                this._options.float !== Viewer_1.Alignment.Center;
-            if (showTip) {
-                var tipClassName = "mapillaryjs-popup-tip" +
-                    (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
-                this._tip = this._dom.createElement("div", tipClassName, this._container);
-                this._dom.createElement("div", "mapillaryjs-popup-tip-inner", this._tip);
-            }
-            this._container.appendChild(this._content);
-            this._parentContainer.appendChild(this._container);
-            if (this._options.opacity != null) {
-                this._container.style.opacity = this._options.opacity.toString();
-            }
-        }
-        var pointPixel = null;
-        var position = this._alignmentToPopupAligment(this._options.position);
-        var float = this._alignmentToPopupAligment(this._options.float);
-        var classList = this._container.classList;
-        if (this._point != null) {
-            pointPixel =
-                this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        }
-        else {
-            var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"];
-            var appliedPosition = null;
-            for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) {
-                var alignment = alignments_1[_i];
-                if (classList.contains("mapillaryjs-popup-float-" + alignment)) {
-                    appliedPosition = alignment;
-                    break;
-                }
-            }
-            _a = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform), pointPixel = _a[0], position = _a[1];
-            if (!float) {
-                float = position;
-            }
-        }
-        if (pointPixel == null) {
-            this._container.style.display = "none";
-            return;
-        }
-        this._container.style.display = "";
-        if (!float) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floats = this._pixelToFloats(pointPixel, size, width, height);
-            float = floats.length === 0 ? "top" : floats.join("-");
-        }
-        var offset = this._normalizeOffset(this._options.offset);
-        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];
-        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];
-        var floatTranslate = {
-            "bottom": "translate(-50%,0)",
-            "bottom-left": "translate(-100%,0)",
-            "bottom-right": "translate(0,0)",
-            "center": "translate(-50%,-50%)",
-            "left": "translate(-100%,-50%)",
-            "right": "translate(0,-50%)",
-            "top": "translate(-50%,-100%)",
-            "top-left": "translate(-100%,-100%)",
-            "top-right": "translate(0,-100%)",
-        };
-        for (var key in floatTranslate) {
-            if (!floatTranslate.hasOwnProperty(key)) {
-                continue;
-            }
-            classList.remove("mapillaryjs-popup-float-" + key);
-        }
-        classList.add("mapillaryjs-popup-float-" + float);
-        this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)";
-    };
-    Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) {
-        if (!position) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floatOffsets = {
-                "bottom": [0, height / 2],
-                "bottom-left": [-width / 2, height / 2],
-                "bottom-right": [width / 2, height / 2],
-                "left": [-width / 2, 0],
-                "right": [width / 2, 0],
-                "top": [0, -height / 2],
-                "top-left": [-width / 2, -height / 2],
-                "top-right": [width / 2, -height / 2],
-            };
-            var automaticPositions = ["top", "bottom", "left", "right"];
-            var largestVisibleArea = [0, null, null];
-            for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
-                var automaticPosition = automaticPositions_1[_i];
-                var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition);
-                var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-                if (autoPointPixel == null) {
-                    continue;
-                }
-                var floatOffset = floatOffsets[automaticPosition];
-                var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];
-                var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;
-                var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));
-                if (floats.length === 0 &&
-                    autoPointPixel[0] > 0 &&
-                    autoPointPixel[0] < size.width &&
-                    autoPointPixel[1] > 0 &&
-                    autoPointPixel[1] < size.height) {
-                    return [autoPointPixel, automaticPosition];
-                }
-                var minX = Math.max(offsetedPosition[0] - width / 2, 0);
-                var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
-                var minY = Math.max(offsetedPosition[1] - height / 2, 0);
-                var maxY = Math.min(offsetedPosition[1] + height / 2, size.height);
-                var visibleX = Math.max(0, maxX - minX);
-                var visibleY = Math.max(0, maxY - minY);
-                var visibleArea = staticCoeff * visibleX * visibleY;
-                if (visibleArea > largestVisibleArea[0]) {
-                    largestVisibleArea[0] = visibleArea;
-                    largestVisibleArea[1] = autoPointPixel;
-                    largestVisibleArea[2] = automaticPosition;
-                }
-            }
-            if (largestVisibleArea[0] > 0) {
-                return [largestVisibleArea[1], largestVisibleArea[2]];
-            }
-        }
-        var pointBasic = this._pointFromRectPosition(rect, position);
-        var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        return [pointPixel, position != null ? position : "top"];
-    };
-    Popup.prototype._alignmentToPopupAligment = function (float) {
-        switch (float) {
-            case Viewer_1.Alignment.Bottom:
-                return "bottom";
-            case Viewer_1.Alignment.BottomLeft:
-                return "bottom-left";
-            case Viewer_1.Alignment.BottomRight:
-                return "bottom-right";
-            case Viewer_1.Alignment.Center:
-                return "center";
-            case Viewer_1.Alignment.Left:
-                return "left";
-            case Viewer_1.Alignment.Right:
-                return "right";
-            case Viewer_1.Alignment.Top:
-                return "top";
-            case Viewer_1.Alignment.TopLeft:
-                return "top-left";
-            case Viewer_1.Alignment.TopRight:
-                return "top-right";
-            default:
-                return null;
-        }
-    };
-    Popup.prototype._normalizeOffset = function (offset) {
-        if (offset == null) {
-            return this._normalizeOffset(0);
-        }
-        if (typeof offset === "number") {
-            // input specifies a radius
-            var sideOffset = offset;
-            var sign = sideOffset >= 0 ? 1 : -1;
-            var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));
-            return {
-                "bottom": [0, sideOffset],
-                "bottom-left": [-cornerOffset, cornerOffset],
-                "bottom-right": [cornerOffset, cornerOffset],
-                "center": [0, 0],
-                "left": [-sideOffset, 0],
-                "right": [sideOffset, 0],
-                "top": [0, -sideOffset],
-                "top-left": [-cornerOffset, -cornerOffset],
-                "top-right": [cornerOffset, -cornerOffset],
-            };
-        }
-        else {
-            // input specifes a value for each position
-            return {
-                "bottom": offset.bottom || [0, 0],
-                "bottom-left": offset.bottomLeft || [0, 0],
-                "bottom-right": offset.bottomRight || [0, 0],
-                "center": offset.center || [0, 0],
-                "left": offset.left || [0, 0],
-                "right": offset.right || [0, 0],
-                "top": offset.top || [0, 0],
-                "top-left": offset.topLeft || [0, 0],
-                "top-right": offset.topRight || [0, 0],
-            };
-        }
-    };
-    Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) {
-        var floats = [];
-        if (pointPixel[1] < height) {
-            floats.push("bottom");
-        }
-        else if (pointPixel[1] > size.height - height) {
-            floats.push("top");
-        }
-        if (pointPixel[0] < width / 2) {
-            floats.push("right");
-        }
-        else if (pointPixel[0] > size.width - width / 2) {
-            floats.push("left");
-        }
-        return floats;
-    };
-    Popup.prototype._pointFromRectPosition = function (rect, position) {
-        var x0 = rect[0];
-        var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1;
-        var y0 = rect[1];
-        var y1 = rect[3];
-        switch (position) {
-            case "bottom":
-                return [(x0 + x1) / 2, y1];
-            case "bottom-left":
-                return [x0, y1];
-            case "bottom-right":
-                return [x1, y1];
-            case "center":
-                return [(x0 + x1) / 2, (y0 + y1) / 2];
-            case "left":
-                return [x0, (y0 + y1) / 2];
-            case "right":
-                return [x1, (y0 + y1) / 2];
-            case "top":
-                return [(x0 + x1) / 2, y0];
-            case "top-left":
-                return [x0, y0];
-            case "top-right":
-                return [x1, y0];
-            default:
-                return [(x0 + x1) / 2, y1];
-        }
-    };
-    return Popup;
-}());
-exports.Popup = Popup;
-exports.default = Popup;
-
-
-},{"../../../Geo":294,"../../../Utils":301,"../../../Viewer":302,"rxjs":43}],353:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SequenceComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Graph_1 = require("../../Graph");
-/**
- * @class SequenceComponent
- * @classdesc Component showing navigation arrows for sequence directions
- * as well as playing button. Exposes an API to start and stop play.
- */
-var SequenceComponent = /** @class */ (function (_super) {
-    __extends(SequenceComponent, _super);
-    function SequenceComponent(name, container, navigator, renderer, scheduler) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container);
-        _this._scheduler = scheduler;
-        _this._containerWidth$ = new rxjs_1.Subject();
-        _this._hoveredKeySubject$ = new rxjs_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
-        _this._navigator.playService.playing$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
-            .subscribe(function (_a) {
-            var playing = _a[0], configuration = _a[1];
-            _this.fire(SequenceComponent.playingchanged, playing);
-            if (playing === configuration.playing) {
-                return;
-            }
-            if (playing) {
-                _this.play();
-            }
-            else {
-                _this.stop();
-            }
-        });
-        _this._navigator.playService.direction$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
-            .subscribe(function (_a) {
-            var direction = _a[0], configuration = _a[1];
-            if (direction !== configuration.direction) {
-                _this.setDirection(direction);
-            }
-        });
-        return _this;
-    }
-    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Start playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    /**
-     * Stop playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    /**
-     * Set the direction to follow when playing.
-     *
-     * @param {EdgeDirection} direction - The direction that will be followed when playing.
-     */
-    SequenceComponent.prototype.setDirection = function (direction) {
-        this.configure({ direction: direction });
-    };
-    /**
-     * Set highlight key.
-     *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
-     *
-     * @param {string} highlightKey Key of node to be highlighted if existing.
-     */
-    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
-    /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
-    };
-    /**
-     * Set min width of container element.
-     *
-     * @description Set min width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    SequenceComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
-    };
-    /**
-     * Set the value indicating whether the sequence UI elements should be visible.
-     *
-     * @param {boolean} visible
-     */
-    SequenceComponent.prototype.setVisible = function (visible) {
-        this.configure({ visible: visible });
-    };
-    SequenceComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceDOMRenderer.activate();
-        var edgeStatus$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequence$ = this._navigator.stateService.currentNode$.pipe(operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.sequenceKey;
-        }), operators_1.switchMap(function (node) {
-            return rxjs_1.concat(rxjs_1.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey).pipe(operators_1.retry(3), operators_1.catchError(function (e) {
-                console.error("Failed to cache sequence", e);
-                return rxjs_1.of(null);
-            })));
-        }), operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
-        this._sequenceSubscription = sequence$.subscribe();
-        var rendererKey$ = this._sequenceDOMRenderer.index$.pipe(operators_1.withLatestFrom(sequence$), operators_1.map(function (_a) {
-            var index = _a[0], sequence = _a[1];
-            return sequence != null ? sequence.keys[index] : null;
-        }), operators_1.filter(function (key) {
-            return !!key;
-        }), operators_1.distinctUntilChanged(), operators_1.publish(), operators_1.refCount());
-        this._moveSubscription = rxjs_1.merge(rendererKey$.pipe(operators_1.debounceTime(100, this._scheduler)), rendererKey$.pipe(operators_1.auditTime(400, this._scheduler))).pipe(operators_1.distinctUntilChanged(), operators_1.switchMap(function (key) {
-            return _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function (e) {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-        this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence);
-        });
-        this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return !changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial);
-        });
-        this._navigator.graphService.graphMode$.pipe(operators_1.switchMap(function (mode) {
-            return mode === Graph_1.GraphMode.Spatial ?
-                _this._navigator.stateService.currentNode$.pipe(operators_1.take(2)) :
-                rxjs_1.empty();
-        }), operators_1.filter(function (node) {
-            return !node.spatialEdges.cached;
-        }), operators_1.switchMap(function (node) {
-            return _this._navigator.graphService.cacheNode$(node.key).pipe(operators_1.catchError(function (e) {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-        this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.playService.stop();
-        });
-        this._cacheSequenceNodesSubscription = rxjs_1.combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged())).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentNode$), operators_1.switchMap(function (_a) {
-            var _b = _a[0], mode = _b[0], changing = _b[1], node = _a[1];
-            return changing && mode === Graph_1.GraphMode.Sequence ?
-                _this._navigator.graphService.cacheSequenceNodes$(node.sequenceKey, node.key).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
-                    console.error("Failed to cache sequence nodes.", error);
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe();
-        var position$ = sequence$.pipe(operators_1.switchMap(function (sequence) {
-            if (!sequence) {
-                return rxjs_1.of({ index: null, max: null });
-            }
-            var firstCurrentKey = true;
-            return _this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged(), operators_1.switchMap(function (changingPosition) {
-                var skipCount = !changingPosition && firstCurrentKey ? 0 : 1;
-                firstCurrentKey = false;
-                return changingPosition ?
-                    rendererKey$ :
-                    _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-                        return node.key;
-                    }), operators_1.distinctUntilChanged(), operators_1.skip(skipCount));
-            }), operators_1.map(function (key) {
-                var index = sequence.keys.indexOf(key);
-                if (index === -1) {
-                    return { index: null, max: null };
-                }
-                return { index: index, max: sequence.keys.length - 1 };
-            }));
-        }));
-        this._renderSubscription = rxjs_1.combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.pipe(operators_1.startWith(this._sequenceDOMRenderer)), this._navigator.playService.speed$, position$).pipe(operators_1.map(function (_a) {
-            var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4], position = _a[5];
-            var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, speed, position.index, position.max, _this, _this._navigator);
-            return { name: _this._name, vnode: vNode };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$
-            .subscribe(function (speed) {
-            _this._navigator.playService.setSpeed(speed);
-        });
-        this._setDirectionSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.direction;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (direction) {
-            _this._navigator.playService.setDirection(direction);
-        });
-        this._containerWidthSubscription = rxjs_1.combineLatest(this._container.renderService.size$, this._configuration$.pipe(operators_1.distinctUntilChanged(function (value1, value2) {
-            return value1[0] === value2[0] && value1[1] === value2[1];
-        }, function (configuration) {
-            return [configuration.minWidth, configuration.maxWidth];
-        }))).pipe(operators_1.map(function (_a) {
-            var size = _a[0], configuration = _a[1];
-            return _this._sequenceDOMRenderer.getContainerWidth(size, configuration);
-        }))
-            .subscribe(this._containerWidth$);
-        this._playingSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.playing;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (playing) {
-            if (playing) {
-                _this._navigator.playService.play();
-            }
-            else {
-                _this._navigator.playService.stop();
-            }
-        });
-        this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$.pipe(operators_1.switchMap(function (direction) {
-            var edgeTo$ = edgeStatus$.pipe(operators_1.map(function (edgeStatus) {
-                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }), operators_1.takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$));
-            return rxjs_1.concat(edgeTo$, rxjs_1.of(null));
-        }), operators_1.distinctUntilChanged())
-            .subscribe(this._hoveredKeySubject$);
-        this._emitHoveredKeySubscription = this._hoveredKey$
-            .subscribe(function (key) {
-            _this.fire(SequenceComponent.hoveredkeychanged, key);
-        });
-    };
-    SequenceComponent.prototype._deactivate = function () {
-        this._emitHoveredKeySubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._playingSubscription.unsubscribe();
-        this._containerWidthSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this._setSpeedSubscription.unsubscribe();
-        this._setDirectionSubscription.unsubscribe();
-        this._setSequenceGraphModeSubscription.unsubscribe();
-        this._setSpatialGraphModeSubscription.unsubscribe();
-        this._sequenceSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._cacheSequenceNodesSubscription.unsubscribe();
-        this._stopSubscription.unsubscribe();
-        this._sequenceDOMRenderer.deactivate();
-    };
-    SequenceComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 108,
-            minWidth: 70,
-            playing: false,
-            visible: true,
-        };
-    };
-    /** @inheritdoc */
-    SequenceComponent.componentName = "sequence";
-    /**
-     * Event fired when playing starts or stops.
-     *
-     * @event SequenceComponent#playingchanged
-     * @type {boolean} Indicates whether the player is playing.
-     */
-    SequenceComponent.playingchanged = "playingchanged";
-    /**
-     * Event fired when the hovered key changes.
-     *
-     * @description Emits the key of the node for the direction
-     * arrow that is being hovered. When the mouse leaves a
-     * direction arrow null is emitted.
-     *
-     * @event SequenceComponent#hoveredkeychanged
-     * @type {string} The hovered key, null if no key is hovered.
-     */
-    SequenceComponent.hoveredkeychanged = "hoveredkeychanged";
-    return SequenceComponent;
-}(Component_1.Component));
-exports.SequenceComponent = SequenceComponent;
-Component_1.ComponentService.register(SequenceComponent);
-exports.default = SequenceComponent;
-
-},{"../../Component":291,"../../Edge":292,"../../Graph":295,"rxjs":43,"rxjs/operators":241}],354:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SequenceDOMRenderer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var SequenceDOMRenderer = /** @class */ (function () {
-    function SequenceDOMRenderer(container) {
-        this._container = container;
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._stepperDefaultWidth = 108;
-        this._controlsDefaultWidth = 88;
-        this._defaultHeight = 30;
-        this._expandControls = false;
-        this._mode = Component_1.SequenceMode.Default;
-        this._speed = 0.5;
-        this._changingSpeed = false;
-        this._index = null;
-        this._changingPosition = false;
-        this._mouseEnterDirection$ = new rxjs_1.Subject();
-        this._mouseLeaveDirection$ = new rxjs_1.Subject();
-        this._notifyChanged$ = new rxjs_1.Subject();
-        this._notifyChangingPositionChanged$ = new rxjs_1.Subject();
-        this._notifySpeedChanged$ = new rxjs_1.Subject();
-        this._notifyIndexChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", {
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", {
-        get: function () {
-            return this._notifyChangingPositionChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", {
-        get: function () {
-            return this._notifySpeedChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "index$", {
-        get: function () {
-            return this._notifyIndexChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", {
-        get: function () {
-            return this._mouseEnterDirection$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", {
-        get: function () {
-            return this._mouseLeaveDirection$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    SequenceDOMRenderer.prototype.activate = function () {
-        var _this = this;
-        if (!!this._changingSubscription) {
-            return;
-        }
-        this._changingSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
-            return touchEvent.touches.length === 0;
-        })))
-            .subscribe(function (event) {
-            if (_this._changingSpeed) {
-                _this._changingSpeed = false;
-            }
-            if (_this._changingPosition) {
-                _this._setChangingPosition(false);
-            }
-        });
-    };
-    SequenceDOMRenderer.prototype.deactivate = function () {
-        if (!this._changingSubscription) {
-            return;
-        }
-        this._changingSpeed = false;
-        this._changingPosition = false;
-        this._expandControls = false;
-        this._mode = Component_1.SequenceMode.Default;
-        this._changingSubscription.unsubscribe();
-        this._changingSubscription = null;
-    };
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, index, max, component, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
-        }
-        var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, navigator);
-        var controls = this._createSequenceControls(containerWidth);
-        var playback = this._createPlaybackControls(containerWidth, speed, component, configuration);
-        var timeline = this._createTimelineControls(containerWidth, index, max);
-        return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]);
-    };
-    SequenceDOMRenderer.prototype.getContainerWidth = function (size, configuration) {
-        var minWidth = configuration.minWidth;
-        var maxWidth = configuration.maxWidth;
-        if (maxWidth < minWidth) {
-            maxWidth = minWidth;
-        }
-        var relativeWidth = (size.width - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (size.height - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        return minWidth + coeff * (maxWidth - minWidth);
-    };
-    SequenceDOMRenderer.prototype._createPositionInput = function (index, max) {
-        var _this = this;
-        this._index = index;
-        var onPosition = function (e) {
-            _this._index = Number(e.target.value);
-            _this._notifyIndexChanged$.next(_this._index);
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 65;
-        var onStart = function (e) {
-            e.stopPropagation();
-            _this._setChangingPosition(true);
-        };
-        var onMove = function (e) {
-            if (_this._changingPosition === true) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var positionInputProperties = {
-            max: max != null ? max : 1,
-            min: 0,
-            onchange: onPosition,
-            oninput: onPosition,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: index != null ? index : 0,
-        };
-        var disabled = index == null || max == null || max <= 1;
-        if (disabled) {
-            positionInputProperties.disabled = "true";
-        }
-        var positionInput = vd.h("input.SequencePosition", positionInputProperties, []);
-        var positionContainerClass = disabled ? ".SequencePositionContainerDisabled" : ".SequencePositionContainer";
-        return vd.h("div" + positionContainerClass, [positionInput]);
-    };
-    SequenceDOMRenderer.prototype._createSpeedInput = function (speed) {
-        var _this = this;
-        this._speed = speed;
-        var onSpeed = function (e) {
-            _this._speed = Number(e.target.value) / 1000;
-            _this._notifySpeedChanged$.next(_this._speed);
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;
-        var onStart = function (e) {
-            _this._changingSpeed = true;
-            e.stopPropagation();
-        };
-        var onMove = function (e) {
-            if (_this._changingSpeed === true) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var speedInput = vd.h("input.SequenceSpeed", {
-            max: 1000,
-            min: 0,
-            onchange: onSpeed,
-            oninput: onSpeed,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: 1000 * speed,
-        }, []);
-        return vd.h("div.SequenceSpeedContainer", [speedInput]);
-    };
-    SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) {
-        var _this = this;
-        if (this._mode !== Component_1.SequenceMode.Playback) {
-            return vd.h("div.SequencePlayback", []);
-        }
-        var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []);
-        var direction = configuration.direction === Edge_1.EdgeDirection.Next ?
-            Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next;
-        var playing = configuration.playing;
-        var switchButtonProperties = {
-            onclick: function () {
-                if (!playing) {
-                    component.setDirection(direction);
-                }
-            },
-        };
-        var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton";
-        var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]);
-        var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []);
-        var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]);
-        var fastIcon = vd.h("div.SequenceFastIcon.SequenceIconVisible", []);
-        var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]);
-        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
-        var closeButtonProperties = {
-            onclick: function () {
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
-        var speedInput = this._createSpeedInput(speed);
-        var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton];
-        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
-        var playbackProperties = { style: { top: top + "px" } };
-        return vd.h("div.SequencePlayback", playbackProperties, playbackChildren);
-    };
-    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
-        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
-            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
-        var onclick = configuration.playing ?
-            function (e) { component.stop(); } :
-            canPlay ? function (e) { component.play(); } : null;
-        var buttonProperties = { onclick: onclick };
-        var iconClass = configuration.playing ?
-            "Stop" :
-            canPlay ? "Play" : "PlayDisabled";
-        var iconProperties = { className: iconClass };
-        if (configuration.direction === Edge_1.EdgeDirection.Prev) {
-            iconProperties.style = {
-                transform: "rotate(180deg) translate(50%, 50%)",
-            };
-        }
-        var icon = vd.h("div.SequenceComponentIcon", iconProperties, []);
-        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
-        return vd.h("div." + buttonClass, buttonProperties, [icon]);
-    };
-    SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) {
-        var _this = this;
-        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
-        var expanderProperties = {
-            onclick: function () {
-                _this._expandControls = !_this._expandControls;
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-            style: {
-                "border-bottom-right-radius": borderRadius + "px",
-                "border-top-right-radius": borderRadius + "px",
-            },
-        };
-        var expanderBar = vd.h("div.SequenceExpanderBar", []);
-        var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]);
-        var fastIconClassName = this._mode === Component_1.SequenceMode.Playback ?
-            ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon";
-        var fastIcon = vd.h("div" + fastIconClassName, []);
-        var playbackProperties = {
-            onclick: function () {
-                _this._mode = _this._mode === Component_1.SequenceMode.Playback ?
-                    Component_1.SequenceMode.Default :
-                    Component_1.SequenceMode.Playback;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var playback = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]);
-        var timelineIconClassName = this._mode === Component_1.SequenceMode.Timeline ?
-            ".SequenceTimelineIconGrey.SequenceIconVisible" : ".SequenceTimelineIcon";
-        var timelineIcon = vd.h("div" + timelineIconClassName, []);
-        var timelineProperties = {
-            onclick: function () {
-                _this._mode = _this._mode === Component_1.SequenceMode.Timeline ?
-                    Component_1.SequenceMode.Default :
-                    Component_1.SequenceMode.Timeline;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var timeline = vd.h("div.SequenceTimelineButton", timelineProperties, [timelineIcon]);
-        var properties = {
-            style: {
-                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
-                transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)",
-                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px",
-            },
-        };
-        var className = ".SequenceControls" +
-            (this._expandControls ? ".SequenceControlsExpanded" : "");
-        return vd.h("div" + className, properties, [playback, timeline, expander]);
-    };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, navigator) {
-        var _this = this;
-        var nextProperties = {
-            onclick: nextKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                } :
-                null,
-            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
-            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-        };
-        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
-        var prevProperties = {
-            onclick: prevKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                } :
-                null,
-            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
-            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {
-                "border-bottom-left-radius": borderRadius + "px",
-                "border-top-left-radius": borderRadius + "px",
-            },
-        };
-        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
-        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
-        var nextIcon = vd.h("div.SequenceComponentIcon", []);
-        var prevIcon = vd.h("div.SequenceComponentIcon", []);
-        return [
-            vd.h("div." + prevClass, prevProperties, [prevIcon]),
-            vd.h("div." + nextClass, nextProperties, [nextIcon]),
-        ];
-    };
-    SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, navigator) {
-        var nextKey = null;
-        var prevKey = null;
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
-                nextKey = edge.to;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
-                prevKey = edge.to;
-            }
-        }
-        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
-        var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, navigator);
-        buttons.splice(1, 0, playingButton);
-        var containerProperties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: {
-                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
-                width: containerWidth + "px",
-            },
-        };
-        return vd.h("div.SequenceStepper", containerProperties, buttons);
-    };
-    SequenceDOMRenderer.prototype._createTimelineControls = function (containerWidth, index, max) {
-        var _this = this;
-        if (this._mode !== Component_1.SequenceMode.Timeline) {
-            return vd.h("div.SequenceTimeline", []);
-        }
-        var positionInput = this._createPositionInput(index, max);
-        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
-        var closeButtonProperties = {
-            onclick: function () {
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
-        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
-        var playbackProperties = { style: { top: top + "px" } };
-        return vd.h("div.SequenceTimeline", playbackProperties, [positionInput, closeButton]);
-    };
-    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
-        var className = direction === Edge_1.EdgeDirection.Next ?
-            "SequenceStepNext" :
-            "SequenceStepPrev";
-        if (key == null) {
-            className += "Disabled";
-        }
-        else {
-            if (highlightKey === key) {
-                className += "Highlight";
-            }
-        }
-        return className;
-    };
-    SequenceDOMRenderer.prototype._setChangingPosition = function (value) {
-        this._changingPosition = value;
-        this._notifyChangingPositionChanged$.next(value);
-    };
-    return SequenceDOMRenderer;
-}());
-exports.SequenceDOMRenderer = SequenceDOMRenderer;
-exports.default = SequenceDOMRenderer;
-
-},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],355:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SequenceMode = void 0;
-var SequenceMode;
-(function (SequenceMode) {
-    SequenceMode[SequenceMode["Default"] = 0] = "Default";
-    SequenceMode[SequenceMode["Playback"] = 1] = "Playback";
-    SequenceMode[SequenceMode["Timeline"] = 2] = "Timeline";
-})(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {}));
-exports.default = SequenceMode;
-
-},{}],356:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Shaders = void 0;
-
-var path = require("path");
-var Shaders = /** @class */ (function () {
-    function Shaders() {
-    }
-    Shaders.equirectangular = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.equirectangularCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspective = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspectiveCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.fisheye = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.fisheyeCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspectiveDistorted = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
-    };
-    Shaders.perspectiveDistortedCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
-    };
-    return Shaders;
-}());
-exports.Shaders = Shaders;
-
-
-},{"path":39}],357:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SliderComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-/**
- * @class SliderComponent
- *
- * @classdesc Component for comparing pairs of images. Renders
- * a slider for adjusting the curtain of the first image.
- *
- * Deactivate the sequence, direction and image plane
- * components when activating the slider component to avoid
- * interfering UI elements.
- *
- * To retrive and use the slider component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * viewer.deactivateComponent("imagePlane");
- * viewer.deactivateComponent("direction");
- * viewer.deactivateComponent("sequence");
- *
- * viewer.activateComponent("slider");
- *
- * var sliderComponent = viewer.getComponent("slider");
- * ```
- */
-var SliderComponent = /** @class */ (function (_super) {
-    __extends(SliderComponent, _super);
-    /** @ignore */
-    function SliderComponent(name, container, navigator, viewportCoords) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        _this._domRenderer = new Component_1.SliderDOMRenderer(container);
-        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
-        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
-        _this._spatial = new Geo_1.Spatial();
-        _this._glRendererOperation$ = new rxjs_1.Subject();
-        _this._glRendererCreator$ = new rxjs_1.Subject();
-        _this._glRendererDisposer$ = new rxjs_1.Subject();
-        _this._glRenderer$ = _this._glRendererOperation$.pipe(operators_1.scan(function (glRenderer, operation) {
-            return operation(glRenderer);
-        }, null), operators_1.filter(function (glRenderer) {
-            return glRenderer != null;
-        }), operators_1.distinctUntilChanged(undefined, function (glRenderer) {
-            return glRenderer.frameId;
-        }));
-        _this._glRendererCreator$.pipe(operators_1.map(function () {
-            return function (glRenderer) {
-                if (glRenderer != null) {
-                    throw new Error("Multiple slider states can not be created at the same time");
-                }
-                return new Component_1.SliderGLRenderer();
-            };
-        }))
-            .subscribe(_this._glRendererOperation$);
-        _this._glRendererDisposer$.pipe(operators_1.map(function () {
-            return function (glRenderer) {
-                glRenderer.dispose();
-                return null;
-            };
-        }))
-            .subscribe(_this._glRendererOperation$);
-        return _this;
-    }
-    /**
-     * Set the initial position.
-     *
-     * @description Configures the intial position of the slider.
-     * The inital position value will be used when the component
-     * is activated.
-     *
-     * @param {number} initialPosition - Initial slider position.
-     */
-    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
-        this.configure({ initialPosition: initialPosition });
-    };
-    /**
-     * Set the image keys.
-     *
-     * @description Configures the component to show the image
-     * planes for the supplied image keys.
-     *
-     * @param {ISliderKeys} keys - Slider keys object specifying
-     * the images to be shown in the foreground and the background.
-     */
-    SliderComponent.prototype.setKeys = function (keys) {
-        this.configure({ keys: keys });
-    };
-    /**
-     * Set the slider mode.
-     *
-     * @description Configures the mode for transitions between
-     * image pairs.
-     *
-     * @param {SliderMode} mode - Slider mode to be set.
-     */
-    SliderComponent.prototype.setSliderMode = function (mode) {
-        this.configure({ mode: mode });
-    };
-    /**
-     * Set the value controlling if the slider is visible.
-     *
-     * @param {boolean} sliderVisible - Value indicating if
-     * the slider should be visible or not.
-     */
-    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
-        this.configure({ sliderVisible: sliderVisible });
-    };
-    SliderComponent.prototype._activate = function () {
-        var _this = this;
-        this._modeSubcription = this._domRenderer.mode$
-            .subscribe(function (mode) {
-            _this.setSliderMode(mode);
-        });
-        this._glRenderSubscription = this._glRenderer$.pipe(operators_1.map(function (glRenderer) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: glRenderer.frameId,
-                    needsRender: glRenderer.needsRender,
-                    render: glRenderer.render.bind(glRenderer),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            return renderHash;
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        var position$ = rxjs_1.concat(this.configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.initialPosition != null ?
-                configuration.initialPosition : 1;
-        }), operators_1.first()), this._domRenderer.position$);
-        var mode$ = this.configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.mode;
-        }), operators_1.distinctUntilChanged());
-        var motionless$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.motionless;
-        }), operators_1.distinctUntilChanged());
-        var fullPano$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.currentNode.fullPano;
-        }), operators_1.distinctUntilChanged());
-        var sliderVisible$ = rxjs_1.combineLatest(this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.sliderVisible;
-        })), this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return !(frame.state.currentNode == null ||
-                frame.state.previousNode == null ||
-                (frame.state.currentNode.pano && !frame.state.currentNode.fullPano) ||
-                (frame.state.previousNode.pano && !frame.state.previousNode.fullPano) ||
-                (frame.state.currentNode.fullPano && !frame.state.previousNode.fullPano));
-        }), operators_1.distinctUntilChanged())).pipe(operators_1.map(function (_a) {
-            var sliderVisible = _a[0], enabledState = _a[1];
-            return sliderVisible && enabledState;
-        }), operators_1.distinctUntilChanged());
-        this._waitSubscription = rxjs_1.combineLatest(mode$, motionless$, fullPano$, sliderVisible$).pipe(operators_1.withLatestFrom(this._navigator.stateService.state$))
-            .subscribe(function (_a) {
-            var _b = _a[0], mode = _b[0], motionless = _b[1], fullPano = _b[2], sliderVisible = _b[3], state = _a[1];
-            var interactive = sliderVisible &&
-                (motionless || mode === Component_1.SliderMode.Stationary || fullPano);
-            if (interactive && state !== State_1.State.WaitingInteractively) {
-                _this._navigator.stateService.waitInteractively();
-            }
-            else if (!interactive && state !== State_1.State.Waiting) {
-                _this._navigator.stateService.wait();
-            }
-        });
-        this._moveSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$)
-            .subscribe(function (_a) {
-            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4];
-            if (motionless || mode === Component_1.SliderMode.Stationary || fullPano) {
-                _this._navigator.stateService.moveTo(1);
-            }
-            else {
-                _this._navigator.stateService.moveTo(position);
-            }
-        });
-        this._domRenderSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4], size = _a[5];
-            return {
-                name: _this._name,
-                vnode: _this._domRenderer.render(position, mode, motionless, fullPano, sliderVisible),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._glRendererCreator$.next(null);
-        this._updateCurtainSubscription = rxjs_1.combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.map(function (_a) {
-            var position = _a[0], fullPano = _a[1], visible = _a[2], render = _a[3], transform = _a[4];
-            if (!fullPano) {
-                return visible ? position : 1;
-            }
-            var basicMin = _this._viewportCoords.viewportToBasic(-1.15, 0, transform, render.perspective);
-            var basicMax = _this._viewportCoords.viewportToBasic(1.15, 0, transform, render.perspective);
-            var shiftedMax = basicMax[0] < basicMin[0] ? basicMax[0] + 1 : basicMax[0];
-            var basicPosition = basicMin[0] + position * (shiftedMax - basicMin[0]);
-            return basicPosition > 1 ? basicPosition - 1 : basicPosition;
-        }), operators_1.map(function (position) {
-            return function (glRenderer) {
-                glRenderer.updateCurtain(position);
-                return glRenderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._stateSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, mode$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], mode = _a[1];
-            return function (glRenderer) {
-                glRenderer.update(frame, mode);
-                return glRenderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setKeysSubscription = this._configuration$.pipe(operators_1.filter(function (configuration) {
-            return configuration.keys != null;
-        }), operators_1.switchMap(function (configuration) {
-            return rxjs_1.zip(rxjs_1.zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)).pipe(operators_1.map(function (nodes) {
-                return { background: nodes[0], foreground: nodes[1] };
-            })), _this._navigator.stateService.currentState$.pipe(operators_1.first())).pipe(operators_1.map(function (nf) {
-                return { nodes: nf[0], state: nf[1].state };
-            }));
-        }))
-            .subscribe(function (co) {
-            if (co.state.currentNode != null &&
-                co.state.previousNode != null &&
-                co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.previousNode.key === co.nodes.background.key) {
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.background.key) {
-                _this._navigator.stateService.setNodes([co.nodes.foreground]);
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.trajectory.length === 1) {
-                _this._navigator.stateService.prependNodes([co.nodes.background]);
-                return;
-            }
-            _this._navigator.stateService.setNodes([co.nodes.background]);
-            _this._navigator.stateService.setNodes([co.nodes.foreground]);
-        }, function (e) {
-            console.error(e);
-        });
-        var previousNode$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.previousNode;
-        }), operators_1.filter(function (node) {
-            return node != null;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }));
-        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return roiTrigger$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }))
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
-        });
-        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        var textureProviderPrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return !!frame.state.previousNode;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.previousNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var previousNode = state.previousNode;
-            var previousTransform = state.previousTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(previousNode.key, previousTransform.basicWidth, previousTransform.basicHeight, tileSize, previousNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { });
-        this._setTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProviderPrev(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setTileSizeSubscriptionPrev = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProviderPrev$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTriggerPrev$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
-            return roiTriggerPrev$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }), operators_1.withLatestFrom(this._navigator.stateService.currentState$))
-            .subscribe(function (_a) {
-            var _b = _a[0], roi = _b[0], provider = _b[1], frame = _a[1];
-            var shiftedRoi = null;
-            if (frame.state.previousNode.fullPano) {
-                if (frame.state.currentNode.fullPano) {
-                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
-                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
-                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
-                    var shift = directionDiff / (2 * Math.PI);
-                    var bbox = {
-                        maxX: _this._spatial.wrap(roi.bbox.maxX + shift, 0, 1),
-                        maxY: roi.bbox.maxY,
-                        minX: _this._spatial.wrap(roi.bbox.minX + shift, 0, 1),
-                        minY: roi.bbox.minY,
-                    };
-                    shiftedRoi = {
-                        bbox: bbox,
-                        pixelHeight: roi.pixelHeight,
-                        pixelWidth: roi.pixelWidth,
-                    };
-                }
-                else {
-                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
-                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
-                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
-                    var shiftX = directionDiff / (2 * Math.PI);
-                    var a1 = _this._spatial.angleToPlane(currentViewingDirection.toArray(), [0, 0, 1]);
-                    var a2 = _this._spatial.angleToPlane(previousViewingDirection.toArray(), [0, 0, 1]);
-                    var shiftY = (a2 - a1) / (2 * Math.PI);
-                    var currentTransform = frame.state.currentTransform;
-                    var size = Math.max(currentTransform.basicWidth, currentTransform.basicHeight);
-                    var hFov = size > 0 ?
-                        2 * Math.atan(0.5 * currentTransform.basicWidth / (size * currentTransform.focal)) :
-                        Math.PI / 3;
-                    var vFov = size > 0 ?
-                        2 * Math.atan(0.5 * currentTransform.basicHeight / (size * currentTransform.focal)) :
-                        Math.PI / 3;
-                    var spanningWidth = hFov / (2 * Math.PI);
-                    var spanningHeight = vFov / Math.PI;
-                    var basicWidth = (roi.bbox.maxX - roi.bbox.minX) * spanningWidth;
-                    var basicHeight = (roi.bbox.maxY - roi.bbox.minY) * spanningHeight;
-                    var pixelWidth = roi.pixelWidth * spanningWidth;
-                    var pixelHeight = roi.pixelHeight * spanningHeight;
-                    var zoomShiftX = (roi.bbox.minX + roi.bbox.maxX) / 2 - 0.5;
-                    var zoomShiftY = (roi.bbox.minY + roi.bbox.maxY) / 2 - 0.5;
-                    var minX = 0.5 + shiftX + spanningWidth * zoomShiftX - basicWidth / 2;
-                    var maxX = 0.5 + shiftX + spanningWidth * zoomShiftX + basicWidth / 2;
-                    var minY = 0.5 + shiftY + spanningHeight * zoomShiftY - basicHeight / 2;
-                    var maxY = 0.5 + shiftY + spanningHeight * zoomShiftY + basicHeight / 2;
-                    var bbox = {
-                        maxX: _this._spatial.wrap(maxX, 0, 1),
-                        maxY: maxY,
-                        minX: _this._spatial.wrap(minX, 0, 1),
-                        minY: minY,
-                    };
-                    shiftedRoi = {
-                        bbox: bbox,
-                        pixelHeight: pixelHeight,
-                        pixelWidth: pixelWidth,
-                    };
-                }
-            }
-            else {
-                var currentBasicAspect = frame.state.currentTransform.basicAspect;
-                var previousBasicAspect = frame.state.previousTransform.basicAspect;
-                var _c = _this._getBasicCorners(currentBasicAspect, previousBasicAspect), _d = _c[0], cornerMinX = _d[0], cornerMinY = _d[1], _e = _c[1], cornerMaxX = _e[0], cornerMaxY = _e[1];
-                var basicWidth = cornerMaxX - cornerMinX;
-                var basicHeight = cornerMaxY - cornerMinY;
-                var pixelWidth = roi.pixelWidth / basicWidth;
-                var pixelHeight = roi.pixelHeight / basicHeight;
-                var minX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.minX / basicWidth;
-                var maxX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.maxX / basicWidth;
-                var minY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.minY / basicHeight;
-                var maxY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.maxY / basicHeight;
-                var bbox = {
-                    maxX: maxX,
-                    maxY: maxY,
-                    minX: minX,
-                    minY: minY,
-                };
-                _this._clipBoundingBox(bbox);
-                shiftedRoi = {
-                    bbox: bbox,
-                    pixelHeight: pixelHeight,
-                    pixelWidth: pixelWidth,
-                };
-            }
-            provider.setRegionOfInterest(shiftedRoi);
-        });
-        var hasTexturePrev$ = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { });
-        var nodeImagePrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0 && !!frame.state.previousNode;
-        }), operators_1.map(function (frame) {
-            return frame.state.previousNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexturePrev$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexturePrev$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscriptionPrev = nodeImagePrev$.pipe(operators_1.withLatestFrom(textureProviderPrev$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscriptionPrev = nodeImagePrev$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-    };
-    SliderComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._waitSubscription.unsubscribe();
-        this._navigator.stateService.state$.pipe(operators_1.first())
-            .subscribe(function (state) {
-            if (state !== State_1.State.Traversing) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-        this._glRendererDisposer$.next(null);
-        this._domRenderer.deactivate();
-        this._modeSubcription.unsubscribe();
-        this._setKeysSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._glRenderSubscription.unsubscribe();
-        this._domRenderSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._updateCurtainSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._setTileSizeSubscription.unsubscribe();
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
-        this._textureProviderSubscriptionPrev.unsubscribe();
-        this._setTextureProviderSubscriptionPrev.unsubscribe();
-        this._setTileSizeSubscriptionPrev.unsubscribe();
-        this._abortTextureProviderSubscriptionPrev.unsubscribe();
-        this._setRegionOfInterestSubscriptionPrev.unsubscribe();
-        this._hasTextureSubscriptionPrev.unsubscribe();
-        this._updateBackgroundSubscriptionPrev.unsubscribe();
-        this._updateTextureImageSubscriptionPrev.unsubscribe();
-        this.configure({ keys: null });
-    };
-    SliderComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            initialPosition: 1,
-            mode: Component_1.SliderMode.Motion,
-            sliderVisible: true,
-        };
-    };
-    SliderComponent.prototype._catchCacheNode$ = function (key) {
-        return this._navigator.graphService.cacheNode$(key).pipe(operators_1.catchError(function (error, caught) {
-            console.error("Failed to cache slider node (" + key + ")", error);
-            return rxjs_1.empty();
-        }));
-    };
-    SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) {
-        var offsetX;
-        var offsetY;
-        if (currentAspect > previousAspect) {
-            offsetX = 0.5;
-            offsetY = 0.5 * currentAspect / previousAspect;
-        }
-        else {
-            offsetX = 0.5 * previousAspect / currentAspect;
-            offsetY = 0.5;
-        }
-        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
-    };
-    SliderComponent.prototype._clipBoundingBox = function (bbox) {
-        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
-        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
-        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
-        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
-    };
-    SliderComponent.componentName = "slider";
-    return SliderComponent;
-}(Component_1.Component));
-exports.SliderComponent = SliderComponent;
-Component_1.ComponentService.register(SliderComponent);
-exports.default = SliderComponent;
-
-
-},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../State":298,"../../Tiles":300,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],358:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SliderDOMRenderer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var SliderDOMRenderer = /** @class */ (function () {
-    function SliderDOMRenderer(container) {
-        this._container = container;
-        this._interacting = false;
-        this._notifyModeChanged$ = new rxjs_1.Subject();
-        this._notifyPositionChanged$ = new rxjs_1.Subject();
-        this._stopInteractionSubscription = null;
-    }
-    Object.defineProperty(SliderDOMRenderer.prototype, "mode$", {
-        get: function () {
-            return this._notifyModeChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SliderDOMRenderer.prototype, "position$", {
-        get: function () {
-            return this._notifyPositionChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    SliderDOMRenderer.prototype.activate = function () {
-        var _this = this;
-        if (!!this._stopInteractionSubscription) {
-            return;
-        }
-        this._stopInteractionSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
-            return touchEvent.touches.length === 0;
-        })))
-            .subscribe(function (event) {
-            if (_this._interacting) {
-                _this._interacting = false;
-            }
-        });
-    };
-    SliderDOMRenderer.prototype.deactivate = function () {
-        if (!this._stopInteractionSubscription) {
-            return;
-        }
-        this._interacting = false;
-        this._stopInteractionSubscription.unsubscribe();
-        this._stopInteractionSubscription = null;
-    };
-    SliderDOMRenderer.prototype.render = function (position, mode, motionless, pano, visible) {
-        var children = [];
-        if (visible) {
-            children.push(vd.h("div.SliderBorder", []));
-            var modeVisible = !(motionless || pano);
-            if (modeVisible) {
-                children.push(this._createModeButton(mode));
-                children.push(this._createModeButton2d(mode));
-            }
-            children.push(this._createPositionInput(position, modeVisible));
-        }
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(215, Math.min(400, boundingRect.width - 100));
-        return vd.h("div.SliderContainer", { style: { width: width + "px" } }, children);
-    };
-    SliderDOMRenderer.prototype._createModeButton = function (mode) {
-        var _this = this;
-        var properties = {
-            onclick: function () {
-                if (mode === Component_1.SliderMode.Motion) {
-                    return;
-                }
-                _this._notifyModeChanged$.next(Component_1.SliderMode.Motion);
-            },
-        };
-        var className = mode === Component_1.SliderMode.Stationary ?
-            "SliderModeButtonDisabled" :
-            "SliderModeButton";
-        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]);
-    };
-    SliderDOMRenderer.prototype._createModeButton2d = function (mode) {
-        var _this = this;
-        var properties = {
-            onclick: function () {
-                if (mode === Component_1.SliderMode.Stationary) {
-                    return;
-                }
-                _this._notifyModeChanged$.next(Component_1.SliderMode.Stationary);
-            },
-        };
-        var className = mode === Component_1.SliderMode.Motion ?
-            "SliderModeButton2dDisabled" :
-            "SliderModeButton2d";
-        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon2d", [])]);
-    };
-    SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) {
-        var _this = this;
-        var onChange = function (e) {
-            _this._notifyPositionChanged$.next(Number(e.target.value) / 1000);
-        };
-        var onStart = function (e) {
-            _this._interacting = true;
-            e.stopPropagation();
-        };
-        var onMove = function (e) {
-            if (_this._interacting) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 84 + (modeVisible ? 0 : 52);
-        var positionInput = vd.h("input.SliderPosition", {
-            max: 1000,
-            min: 0,
-            onchange: onChange,
-            oninput: onChange,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: 1000 * position,
-        }, []);
-        return vd.h("div.SliderPositionContainer", [positionInput]);
-    };
-    return SliderDOMRenderer;
-}());
-exports.SliderDOMRenderer = SliderDOMRenderer;
-exports.default = SliderDOMRenderer;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],359:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SliderGLRenderer = void 0;
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var SliderGLRenderer = /** @class */ (function () {
-    function SliderGLRenderer() {
-        this._factory = new Component_1.MeshFactory();
-        this._scene = new Component_1.MeshScene();
-        this._spatial = new Geo_1.Spatial();
-        this._currentKey = null;
-        this._previousKey = null;
-        this._disabled = false;
-        this._curtain = 1;
-        this._frameId = 0;
-        this._needsRender = false;
-        this._mode = null;
-        this._currentProviderDisposers = {};
-        this._previousProviderDisposers = {};
-    }
-    Object.defineProperty(SliderGLRenderer.prototype, "disabled", {
-        get: function () {
-            return this._disabled;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SliderGLRenderer.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SliderGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    SliderGLRenderer.prototype.setTextureProvider = function (key, provider) {
-        this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this));
-    };
-    SliderGLRenderer.prototype.setTextureProviderPrev = function (key, provider) {
-        this._setTextureProvider(key, this._previousKey, provider, this._previousProviderDisposers, this._updateTexturePrev.bind(this));
-    };
-    SliderGLRenderer.prototype.update = function (frame, mode) {
-        this._updateFrameId(frame.id);
-        this._updateImagePlanes(frame.state, mode);
-    };
-    SliderGLRenderer.prototype.updateCurtain = function (curtain) {
-        if (this._curtain === curtain) {
-            return;
-        }
-        this._curtain = curtain;
-        this._updateCurtain();
-        this._needsRender = true;
-    };
-    SliderGLRenderer.prototype.updateTexture = function (image, node) {
-        var planes = node.key === this._currentKey ?
-            this._scene.planes :
-            node.key === this._previousKey ?
-                this._scene.planesOld :
-                {};
-        if (Object.keys(planes).length === 0) {
-            return;
-        }
-        this._needsRender = true;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderGLRenderer.prototype.updateTextureImage = function (image, node) {
-        if (this._currentKey !== node.key) {
-            return;
-        }
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        if (!this.disabled) {
-            renderer.render(this._scene.sceneOld, perspectiveCamera);
-        }
-        renderer.render(this._scene.scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    SliderGLRenderer.prototype.dispose = function () {
-        this._scene.clear();
-        for (var key in this._currentProviderDisposers) {
-            if (!this._currentProviderDisposers.hasOwnProperty(key)) {
-                continue;
-            }
-            this._currentProviderDisposers[key]();
-        }
-        for (var key in this._previousProviderDisposers) {
-            if (!this._previousProviderDisposers.hasOwnProperty(key)) {
-                continue;
-            }
-            this._previousProviderDisposers[key]();
-        }
-        this._currentProviderDisposers = {};
-        this._previousProviderDisposers = {};
-    };
-    SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) {
-        var offsetX;
-        var offsetY;
-        if (currentAspect > previousAspect) {
-            offsetX = 0.5;
-            offsetY = 0.5 * currentAspect / previousAspect;
-        }
-        else {
-            offsetX = 0.5 * previousAspect / currentAspect;
-            offsetY = 0.5;
-        }
-        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
-    };
-    SliderGLRenderer.prototype._setDisabled = function (state) {
-        this._disabled = state.currentNode == null ||
-            state.previousNode == null ||
-            (state.currentNode.pano && !state.currentNode.fullPano) ||
-            (state.previousNode.pano && !state.previousNode.fullPano) ||
-            (state.currentNode.fullPano && !state.previousNode.fullPano);
-    };
-    SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) {
-        var _this = this;
-        if (key !== originalKey) {
-            return;
-        }
-        var createdSubscription = provider.textureCreated$
-            .subscribe(updateTexture);
-        var updatedSubscription = provider.textureUpdated$
-            .subscribe(function (updated) {
-            _this._needsRender = true;
-        });
-        var dispose = function () {
-            createdSubscription.unsubscribe();
-            updatedSubscription.unsubscribe();
-            provider.dispose();
-        };
-        if (key in providerDisposers) {
-            var disposeProvider = providerDisposers[key];
-            disposeProvider();
-            delete providerDisposers[key];
-        }
-        providerDisposers[key] = dispose;
-    };
-    SliderGLRenderer.prototype._updateCurtain = function () {
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var shaderMaterial = plane.material;
-            if (!!shaderMaterial.uniforms.curtain) {
-                shaderMaterial.uniforms.curtain.value = this._curtain;
-            }
-        }
-    };
-    SliderGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
-    };
-    SliderGLRenderer.prototype._updateImagePlanes = function (state, mode) {
-        var currentChanged = state.currentNode != null && this._currentKey !== state.currentNode.key;
-        var previousChanged = state.previousNode != null && this._previousKey !== state.previousNode.key;
-        var modeChanged = this._mode !== mode;
-        if (!(currentChanged || previousChanged || modeChanged)) {
-            return;
-        }
-        this._setDisabled(state);
-        this._needsRender = true;
-        this._mode = mode;
-        var motionless = state.motionless || mode === Component_1.SliderMode.Stationary || state.currentNode.pano;
-        if (this.disabled || previousChanged) {
-            if (this._previousKey in this._previousProviderDisposers) {
-                this._previousProviderDisposers[this._previousKey]();
-                delete this._previousProviderDisposers[this._previousKey];
-            }
-        }
-        if (this.disabled) {
-            this._scene.setImagePlanesOld({});
-        }
-        else {
-            if (previousChanged || modeChanged) {
-                var previousNode = state.previousNode;
-                this._previousKey = previousNode.key;
-                var elements = state.currentTransform.rt.elements;
-                var translation = [elements[12], elements[13], elements[14]];
-                var currentAspect = state.currentTransform.basicAspect;
-                var previousAspect = state.previousTransform.basicAspect;
-                var textureScale = currentAspect > previousAspect ?
-                    [1, previousAspect / currentAspect] :
-                    [currentAspect / previousAspect, 1];
-                var rotation = state.currentNode.rotation;
-                var width = state.currentNode.width;
-                var height = state.currentNode.height;
-                if (previousNode.fullPano) {
-                    rotation = state.previousNode.rotation;
-                    translation = this._spatial
-                        .rotate(this._spatial
-                        .opticalCenter(state.currentNode.rotation, translation)
-                        .toArray(), rotation)
-                        .multiplyScalar(-1)
-                        .toArray();
-                    width = state.previousNode.width;
-                    height = state.previousNode.height;
-                }
-                var transform = new Geo_1.Transform(state.currentNode.orientation, width, height, state.currentNode.focal, state.currentNode.scale, previousNode.gpano, rotation, translation, previousNode.image, textureScale);
-                var mesh = undefined;
-                if (previousNode.fullPano) {
-                    mesh = this._factory.createMesh(previousNode, motionless || state.currentNode.fullPano ? transform : state.previousTransform);
-                }
-                else {
-                    if (motionless) {
-                        var _a = this._getBasicCorners(currentAspect, previousAspect), _b = _a[0], basicX0 = _b[0], basicY0 = _b[1], _c = _a[1], basicX1 = _c[0], basicY1 = _c[1];
-                        mesh = this._factory.createFlatMesh(state.previousNode, transform, basicX0, basicX1, basicY0, basicY1);
-                    }
-                    else {
-                        mesh = this._factory.createMesh(state.previousNode, state.previousTransform);
-                    }
-                }
-                var previousPlanes = {};
-                previousPlanes[previousNode.key] = mesh;
-                this._scene.setImagePlanesOld(previousPlanes);
-            }
-        }
-        if (currentChanged || modeChanged) {
-            if (this._currentKey in this._currentProviderDisposers) {
-                this._currentProviderDisposers[this._currentKey]();
-                delete this._currentProviderDisposers[this._currentKey];
-            }
-            this._currentKey = state.currentNode.key;
-            var planes = {};
-            if (state.currentNode.fullPano) {
-                planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
-            }
-            else if (state.currentNode.pano && !state.currentNode.fullPano) {
-                planes[state.currentNode.key] = this._factory.createMesh(state.currentNode, state.currentTransform);
-            }
-            else {
-                if (motionless) {
-                    planes[state.currentNode.key] = this._factory.createDistortedCurtainMesh(state.currentNode, state.currentTransform);
-                }
-                else {
-                    planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
-                }
-            }
-            this._scene.setImagePlanes(planes);
-            this._updateCurtain();
-        }
-    };
-    SliderGLRenderer.prototype._updateTexture = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    SliderGLRenderer.prototype._updateTexturePrev = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planesOld;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    return SliderGLRenderer;
-}());
-exports.SliderGLRenderer = SliderGLRenderer;
-exports.default = SliderGLRenderer;
-
-
-},{"../../Component":291,"../../Geo":294}],360:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CameraVisualizationMode = void 0;
-var CameraVisualizationMode;
-(function (CameraVisualizationMode) {
-    CameraVisualizationMode[CameraVisualizationMode["Default"] = 0] = "Default";
-    CameraVisualizationMode[CameraVisualizationMode["Cluster"] = 1] = "Cluster";
-    CameraVisualizationMode[CameraVisualizationMode["ConnectedComponent"] = 2] = "ConnectedComponent";
-    CameraVisualizationMode[CameraVisualizationMode["Sequence"] = 3] = "Sequence";
-})(CameraVisualizationMode = exports.CameraVisualizationMode || (exports.CameraVisualizationMode = {}));
-exports.default = CameraVisualizationMode;
-
-},{}],361:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
-Object.defineProperty(exports, "CameraVisualizationMode", { enumerable: true, get: function () { return CameraVisualizationMode_1.CameraVisualizationMode; } });
-
-},{"./CameraVisualizationMode":360}],362:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpatialDataCache = void 0;
-var geohash = require("latlon-geohash");
-var pako = require("pako");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Error_1 = require("../../Error");
-var Utils_1 = require("../../Utils");
-var SpatialDataCache = /** @class */ (function () {
-    function SpatialDataCache(graphService) {
-        this._graphService = graphService;
-        this._tiles = {};
-        this._cacheRequests = {};
-        this._clusterReconstructions = {};
-        this._clusterReconstructionTiles = {};
-        this._tileClusters = {};
-        this._cachingTiles$ = {};
-        this._cachingClusterReconstructions$ = {};
-    }
-    SpatialDataCache.prototype.cacheClusterReconstructions$ = function (hash) {
-        var _this = this;
-        if (!this.hasTile(hash)) {
-            throw new Error("Cannot cache reconstructions of a non-existing tile.");
-        }
-        if (this.hasClusterReconstructions(hash)) {
-            throw new Error("Cannot cache reconstructions that already exists.");
-        }
-        if (this.isCachingClusterReconstructions(hash)) {
-            return this._cachingClusterReconstructions$[hash];
-        }
-        var clusterKeys = this.getTile(hash)
-            .filter(function (nd) {
-            return !!nd.clusterKey;
-        })
-            .map(function (nd) {
-            return nd.clusterKey;
-        })
-            .filter(function (v, i, a) {
-            return a.indexOf(v) === i;
-        });
-        this._tileClusters[hash] = clusterKeys;
-        this._cacheRequests[hash] = [];
-        this._cachingClusterReconstructions$[hash] = rxjs_1.from(clusterKeys).pipe(operators_1.mergeMap(function (key) {
-            if (_this._hasClusterReconstruction(key)) {
-                return rxjs_1.of(_this._getClusterReconstruction(key));
-            }
-            return _this._getClusterReconstruction$(key, _this._cacheRequests[hash])
-                .pipe(operators_1.catchError(function (error) {
-                if (error instanceof Error_1.AbortMapillaryError) {
-                    return rxjs_1.empty();
-                }
-                console.error(error);
-                return rxjs_1.empty();
-            }));
-        }, 6), operators_1.filter(function () {
-            return hash in _this._tileClusters;
-        }), operators_1.tap(function (reconstruction) {
-            if (!_this._hasClusterReconstruction(reconstruction.key)) {
-                _this._clusterReconstructions[reconstruction.key] = reconstruction;
-            }
-            if (!(reconstruction.key in _this._clusterReconstructionTiles)) {
-                _this._clusterReconstructionTiles[reconstruction.key] = [];
-            }
-            if (_this._clusterReconstructionTiles[reconstruction.key].indexOf(hash) === -1) {
-                _this._clusterReconstructionTiles[reconstruction.key].push(hash);
-            }
-        }), operators_1.finalize(function () {
-            if (hash in _this._cachingClusterReconstructions$) {
-                delete _this._cachingClusterReconstructions$[hash];
-            }
-            if (hash in _this._cacheRequests) {
-                delete _this._cacheRequests[hash];
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingClusterReconstructions$[hash];
-    };
-    SpatialDataCache.prototype.cacheTile$ = function (hash) {
-        var _this = this;
-        if (hash.length !== 8) {
-            throw new Error("Hash needs to be level 8.");
-        }
-        if (this.hasTile(hash)) {
-            throw new Error("Cannot cache tile that already exists.");
-        }
-        if (this.isCachingTile(hash)) {
-            return this._cachingTiles$[hash];
-        }
-        var bounds = geohash.bounds(hash);
-        var sw = { lat: bounds.sw.lat, lon: bounds.sw.lon };
-        var ne = { lat: bounds.ne.lat, lon: bounds.ne.lon };
-        this._cachingTiles$[hash] = this._graphService.cacheBoundingBox$(sw, ne).pipe(operators_1.catchError(function (error) {
-            console.error(error);
-            return rxjs_1.empty();
-        }), operators_1.map(function (nodes) {
-            return nodes
-                .map(function (n) {
-                return _this._createNodeData(n);
-            });
-        }), operators_1.filter(function () {
-            return !(hash in _this._tiles);
-        }), operators_1.tap(function (nodeData) {
-            var _a;
-            _this._tiles[hash] = [];
-            (_a = _this._tiles[hash]).push.apply(_a, nodeData);
-            delete _this._cachingTiles$[hash];
-        }), operators_1.finalize(function () {
-            if (hash in _this._cachingTiles$) {
-                delete _this._cachingTiles$[hash];
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingTiles$[hash];
-    };
-    SpatialDataCache.prototype.isCachingClusterReconstructions = function (hash) {
-        return hash in this._cachingClusterReconstructions$;
-    };
-    SpatialDataCache.prototype.isCachingTile = function (hash) {
-        return hash in this._cachingTiles$;
-    };
-    SpatialDataCache.prototype.hasClusterReconstructions = function (hash) {
-        if (hash in this._cachingClusterReconstructions$ ||
-            !(hash in this._tileClusters)) {
-            return false;
-        }
-        for (var _i = 0, _a = this._tileClusters[hash]; _i < _a.length; _i++) {
-            var key = _a[_i];
-            if (!(key in this._clusterReconstructions)) {
-                return false;
-            }
-        }
-        return true;
-    };
-    SpatialDataCache.prototype.hasTile = function (hash) {
-        return !(hash in this._cachingTiles$) && hash in this._tiles;
-    };
-    SpatialDataCache.prototype.getClusterReconstructions = function (hash) {
-        var _this = this;
-        return hash in this._tileClusters ?
-            this._tileClusters[hash]
-                .map(function (key) {
-                return _this._clusterReconstructions[key];
-            })
-                .filter(function (reconstruction) {
-                return !!reconstruction;
-            }) :
-            [];
-    };
-    SpatialDataCache.prototype.getTile = function (hash) {
-        return hash in this._tiles ? this._tiles[hash] : [];
-    };
-    SpatialDataCache.prototype.uncache = function (keepHashes) {
-        for (var _i = 0, _a = Object.keys(this._cacheRequests); _i < _a.length; _i++) {
-            var hash = _a[_i];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            for (var _b = 0, _c = this._cacheRequests[hash]; _b < _c.length; _b++) {
-                var request = _c[_b];
-                request.abort();
-            }
-            delete this._cacheRequests[hash];
-        }
-        for (var _d = 0, _e = Object.keys(this._tileClusters); _d < _e.length; _d++) {
-            var hash = _e[_d];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            for (var _f = 0, _g = this._tileClusters[hash]; _f < _g.length; _f++) {
-                var key = _g[_f];
-                if (!(key in this._clusterReconstructionTiles)) {
-                    continue;
-                }
-                var index = this._clusterReconstructionTiles[key].indexOf(hash);
-                if (index === -1) {
-                    continue;
-                }
-                this._clusterReconstructionTiles[key].splice(index, 1);
-                if (this._clusterReconstructionTiles[key].length > 0) {
-                    continue;
-                }
-                delete this._clusterReconstructionTiles[key];
-                delete this._clusterReconstructions[key];
-            }
-            delete this._tileClusters[hash];
-        }
-        for (var _h = 0, _j = Object.keys(this._tiles); _h < _j.length; _h++) {
-            var hash = _j[_h];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            delete this._tiles[hash];
-        }
-    };
-    SpatialDataCache.prototype._createNodeData = function (node) {
-        return {
-            alt: node.alt,
-            cameraProjection: node.cameraProjection,
-            clusterKey: node.clusterKey,
-            focal: node.focal,
-            gpano: node.gpano,
-            height: node.height,
-            k1: node.ck1,
-            k2: node.ck2,
-            key: node.key,
-            lat: node.latLon.lat,
-            lon: node.latLon.lon,
-            mergeCC: node.mergeCC,
-            orientation: node.orientation,
-            originalLat: node.originalLatLon.lat,
-            originalLon: node.originalLatLon.lon,
-            rotation: [node.rotation[0], node.rotation[1], node.rotation[2]],
-            scale: node.scale,
-            sequenceKey: node.sequenceKey,
-            width: node.width,
-        };
-    };
-    SpatialDataCache.prototype._getClusterReconstruction = function (key) {
-        return this._clusterReconstructions[key];
-    };
-    SpatialDataCache.prototype._getClusterReconstruction$ = function (key, requests) {
-        return rxjs_1.Observable.create(function (subscriber) {
-            var xhr = new XMLHttpRequest();
-            xhr.open("GET", Utils_1.Urls.clusterReconstruction(key), true);
-            xhr.responseType = "arraybuffer";
-            xhr.timeout = 15000;
-            xhr.onload = function () {
-                if (!xhr.response) {
-                    subscriber.error(new Error("Cluster reconstruction retreival failed (" + key + ")"));
-                }
-                else {
-                    var inflated = pako.inflate(xhr.response, { to: "string" });
-                    var reconstructions = JSON.parse(inflated);
-                    if (reconstructions.length < 1) {
-                        subscriber.error(new Error("No cluster reconstruction exists (" + key + ")"));
-                    }
-                    var reconstruction = reconstructions[0];
-                    reconstruction.key = key;
-                    subscriber.next(reconstruction);
-                    subscriber.complete();
-                }
-            };
-            xhr.onerror = function () {
-                subscriber.error(new Error("Failed to get cluster reconstruction (" + key + ")"));
-            };
-            xhr.ontimeout = function () {
-                subscriber.error(new Error("Cluster reconstruction request timed out (" + key + ")"));
-            };
-            xhr.onabort = function () {
-                subscriber.error(new Error_1.AbortMapillaryError("Cluster reconstruction request was aborted (" + key + ")"));
-            };
-            requests.push(xhr);
-            xhr.send(null);
-        });
-    };
-    SpatialDataCache.prototype._hasClusterReconstruction = function (key) {
-        return key in this._clusterReconstructions;
-    };
-    return SpatialDataCache;
-}());
-exports.SpatialDataCache = SpatialDataCache;
-exports.default = SpatialDataCache;
-
-},{"../../Error":293,"../../Utils":301,"latlon-geohash":21,"pako":23,"rxjs":43,"rxjs/operators":241}],363:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpatialDataComponent = void 0;
-var geohash = require("latlon-geohash");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var Render_1 = require("../../Render");
-var PlayService_1 = require("../../viewer/PlayService");
-var State_1 = require("../../state/State");
-var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
-var SpatialDataComponent = /** @class */ (function (_super) {
-    __extends(SpatialDataComponent, _super);
-    function SpatialDataComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._cache = new Component_1.SpatialDataCache(navigator.graphService);
-        _this._scene = new Component_1.SpatialDataScene(_this._getDefaultConfiguration());
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._geoCoords = new Geo_1.GeoCoords();
-        return _this;
-    }
-    SpatialDataComponent.prototype._activate = function () {
-        var _this = this;
-        this._earthControlsSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.earthControls;
-        }), operators_1.distinctUntilChanged(), operators_1.withLatestFrom(this._navigator.stateService.state$))
-            .subscribe(function (_a) {
-            var earth = _a[0], state = _a[1];
-            if (earth && state !== State_1.default.Earth) {
-                _this._navigator.stateService.earth();
-            }
-            else if (!earth && state === State_1.default.Earth) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-        var direction$ = this._container.renderService.bearing$.pipe(operators_1.map(function (bearing) {
-            var direction = "";
-            if (bearing > 292.5 || bearing <= 67.5) {
-                direction += "n";
-            }
-            if (bearing > 112.5 && bearing <= 247.5) {
-                direction += "s";
-            }
-            if (bearing > 22.5 && bearing <= 157.5) {
-                direction += "e";
-            }
-            if (bearing > 202.5 && bearing <= 337.5) {
-                direction += "w";
-            }
-            return direction;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        var hash$ = this._navigator.stateService.reference$.pipe(operators_1.tap(function () {
-            _this._scene.uncache();
-        }), operators_1.switchMap(function () {
-            return _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-                return geohash.encode(node.latLon.lat, node.latLon.lon, 8);
-            }), operators_1.distinctUntilChanged());
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequencePlay$ = rxjs_1.combineLatest(this._navigator.playService.playing$, this._navigator.playService.speed$).pipe(operators_1.map(function (_a) {
-            var playing = _a[0], speed = _a[1];
-            return playing && speed > PlayService_1.default.sequenceSpeed;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        var hashes$ = rxjs_1.combineLatest(this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
-            return state === State_1.default.Earth;
-        }), operators_1.distinctUntilChanged()), hash$, sequencePlay$, direction$).pipe(operators_1.distinctUntilChanged(function (_a, _b) {
-            var e1 = _a[0], h1 = _a[1], s1 = _a[2], d1 = _a[3];
-            var e2 = _b[0], h2 = _b[1], s2 = _b[2], d2 = _b[3];
-            if (e1 !== e2) {
-                return false;
-            }
-            if (e1) {
-                return h1 === h2 && s1 === s2;
-            }
-            return h1 === h2 && s1 === s2 && d1 === d2;
-        }), operators_1.concatMap(function (_a) {
-            var earth = _a[0], hash = _a[1], sequencePlay = _a[2], direction = _a[3];
-            if (earth) {
-                return sequencePlay ?
-                    rxjs_1.of([hash]) :
-                    rxjs_1.of(_this._adjacentComponent(hash, 4));
-            }
-            return sequencePlay ?
-                rxjs_1.of([hash, geohash.neighbours(hash)[direction]]) :
-                rxjs_1.of(_this._computeTiles(hash, direction));
-        }), operators_1.publish(), operators_1.refCount());
-        var tile$ = hashes$.pipe(operators_1.switchMap(function (hashes) {
-            return rxjs_1.from(hashes).pipe(operators_1.mergeMap(function (h) {
-                var t$ = _this._cache.hasTile(h) ?
-                    rxjs_1.of(_this._cache.getTile(h)) :
-                    _this._cache.cacheTile$(h);
-                return rxjs_1.combineLatest(rxjs_1.of(h), t$);
-            }, 6));
-        }), operators_1.publish(), operators_1.refCount());
-        this._addTileSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
-            .subscribe(function (_a) {
-            var hash = _a[0][0], reference = _a[1];
-            if (_this._scene.hasTile(hash)) {
-                return;
-            }
-            _this._scene.addTile(_this._computeTileBBox(hash, reference), hash);
-        });
-        this._addNodeSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
-            .subscribe(function (_a) {
-            var _b = _a[0], hash = _b[0], datas = _b[1], reference = _a[1];
-            for (var _i = 0, datas_1 = datas; _i < datas_1.length; _i++) {
-                var data = datas_1[_i];
-                if (_this._scene.hasNode(data.key, hash)) {
-                    continue;
-                }
-                _this._scene.addNode(data, _this._createTransform(data, reference), _this._computeOriginalPosition(data, reference), hash);
-            }
-        });
-        this._addReconstructionSubscription = tile$.pipe(operators_1.concatMap(function (_a) {
-            var hash = _a[0];
-            var reconstructions$;
-            if (_this._cache.hasClusterReconstructions(hash)) {
-                reconstructions$ = rxjs_1.from(_this._cache.getClusterReconstructions(hash));
-            }
-            else if (_this._cache.isCachingClusterReconstructions(hash)) {
-                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash).pipe(operators_1.last(null, {}), operators_1.switchMap(function () {
-                    return rxjs_1.from(_this._cache.getClusterReconstructions(hash));
-                }));
-            }
-            else if (_this._cache.hasTile(hash)) {
-                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash);
-            }
-            else {
-                reconstructions$ = rxjs_1.empty();
-            }
-            return rxjs_1.combineLatest(rxjs_1.of(hash), reconstructions$);
-        }), operators_1.withLatestFrom(this._navigator.stateService.reference$))
-            .subscribe(function (_a) {
-            var _b = _a[0], hash = _b[0], reconstruction = _b[1], reference = _a[1];
-            if (_this._scene.hasClusterReconstruction(reconstruction.key, hash)) {
-                return;
-            }
-            _this._scene.addClusterReconstruction(reconstruction, _this._computeTranslation(reconstruction, reference), hash);
-        });
-        this._cameraVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.camerasVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setCameraVisibility(visible);
-        });
-        this._pointVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.pointsVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setPointVisibility(visible);
-        });
-        this._positionVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.positionsVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setPositionVisibility(visible);
-        });
-        this._tileVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.tilesVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setTileVisibility(visible);
-        });
-        this._ccToModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.connectedComponents === true ?
-                CameraVisualizationMode_1.default.ConnectedComponent :
-                CameraVisualizationMode_1.default.Default;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (mode) {
-            _this.configure({ cameraVisualizationMode: mode });
-        });
-        this._cameraVisualizationModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.cameraVisualizationMode;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (mode) {
-            _this._scene.setCameraVisualizationMode(mode);
-        });
-        this._uncacheSubscription = hash$
-            .subscribe(function (hash) {
-            var keepHashes = _this._adjacentComponent(hash, 4);
-            _this._scene.uncache(keepHashes);
-            _this._cache.uncache(keepHashes);
-        });
-        this._moveSubscription = this._navigator.playService.playing$.pipe(operators_1.switchMap(function (playing) {
-            return playing ?
-                rxjs_1.empty() :
-                _this._container.mouseService.dblClick$;
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$), operators_1.switchMap(function (_a) {
-            var event = _a[0], render = _a[1];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
-            var key = _this._scene.intersectObjects(viewport, render.perspective);
-            return !!key ?
-                _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function () {
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe();
-        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var scene = _this._scene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: scene.needsRender,
-                    render: scene.render.bind(scene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-    };
-    SpatialDataComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._cache.uncache();
-        this._scene.uncache();
-        this._addNodeSubscription.unsubscribe();
-        this._addReconstructionSubscription.unsubscribe();
-        this._addTileSubscription.unsubscribe();
-        this._cameraVisibilitySubscription.unsubscribe();
-        this._earthControlsSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._pointVisibilitySubscription.unsubscribe();
-        this._positionVisibilitySubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._tileVisibilitySubscription.unsubscribe();
-        this._uncacheSubscription.unsubscribe();
-        this._cameraVisualizationModeSubscription.unsubscribe();
-        this._ccToModeSubscription.unsubscribe();
-        this._navigator.stateService.state$.pipe(operators_1.first())
-            .subscribe(function (state) {
-            if (state === State_1.default.Earth) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-    };
-    SpatialDataComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            cameraVisualizationMode: CameraVisualizationMode_1.default.Default,
-            camerasVisible: false,
-            connectedComponents: false,
-            pointsVisible: true,
-            positionsVisible: false,
-            tilesVisible: false,
-        };
-    };
-    SpatialDataComponent.prototype._adjacentComponent = function (hash, depth) {
-        var hashSet = new Set();
-        hashSet.add(hash);
-        this._adjacentComponentRecursive(hashSet, [hash], 0, depth);
-        return this._setToArray(hashSet);
-    };
-    SpatialDataComponent.prototype._adjacentComponentRecursive = function (hashSet, currentHashes, currentDepth, maxDepth) {
-        if (currentDepth === maxDepth) {
-            return;
-        }
-        var neighbours = [];
-        for (var _i = 0, currentHashes_1 = currentHashes; _i < currentHashes_1.length; _i++) {
-            var hash = currentHashes_1[_i];
-            var hashNeighbours = geohash.neighbours(hash);
-            for (var direction in hashNeighbours) {
-                if (!hashNeighbours.hasOwnProperty(direction)) {
-                    continue;
-                }
-                neighbours.push(hashNeighbours[direction]);
-            }
-        }
-        var newHashes = [];
-        for (var _a = 0, neighbours_1 = neighbours; _a < neighbours_1.length; _a++) {
-            var neighbour = neighbours_1[_a];
-            if (!hashSet.has(neighbour)) {
-                hashSet.add(neighbour);
-                newHashes.push(neighbour);
-            }
-        }
-        this._adjacentComponentRecursive(hashSet, newHashes, currentDepth + 1, maxDepth);
-    };
-    SpatialDataComponent.prototype._computeOriginalPosition = function (data, reference) {
-        return this._geoCoords.geodeticToEnu(data.originalLat, data.originalLon, data.alt, reference.lat, reference.lon, reference.alt);
-    };
-    SpatialDataComponent.prototype._computeTileBBox = function (hash, reference) {
-        var bounds = geohash.bounds(hash);
-        var sw = this._geoCoords.geodeticToEnu(bounds.sw.lat, bounds.sw.lon, 0, reference.lat, reference.lon, reference.alt);
-        var ne = this._geoCoords.geodeticToEnu(bounds.ne.lat, bounds.ne.lon, 0, reference.lat, reference.lon, reference.alt);
-        return [sw, ne];
-    };
-    SpatialDataComponent.prototype._createTransform = function (data, reference) {
-        var translation = Geo_1.Geo.computeTranslation({ alt: data.alt, lat: data.lat, lon: data.lon }, data.rotation, reference);
-        var transform = new Geo_1.Transform(data.orientation, data.width, data.height, data.focal, data.scale, data.gpano, data.rotation, translation, undefined, undefined, data.k1, data.k2, data.cameraProjection);
-        return transform;
-    };
-    SpatialDataComponent.prototype._computeTiles = function (hash, direction) {
-        var hashSet = new Set();
-        var directions = ["n", "ne", "e", "se", "s", "sw", "w", "nw"];
-        this._computeTilesRecursive(hashSet, hash, direction, directions, 0, 2);
-        return this._setToArray(hashSet);
-    };
-    SpatialDataComponent.prototype._computeTilesRecursive = function (hashSet, currentHash, direction, directions, currentDepth, maxDepth) {
-        hashSet.add(currentHash);
-        if (currentDepth === maxDepth) {
-            return;
-        }
-        var neighbours = geohash.neighbours(currentHash);
-        var directionIndex = directions.indexOf(direction);
-        var length = directions.length;
-        var directionNeighbours = [
-            neighbours[directions[this._modulo((directionIndex - 1), length)]],
-            neighbours[direction],
-            neighbours[directions[this._modulo((directionIndex + 1), length)]],
-        ];
-        for (var _i = 0, directionNeighbours_1 = directionNeighbours; _i < directionNeighbours_1.length; _i++) {
-            var directionNeighbour = directionNeighbours_1[_i];
-            this._computeTilesRecursive(hashSet, directionNeighbour, direction, directions, currentDepth + 1, maxDepth);
-        }
-    };
-    SpatialDataComponent.prototype._computeTranslation = function (reconstruction, reference) {
-        return this._geoCoords.geodeticToEnu(reconstruction.reference_lla.latitude, reconstruction.reference_lla.longitude, reconstruction.reference_lla.altitude, reference.lat, reference.lon, reference.alt);
-    };
-    SpatialDataComponent.prototype._modulo = function (a, n) {
-        return ((a % n) + n) % n;
-    };
-    SpatialDataComponent.prototype._setToArray = function (s) {
-        var a = [];
-        s.forEach(function (value) {
-            a.push(value);
-        });
-        return a;
-    };
-    SpatialDataComponent.componentName = "spatialData";
-    return SpatialDataComponent;
-}(Component_1.Component));
-exports.SpatialDataComponent = SpatialDataComponent;
-Component_1.ComponentService.register(SpatialDataComponent);
-exports.default = SpatialDataComponent;
-
-},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../state/State":449,"../../viewer/PlayService":481,"./CameraVisualizationMode":360,"latlon-geohash":21,"rxjs":43,"rxjs/operators":241}],364:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpatialDataScene = void 0;
-var THREE = require("three");
-var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
-var SpatialDataScene = /** @class */ (function () {
-    function SpatialDataScene(configuration, scene, raycaster) {
-        this._scene = !!scene ? scene : new THREE.Scene();
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(undefined, undefined, 0.8);
-        this._cameraColors = {};
-        this._needsRender = false;
-        this._interactiveObjects = [];
-        this._nodes = {};
-        this._tiles = {};
-        this._tileClusterReconstructions = {};
-        this._clusterReconstructions = {};
-        this._cameraVisualizationMode = !!configuration.cameraVisualizationMode ?
-            configuration.cameraVisualizationMode :
-            CameraVisualizationMode_1.default.Default;
-        if (this._cameraVisualizationMode === CameraVisualizationMode_1.default.Default &&
-            configuration.connectedComponents === true) {
-            this._cameraVisualizationMode = CameraVisualizationMode_1.default.ConnectedComponent;
-        }
-        this._camerasVisible = configuration.camerasVisible;
-        this._pointsVisible = configuration.pointsVisible;
-        this._positionsVisible = configuration.positionsVisible;
-        this._tilesVisible = configuration.tilesVisible;
-    }
-    Object.defineProperty(SpatialDataScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    SpatialDataScene.prototype.addClusterReconstruction = function (reconstruction, translation, hash) {
-        if (this.hasClusterReconstruction(reconstruction.key, hash)) {
-            return;
-        }
-        var key = reconstruction.key;
-        if (!(key in this._clusterReconstructions)) {
-            this._clusterReconstructions[key] = {
-                points: new THREE.Object3D(),
-                tiles: [],
-            };
-            this._clusterReconstructions[key].points.visible = this._pointsVisible;
-            this._clusterReconstructions[key].points.add(this._createClusterPoints(reconstruction, translation));
-            this._scene.add(this._clusterReconstructions[key].points);
-        }
-        if (this._clusterReconstructions[key].tiles.indexOf(hash) === -1) {
-            this._clusterReconstructions[key].tiles.push(hash);
-        }
-        if (!(hash in this._tileClusterReconstructions)) {
-            this._tileClusterReconstructions[hash] = {
-                keys: [],
-            };
-        }
-        if (this._tileClusterReconstructions[hash].keys.indexOf(key) === -1) {
-            this._tileClusterReconstructions[hash].keys.push(key);
-        }
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.addNode = function (data, transform, originalPosition, hash) {
-        var key = data.key;
-        var clusterKey = data.clusterKey;
-        var sequenceKey = data.sequenceKey;
-        var connectedComponent = !!data.mergeCC ? data.mergeCC.toString() : "";
-        if (this.hasNode(key, hash)) {
-            return;
-        }
-        if (!(hash in this._nodes)) {
-            this._nodes[hash] = {
-                cameraKeys: {},
-                cameras: new THREE.Object3D(),
-                clusters: {},
-                connectedComponents: {},
-                keys: [],
-                positions: new THREE.Object3D(),
-                sequences: {},
-            };
-            this._nodes[hash].cameras.visible = this._camerasVisible;
-            this._nodes[hash].positions.visible = this._positionsVisible;
-            this._scene.add(this._nodes[hash].cameras, this._nodes[hash].positions);
-        }
-        if (!(connectedComponent in this._nodes[hash].connectedComponents)) {
-            this._nodes[hash].connectedComponents[connectedComponent] = [];
-        }
-        if (!(clusterKey in this._nodes[hash].clusters)) {
-            this._nodes[hash].clusters[clusterKey] = [];
-        }
-        if (!(sequenceKey in this._nodes[hash].sequences)) {
-            this._nodes[hash].sequences[sequenceKey] = [];
-        }
-        var camera = this._createCamera(transform);
-        this._nodes[hash].cameras.add(camera);
-        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
-            var child = _a[_i];
-            this._nodes[hash].cameraKeys[child.uuid] = key;
-            this._interactiveObjects.push(child);
-        }
-        this._nodes[hash].connectedComponents[connectedComponent].push(camera);
-        this._nodes[hash].clusters[clusterKey].push(camera);
-        this._nodes[hash].sequences[sequenceKey].push(camera);
-        var id = this._getId(clusterKey, connectedComponent, sequenceKey, this._cameraVisualizationMode);
-        var color = this._getColor(id, this._cameraVisualizationMode);
-        this._setCameraColor(color, camera);
-        this._nodes[hash].positions.add(this._createPosition(transform, originalPosition));
-        this._nodes[hash].keys.push(key);
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.addTile = function (tileBBox, hash) {
-        if (this.hasTile(hash)) {
-            return;
-        }
-        var sw = tileBBox[0];
-        var ne = tileBBox[1];
-        var geometry = new THREE.Geometry();
-        geometry.vertices.push(new THREE.Vector3().fromArray(sw), new THREE.Vector3(sw[0], ne[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(ne), new THREE.Vector3(ne[0], sw[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(sw));
-        var tile = new THREE.Line(geometry, new THREE.LineBasicMaterial());
-        this._tiles[hash] = new THREE.Object3D();
-        this._tiles[hash].visible = this._tilesVisible;
-        this._tiles[hash].add(tile);
-        this._scene.add(this._tiles[hash]);
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.uncache = function (keepHashes) {
-        for (var _i = 0, _a = Object.keys(this._tileClusterReconstructions); _i < _a.length; _i++) {
-            var hash = _a[_i];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            this._disposeReconstruction(hash);
-        }
-        for (var _b = 0, _c = Object.keys(this._nodes); _b < _c.length; _b++) {
-            var hash = _c[_b];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            this._disposeNodes(hash);
-        }
-        for (var _d = 0, _e = Object.keys(this._tiles); _d < _e.length; _d++) {
-            var hash = _e[_d];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            this._disposeTile(hash);
-        }
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.hasClusterReconstruction = function (key, hash) {
-        return key in this._clusterReconstructions &&
-            this._clusterReconstructions[key].tiles.indexOf(hash) !== -1;
-    };
-    SpatialDataScene.prototype.hasTile = function (hash) {
-        return hash in this._tiles;
-    };
-    SpatialDataScene.prototype.hasNode = function (key, hash) {
-        return hash in this._nodes && this._nodes[hash].keys.indexOf(key) !== -1;
-    };
-    SpatialDataScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        if (!this._camerasVisible) {
-            return null;
-        }
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            for (var hash in this._nodes) {
-                if (!this._nodes.hasOwnProperty(hash)) {
-                    continue;
-                }
-                if (intersect.object.uuid in this._nodes[hash].cameraKeys) {
-                    return this._nodes[hash].cameraKeys[intersect.object.uuid];
-                }
-            }
-        }
-        return null;
-    };
-    SpatialDataScene.prototype.setCameraVisibility = function (visible) {
-        if (visible === this._camerasVisible) {
-            return;
-        }
-        for (var hash in this._nodes) {
-            if (!this._nodes.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._nodes[hash].cameras.visible = visible;
-        }
-        this._camerasVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setPointVisibility = function (visible) {
-        if (visible === this._pointsVisible) {
-            return;
-        }
-        for (var key in this._clusterReconstructions) {
-            if (!this._clusterReconstructions.hasOwnProperty(key)) {
-                continue;
-            }
-            this._clusterReconstructions[key].points.visible = visible;
-        }
-        this._pointsVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setPositionVisibility = function (visible) {
-        if (visible === this._positionsVisible) {
-            return;
-        }
-        for (var hash in this._nodes) {
-            if (!this._nodes.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._nodes[hash].positions.visible = visible;
-        }
-        this._positionsVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setTileVisibility = function (visible) {
-        if (visible === this._tilesVisible) {
-            return;
-        }
-        for (var hash in this._tiles) {
-            if (!this._tiles.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._tiles[hash].visible = visible;
-        }
-        this._tilesVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setCameraVisualizationMode = function (mode) {
-        if (mode === this._cameraVisualizationMode) {
-            return;
-        }
-        for (var hash in this._nodes) {
-            if (!this._nodes.hasOwnProperty(hash)) {
-                continue;
-            }
-            var cameras = undefined;
-            if (mode === CameraVisualizationMode_1.default.Cluster) {
-                cameras = this._nodes[hash].clusters;
-            }
-            else if (mode === CameraVisualizationMode_1.default.ConnectedComponent) {
-                cameras = this._nodes[hash].connectedComponents;
-            }
-            else if (mode === CameraVisualizationMode_1.default.Sequence) {
-                cameras = this._nodes[hash].sequences;
-            }
-            else {
-                for (var _i = 0, _a = this._nodes[hash].cameras.children; _i < _a.length; _i++) {
-                    var child = _a[_i];
-                    var color = this._getColor("", mode);
-                    this._setCameraColor(color, child);
-                }
-                continue;
-            }
-            for (var id in cameras) {
-                if (!cameras.hasOwnProperty(id)) {
-                    continue;
-                }
-                var color = this._getColor(id, mode);
-                for (var _b = 0, _c = cameras[id]; _b < _c.length; _b++) {
-                    var camera = _c[_b];
-                    this._setCameraColor(color, camera);
-                }
-            }
-        }
-        this._cameraVisualizationMode = mode;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    SpatialDataScene.prototype._arrayToFloatArray = function (a, columns) {
-        var n = a.length;
-        var f = new Float32Array(n * columns);
-        for (var i = 0; i < n; i++) {
-            var item = a[i];
-            var index = 3 * i;
-            f[index + 0] = item[0];
-            f[index + 1] = item[1];
-            f[index + 2] = item[2];
-        }
-        return f;
-    };
-    SpatialDataScene.prototype._createAxis = function (transform) {
-        var north = transform.unprojectBasic([0.5, 0], 0.22);
-        var south = transform.unprojectBasic([0.5, 1], 0.16);
-        var axis = new THREE.BufferGeometry();
-        axis.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray([north, south], 3), 3));
-        return new THREE.Line(axis, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createCamera = function (transform) {
-        return !!transform.gpano ?
-            this._createPanoCamera(transform) :
-            this._createPrespectiveCamera(transform);
-    };
-    SpatialDataScene.prototype._createDiagonals = function (transform, depth) {
-        var origin = transform.unprojectBasic([0, 0], 0, true);
-        var topLeft = transform.unprojectBasic([0, 0], depth, true);
-        var topRight = transform.unprojectBasic([1, 0], depth, true);
-        var bottomRight = transform.unprojectBasic([1, 1], depth, true);
-        var bottomLeft = transform.unprojectBasic([0, 1], depth, true);
-        var vertices = [
-            origin, topLeft,
-            origin, topRight,
-            origin, bottomRight,
-            origin, bottomLeft,
-        ];
-        var diagonals = new THREE.BufferGeometry();
-        diagonals.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
-        return new THREE.LineSegments(diagonals, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createFrame = function (transform, depth) {
-        var vertices2d = [];
-        vertices2d.push.apply(vertices2d, this._subsample([0, 1], [0, 0], 20));
-        vertices2d.push.apply(vertices2d, this._subsample([0, 0], [1, 0], 20));
-        vertices2d.push.apply(vertices2d, this._subsample([1, 0], [1, 1], 20));
-        var vertices3d = vertices2d
-            .map(function (basic) {
-            return transform.unprojectBasic(basic, depth, true);
-        });
-        var frame = new THREE.BufferGeometry();
-        frame.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices3d, 3), 3));
-        return new THREE.Line(frame, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createLatitude = function (basicY, numVertices, transform) {
-        var positions = new Float32Array((numVertices + 1) * 3);
-        for (var i = 0; i <= numVertices; i++) {
-            var position = transform.unprojectBasic([i / numVertices, basicY], 0.16);
-            var index = 3 * i;
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        var latitude = new THREE.BufferGeometry();
-        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createLongitude = function (basicX, numVertices, transform) {
-        var positions = new Float32Array((numVertices + 1) * 3);
-        for (var i = 0; i <= numVertices; i++) {
-            var position = transform.unprojectBasic([basicX, i / numVertices], 0.16);
-            var index = 3 * i;
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        var latitude = new THREE.BufferGeometry();
-        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createPanoCamera = function (transform) {
-        var camera = new THREE.Object3D();
-        camera.children.push(this._createAxis(transform));
-        camera.children.push(this._createLatitude(0.5, 10, transform));
-        camera.children.push(this._createLongitude(0, 6, transform));
-        camera.children.push(this._createLongitude(0.25, 6, transform));
-        camera.children.push(this._createLongitude(0.5, 6, transform));
-        camera.children.push(this._createLongitude(0.75, 6, transform));
-        return camera;
-    };
-    SpatialDataScene.prototype._createClusterPoints = function (reconstruction, translation) {
-        var points = Object
-            .keys(reconstruction.points)
-            .map(function (key) {
-            return reconstruction.points[key];
-        });
-        var numPoints = points.length;
-        var positions = new Float32Array(numPoints * 3);
-        var colors = new Float32Array(numPoints * 3);
-        for (var i = 0; i < numPoints; i++) {
-            var index = 3 * i;
-            var coords = points[i].coordinates;
-            var point = new THREE.Vector3(coords[0], coords[1], coords[2])
-                .add(new THREE.Vector3().fromArray(translation));
-            positions[index + 0] = point.x;
-            positions[index + 1] = point.y;
-            positions[index + 2] = point.z;
-            var color = points[i].color;
-            colors[index + 0] = color[0] / 255.0;
-            colors[index + 1] = color[1] / 255.0;
-            colors[index + 2] = color[2] / 255.0;
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
-        var material = new THREE.PointsMaterial({
-            size: 0.1,
-            vertexColors: true,
-        });
-        return new THREE.Points(geometry, material);
-    };
-    SpatialDataScene.prototype._createPosition = function (transform, originalPosition) {
-        var computedPosition = transform.unprojectBasic([0, 0], 0);
-        var vertices = [originalPosition, computedPosition];
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
-        return new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: new THREE.Color(1, 0, 0) }));
-    };
-    SpatialDataScene.prototype._createPrespectiveCamera = function (transform) {
-        var depth = 0.2;
-        var camera = new THREE.Object3D();
-        camera.children.push(this._createDiagonals(transform, depth));
-        camera.children.push(this._createFrame(transform, depth));
-        return camera;
-    };
-    SpatialDataScene.prototype._disposeCameras = function (hash) {
-        var tileCameras = this._nodes[hash].cameras;
-        for (var _i = 0, _a = tileCameras.children.slice(); _i < _a.length; _i++) {
-            var camera = _a[_i];
-            for (var _b = 0, _c = camera.children; _b < _c.length; _b++) {
-                var child = _c[_b];
-                child.geometry.dispose();
-                child.material.dispose();
-                var index = this._interactiveObjects.indexOf(child);
-                if (index !== -1) {
-                    this._interactiveObjects.splice(index, 1);
-                }
-                else {
-                    console.warn("Object does not exist (" + child.id + ") for " + hash);
-                }
-            }
-            tileCameras.remove(camera);
-        }
-        this._scene.remove(tileCameras);
-    };
-    SpatialDataScene.prototype._disposePoints = function (hash) {
-        for (var _i = 0, _a = this._tileClusterReconstructions[hash].keys; _i < _a.length; _i++) {
-            var key = _a[_i];
-            if (!(key in this._clusterReconstructions)) {
-                continue;
-            }
-            var index = this._clusterReconstructions[key].tiles.indexOf(hash);
-            if (index === -1) {
-                continue;
-            }
-            this._clusterReconstructions[key].tiles.splice(index, 1);
-            if (this._clusterReconstructions[key].tiles.length > 0) {
-                continue;
-            }
-            for (var _b = 0, _c = this._clusterReconstructions[key].points.children.slice(); _b < _c.length; _b++) {
-                var points = _c[_b];
-                points.geometry.dispose();
-                points.material.dispose();
-            }
-            this._scene.remove(this._clusterReconstructions[key].points);
-            delete this._clusterReconstructions[key];
-        }
-    };
-    SpatialDataScene.prototype._disposePositions = function (hash) {
-        var tilePositions = this._nodes[hash].positions;
-        for (var _i = 0, _a = tilePositions.children.slice(); _i < _a.length; _i++) {
-            var position = _a[_i];
-            position.geometry.dispose();
-            position.material.dispose();
-            tilePositions.remove(position);
-        }
-        this._scene.remove(tilePositions);
-    };
-    SpatialDataScene.prototype._disposeNodes = function (hash) {
-        this._disposeCameras(hash);
-        this._disposePositions(hash);
-        delete this._nodes[hash];
-    };
-    SpatialDataScene.prototype._disposeReconstruction = function (hash) {
-        this._disposePoints(hash);
-        delete this._tileClusterReconstructions[hash];
-    };
-    SpatialDataScene.prototype._disposeTile = function (hash) {
-        var tile = this._tiles[hash];
-        for (var _i = 0, _a = tile.children.slice(); _i < _a.length; _i++) {
-            var line = _a[_i];
-            line.geometry.dispose();
-            line.material.dispose();
-            tile.remove(line);
-        }
-        this._scene.remove(tile);
-        delete this._tiles[hash];
-    };
-    SpatialDataScene.prototype._getColor = function (id, mode) {
-        return mode !== CameraVisualizationMode_1.default.Default && id.length > 0 ?
-            this._getCameraColor(id) :
-            "#FFFFFF";
-    };
-    SpatialDataScene.prototype._getCameraColor = function (id) {
-        if (!(id in this._cameraColors)) {
-            this._cameraColors[id] = this._randomColor();
-        }
-        return this._cameraColors[id];
-    };
-    SpatialDataScene.prototype._getId = function (clusterKey, connectedComponent, sequenceKey, mode) {
-        switch (mode) {
-            case CameraVisualizationMode_1.default.Cluster:
-                return clusterKey;
-            case CameraVisualizationMode_1.default.ConnectedComponent:
-                return connectedComponent;
-            case CameraVisualizationMode_1.default.Sequence:
-                return sequenceKey;
-            default:
-                return "";
-        }
-    };
-    SpatialDataScene.prototype._interpolate = function (a, b, alpha) {
-        return a + alpha * (b - a);
-    };
-    SpatialDataScene.prototype._randomColor = function () {
-        return "hsl(" + Math.floor(360 * Math.random()) + ", 100%, 65%)";
-    };
-    SpatialDataScene.prototype._setCameraColor = function (color, camera) {
-        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
-            var child = _a[_i];
-            child.material.color = new THREE.Color(color);
-        }
-    };
-    SpatialDataScene.prototype._subsample = function (p1, p2, subsamples) {
-        if (subsamples < 1) {
-            return [p1, p2];
-        }
-        var samples = [];
-        for (var i = 0; i <= subsamples + 1; i++) {
-            var p = [];
-            for (var j = 0; j < 3; j++) {
-                p.push(this._interpolate(p1[j], p2[j], i / (subsamples + 1)));
-            }
-            samples.push(p);
-        }
-        return samples;
-    };
-    return SpatialDataScene;
-}());
-exports.SpatialDataScene = SpatialDataScene;
-exports.default = SpatialDataScene;
-
-},{"./CameraVisualizationMode":360,"three":242}],365:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],366:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var GeometryTagError_1 = require("./error/GeometryTagError");
-Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
-var PointGeometry_1 = require("./geometry/PointGeometry");
-Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
-var PointsGeometry_1 = require("./geometry/PointsGeometry");
-Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
-var RectGeometry_1 = require("./geometry/RectGeometry");
-Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
-var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
-Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
-var OutlineTag_1 = require("./tag/OutlineTag");
-Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
-var ExtremePointTag_1 = require("./tag/ExtremePointTag");
-Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
-var SpotTag_1 = require("./tag/SpotTag");
-Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
-var TagDomain_1 = require("./tag/TagDomain");
-Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
-var TagComponent_1 = require("./TagComponent");
-Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
-var TagMode_1 = require("./TagMode");
-Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
-
-},{"./TagComponent":367,"./TagMode":370,"./error/GeometryTagError":374,"./geometry/PointGeometry":376,"./geometry/PointsGeometry":377,"./geometry/PolygonGeometry":378,"./geometry/RectGeometry":379,"./tag/ExtremePointTag":394,"./tag/OutlineTag":398,"./tag/SpotTag":401,"./tag/TagDomain":403}],367:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var when = require("when");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var Render_1 = require("../../Render");
-/**
- * @class TagComponent
- *
- * @classdesc Component for showing and editing tags with different
- * geometries composed from 2D basic image coordinates (see the
- * {@link Viewer} class documentation for more information about coordinate
- * systems).
- *
- * The `add` method is used for adding new tags or replacing
- * tags already in the set. Tags are removed by id.
- *
- * If a tag already in the set has the same
- * id as one of the tags added, the old tag will be removed and
- * the added tag will take its place.
- *
- * The tag component mode can be set to either be non interactive or
- * to be in creating mode of a certain geometry type.
- *
- * The tag properties can be updated at any time and the change will
- * be visibile immediately.
- *
- * Tags are only relevant to a single image because they are based on
- * 2D basic image coordinates. Tags related to a certain image should
- * be removed when the viewer is moved to another node.
- *
- * To retrive and use the tag component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { tag: true } });
- *
- * var tagComponent = viewer.getComponent("tag");
- * ```
- */
-var TagComponent = /** @class */ (function (_super) {
-    __extends(TagComponent, _super);
-    /** @ignore */
-    function TagComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
-        _this._tagScene = new Component_1.TagScene();
-        _this._tagSet = new Component_1.TagSet();
-        _this._tagCreator = new Component_1.TagCreator(_this, navigator);
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._createHandlers = {
-            "CreatePoint": new Component_1.CreatePointHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreatePoints": new Component_1.CreatePointsHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreatePolygon": new Component_1.CreatePolygonHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreateRect": new Component_1.CreateRectHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreateRectDrag": new Component_1.CreateRectDragHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "Default": undefined,
-        };
-        _this._editVertexHandler = new Component_1.EditVertexHandler(_this, container, navigator, _this._viewportCoords, _this._tagSet);
-        _this._renderTags$ = _this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
-            var tags = tagSet.getAll();
-            // ensure that tags are always rendered in the same order
-            // to avoid hover tracking problems on first resize.
-            tags.sort(function (t1, t2) {
-                var id1 = t1.tag.id;
-                var id2 = t2.tag.id;
-                if (id1 < id2) {
-                    return -1;
-                }
-                if (id1 > id2) {
-                    return 1;
-                }
-                return 0;
-            });
-            return tags;
-        }), operators_1.share());
-        _this._tagChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return rxjs_1.merge(tag.tag.changed$, tag.tag.geometryChanged$);
-            }));
-        }), operators_1.share());
-        _this._renderTagGLChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return tag.glObjectsChanged$;
-            }));
-        }), operators_1.share());
-        _this._createGeometryChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.geometryChanged$ :
-                rxjs_1.empty();
-        }), operators_1.share());
-        _this._createGLObjectsChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.glObjectsChanged$ :
-                rxjs_1.empty();
-        }), operators_1.share());
-        _this._creatingConfiguration$ = _this._configuration$.pipe(operators_1.distinctUntilChanged(function (c1, c2) {
-            return c1.mode === c2.mode;
-        }, function (configuration) {
-            return {
-                createColor: configuration.createColor,
-                mode: configuration.mode,
-            };
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        _this._creatingConfiguration$
-            .subscribe(function (configuration) {
-            _this.fire(TagComponent.modechanged, configuration.mode);
-        });
-        return _this;
-    }
-    /**
-     * Add tags to the tag set or replace tags in the tag set.
-     *
-     * @description If a tag already in the set has the same
-     * id as one of the tags added, the old tag will be removed
-     * the added tag will take its place.
-     *
-     * @param {Array<Tag>} tags - Tags to add.
-     *
-     * @example ```tagComponent.add([tag1, tag2]);```
-     */
-    TagComponent.prototype.add = function (tags) {
-        var _this = this;
-        if (this._activated) {
-            this._navigator.stateService.currentTransform$.pipe(operators_1.first())
-                .subscribe(function (transform) {
-                _this._tagSet.add(tags, transform);
-                var renderTags = tags
-                    .map(function (tag) {
-                    return _this._tagSet.get(tag.id);
-                });
-                _this._tagScene.add(renderTags);
-            });
-        }
-        else {
-            this._tagSet.addDeactivated(tags);
-        }
-    };
-    /**
-     * Calculate the smallest rectangle containing all the points
-     * in the points geometry.
-     *
-     * @description The result may be different depending on if the
-     * current node is an equirectangular panorama or not. If the
-     * current node is an equirectangular panorama the rectangle may
-     * wrap the horizontal border of the image.
-     *
-     * @returns {Promise<Array<number>>} Promise to the rectangle
-     * on the format specified for the {@link RectGeometry} in basic
-     * coordinates.
-     */
-    TagComponent.prototype.calculateRect = function (geometry) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.currentTransform$.pipe(operators_1.first(), operators_1.map(function (transform) {
-                return geometry.getRect2d(transform);
-            }))
-                .subscribe(function (rect) {
-                resolve(rect);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Force the creation of a geometry programatically using its
-     * current vertices.
-     *
-     * @description The method only has an effect when the tag
-     * mode is either of the following modes:
-     *
-     * TagMode.CreatePoints
-     * TagMode.CreatePolygon
-     * TagMode.CreateRect
-     * TagMode.CreateRectDrag
-     *
-     * In the case of points or polygon creation, only the created
-     * vertices are used, i.e. the mouse position is disregarded.
-     *
-     * In the case of rectangle creation the position of the mouse
-     * at the time of the method call is used as one of the vertices
-     * defining the rectangle.
-     *
-     * @fires TagComponent.geometrycreated
-     *
-     * @example
-     * ```
-     * tagComponent.on("geometrycreated", function(geometry) {
-     *     console.log(geometry);
-     * });
-     *
-     * tagComponent.create();
-     * ```
-     */
-    TagComponent.prototype.create = function () {
-        this._tagCreator.replayedTag$.pipe(operators_1.first(), operators_1.filter(function (tag) {
-            return !!tag;
-        }))
-            .subscribe(function (tag) {
-            tag.create();
-        });
-    };
-    /**
-     * Change the current tag mode.
-     *
-     * @description Change the tag mode to one of the create modes for creating new geometries.
-     *
-     * @param {TagMode} mode - New tag mode.
-     *
-     * @fires TagComponent#modechanged
-     *
-     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```
-     */
-    TagComponent.prototype.changeMode = function (mode) {
-        this.configure({ mode: mode });
-    };
-    /**
-     * Returns the tag in the tag set with the specified id, or
-     * undefined if the id matches no tag.
-     *
-     * @param {string} tagId - Id of the tag.
-     *
-     * @example ```var tag = tagComponent.get("tagId");```
-     */
-    TagComponent.prototype.get = function (tagId) {
-        if (this._activated) {
-            var renderTag = this._tagSet.get(tagId);
-            return renderTag !== undefined ? renderTag.tag : undefined;
-        }
-        else {
-            return this._tagSet.getDeactivated(tagId);
-        }
-    };
-    /**
-     * Returns an array of all tags.
-     *
-     * @example ```var tags = tagComponent.getAll();```
-     */
-    TagComponent.prototype.getAll = function () {
-        if (this.activated) {
-            return this._tagSet
-                .getAll()
-                .map(function (renderTag) {
-                return renderTag.tag;
-            });
-        }
-        else {
-            return this._tagSet.getAllDeactivated();
-        }
-    };
-    /**
-     * Returns an array of tag ids for tags that contain the specified point.
-     *
-     * @description The pixel point must lie inside the polygon or rectangle
-     * of an added tag for the tag id to be returned. Tag ids for
-     * tags that do not have a fill will also be returned if the point is inside
-     * the geometry of the tag. Tags with point geometries can not be retrieved.
-     *
-     * No tag ids will be returned for polygons rendered in cropped panoramas or
-     * rectangles rendered in panoramas.
-     *
-     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the tag component.
-     *
-     * If no tag at exist the pixel point, an empty array will be returned.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {Promise<Array<string>>} Promise to the ids of the tags that
-     * contain the specified pixel point.
-     *
-     * @example
-     * ```
-     * tagComponent.getTagIdsAt([100, 100])
-     *     .then((tagIds) => { console.log(tagIds); });
-     * ```
-     */
-    TagComponent.prototype.getTagIdsAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var ids = _this._tagScene.intersectObjects(viewport, render.perspective);
-                return ids;
-            }))
-                .subscribe(function (ids) {
-                resolve(ids);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Check if a tag exist in the tag set.
-     *
-     * @param {string} tagId - Id of the tag.
-     *
-     * @example ```var tagExists = tagComponent.has("tagId");```
-     */
-    TagComponent.prototype.has = function (tagId) {
-        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);
-    };
-    /**
-     * Remove tags with the specified ids from the tag set.
-     *
-     * @param {Array<string>} tagIds - Ids for tags to remove.
-     *
-     * @example ```tagComponent.remove(["id-1", "id-2"]);```
-     */
-    TagComponent.prototype.remove = function (tagIds) {
-        if (this._activated) {
-            this._tagSet.remove(tagIds);
-            this._tagScene.remove(tagIds);
-        }
-        else {
-            this._tagSet.removeDeactivated(tagIds);
-        }
-    };
-    /**
-     * Remove all tags from the tag set.
-     *
-     * @example ```tagComponent.removeAll();```
-     */
-    TagComponent.prototype.removeAll = function () {
-        if (this._activated) {
-            this._tagSet.removeAll();
-            this._tagScene.removeAll();
-        }
-        else {
-            this._tagSet.removeAllDeactivated();
-        }
-    };
-    TagComponent.prototype._activate = function () {
-        var _this = this;
-        this._editVertexHandler.enable();
-        var handlerGeometryCreated$ = rxjs_1.from(Object.keys(this._createHandlers)).pipe(operators_1.map(function (key) {
-            return _this._createHandlers[key];
-        }), operators_1.filter(function (handler) {
-            return !!handler;
-        }), operators_1.mergeMap(function (handler) {
-            return handler.geometryCreated$;
-        }), operators_1.share());
-        this._fireGeometryCreatedSubscription = handlerGeometryCreated$
-            .subscribe(function (geometry) {
-            _this.fire(TagComponent.geometrycreated, geometry);
-        });
-        this._fireCreateGeometryEventSubscription = this._tagCreator.tag$.pipe(operators_1.skipWhile(function (tag) {
-            return tag == null;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (tag) {
-            var eventType = tag != null ?
-                TagComponent.creategeometrystart :
-                TagComponent.creategeometryend;
-            _this.fire(eventType, _this);
-        });
-        this._handlerStopCreateSubscription = handlerGeometryCreated$
-            .subscribe(function () {
-            _this.changeMode(Component_1.TagMode.Default);
-        });
-        this._handlerEnablerSubscription = this._creatingConfiguration$
-            .subscribe(function (configuration) {
-            _this._disableCreateHandlers();
-            var mode = Component_1.TagMode[configuration.mode];
-            var handler = _this._createHandlers[mode];
-            if (!!handler) {
-                handler.enable();
-            }
-        });
-        this._fireTagsChangedSubscription = this._renderTags$
-            .subscribe(function () {
-            _this.fire(TagComponent.tagschanged, _this);
-        });
-        this._stopCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.aborted$.pipe(operators_1.map(function () { return null; })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); });
-        this._setGLCreateTagSubscription = this._tagCreator.tag$
-            .subscribe(function (tag) {
-            if (_this._tagScene.hasCreateTag()) {
-                _this._tagScene.removeCreateTag();
-            }
-            if (tag != null) {
-                _this._tagScene.addCreateTag(tag);
-            }
-        });
-        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateCreateTagObjects(tag);
-        });
-        this._updateGLObjectsSubscription = this._renderTagGLChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateObjects(tag);
-        });
-        this._updateTagSceneSubscription = this._tagChanged$
-            .subscribe(function () {
-            _this._tagScene.update();
-        });
-        this._domSubscription = rxjs_1.combineLatest(this._renderTags$.pipe(operators_1.startWith([]), operators_1.tap(function () {
-            _this._container.domRenderer.render$.next({
-                name: _this._name,
-                vnode: _this._tagDomRenderer.clear(),
-            });
-        })), this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.pipe(operators_1.startWith(null)), rxjs_1.merge(this._tagCreator.tag$, this._createGeometryChanged$).pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
-            var renderTags = _a[0], rc = _a[1], atlas = _a[2], size = _a[3], ct = _a[5];
-            return {
-                name: _this._name,
-                vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._glSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var tagScene = _this._tagScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: tagScene.needsRender,
-                    render: tagScene.render.bind(tagScene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        this._navigator.stateService.currentTransform$.pipe(operators_1.first())
-            .subscribe(function (transform) {
-            _this._tagSet.activate(transform);
-            _this._tagScene.add(_this._tagSet.getAll());
-        });
-    };
-    TagComponent.prototype._deactivate = function () {
-        this._editVertexHandler.disable();
-        this._disableCreateHandlers();
-        this._tagScene.clear();
-        this._tagSet.deactivate();
-        this._tagCreator.delete$.next(null);
-        this._updateGLObjectsSubscription.unsubscribe();
-        this._updateTagSceneSubscription.unsubscribe();
-        this._stopCreateSubscription.unsubscribe();
-        this._setGLCreateTagSubscription.unsubscribe();
-        this._createGLObjectsChangedSubscription.unsubscribe();
-        this._domSubscription.unsubscribe();
-        this._glSubscription.unsubscribe();
-        this._fireCreateGeometryEventSubscription.unsubscribe();
-        this._fireGeometryCreatedSubscription.unsubscribe();
-        this._fireTagsChangedSubscription.unsubscribe();
-        this._handlerStopCreateSubscription.unsubscribe();
-        this._handlerEnablerSubscription.unsubscribe();
-        this._container.element.classList.remove("component-tag-create");
-    };
-    TagComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            createColor: 0xFFFFFF,
-            indicatePointsCompleter: true,
-            mode: Component_1.TagMode.Default,
-        };
-    };
-    TagComponent.prototype._disableCreateHandlers = function () {
-        var createHandlers = this._createHandlers;
-        for (var key in createHandlers) {
-            if (!createHandlers.hasOwnProperty(key)) {
-                continue;
-            }
-            var handler = createHandlers[key];
-            if (!!handler) {
-                handler.disable();
-            }
-        }
-    };
-    /** @inheritdoc */
-    TagComponent.componentName = "tag";
-    /**
-     * Event fired when an interaction to create a geometry ends.
-     *
-     * @description A create interaction can by a geometry being created
-     * or by the creation being aborted.
-     *
-     * @event TagComponent#creategeometryend
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("creategeometryend", function(component) {
-     *     console.log(component);
-     * });
-     * ```
-     */
-    TagComponent.creategeometryend = "creategeometryend";
-    /**
-     * Event fired when an interaction to create a geometry starts.
-     *
-     * @description A create interaction starts when the first vertex
-     * is created in the geometry.
-     *
-     * @event TagComponent#creategeometrystart
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("creategeometrystart", function(component) {
-     *     console.log(component);
-     * });
-     * ```
-     */
-    TagComponent.creategeometrystart = "creategeometrystart";
-    /**
-     * Event fired when the create mode is changed.
-     *
-     * @event TagComponent#modechanged
-     * @type {TagMode} Tag mode
-     * @example
-     * ```
-     * tagComponent.on("modechanged", function(mode) {
-     *     console.log(mode);
-     * });
-     * ```
-     */
-    TagComponent.modechanged = "modechanged";
-    /**
-     * Event fired when a geometry has been created.
-     *
-     * @event TagComponent#geometrycreated
-     * @type {Geometry} Created geometry.
-     * @example
-     * ```
-     * tagComponent.on("geometrycreated", function(geometry) {
-     *     console.log(geometry);
-     * });
-     * ```
-     */
-    TagComponent.geometrycreated = "geometrycreated";
-    /**
-     * Event fired when the tags collection has changed.
-     *
-     * @event TagComponent#tagschanged
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("tagschanged", function(component) {
-     *     console.log(component.getAll());
-     * });
-     * ```
-     */
-    TagComponent.tagschanged = "tagschanged";
-    return TagComponent;
-}(Component_1.Component));
-exports.TagComponent = TagComponent;
-Component_1.ComponentService.register(TagComponent);
-exports.default = TagComponent;
-
-},{"../../Component":291,"../../Geo":294,"../../Render":297,"rxjs":43,"rxjs/operators":241,"when":288}],368:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagCreator = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../Component");
-var TagCreator = /** @class */ (function () {
-    function TagCreator(component, navigator) {
-        this._component = component;
-        this._navigator = navigator;
-        this._tagOperation$ = new rxjs_1.Subject();
-        this._createPoints$ = new rxjs_1.Subject();
-        this._createPolygon$ = new rxjs_1.Subject();
-        this._createRect$ = new rxjs_1.Subject();
-        this._delete$ = new rxjs_1.Subject();
-        this._tag$ = this._tagOperation$.pipe(operators_1.scan(function (tag, operation) {
-            return operation(tag);
-        }, null), operators_1.share());
-        this._replayedTag$ = this._tag$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._replayedTag$.subscribe();
-        this._createPoints$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function () {
-                var geometry = new Component_1.PointsGeometry([
-                    [coord[0], coord[1]],
-                    [coord[0], coord[1]],
-                ]);
-                return new Component_1.ExtremePointCreateTag(geometry, {
-                    color: conf.createColor,
-                    indicateCompleter: conf.indicatePointsCompleter,
-                }, transform);
-            };
-        }))
-            .subscribe(this._tagOperation$);
-        this._createRect$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function () {
-                var geometry = new Component_1.RectGeometry([
-                    coord[0],
-                    coord[1],
-                    coord[0],
-                    coord[1],
-                ]);
-                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
-            };
-        }))
-            .subscribe(this._tagOperation$);
-        this._createPolygon$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function () {
-                var geometry = new Component_1.PolygonGeometry([
-                    [coord[0], coord[1]],
-                    [coord[0], coord[1]],
-                    [coord[0], coord[1]],
-                ]);
-                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
-            };
-        }))
-            .subscribe(this._tagOperation$);
-        this._delete$.pipe(operators_1.map(function () {
-            return function () {
-                return null;
-            };
-        }))
-            .subscribe(this._tagOperation$);
-    }
-    Object.defineProperty(TagCreator.prototype, "createRect$", {
-        get: function () {
-            return this._createRect$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "createPolygon$", {
-        get: function () {
-            return this._createPolygon$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "createPoints$", {
-        get: function () {
-            return this._createPoints$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "delete$", {
-        get: function () {
-            return this._delete$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "tag$", {
-        get: function () {
-            return this._tag$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "replayedTag$", {
-        get: function () {
-            return this._replayedTag$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return TagCreator;
-}());
-exports.TagCreator = TagCreator;
-exports.default = TagCreator;
-
-},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],369:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagDOMRenderer = void 0;
-var vd = require("virtual-dom");
-var TagDOMRenderer = /** @class */ (function () {
-    function TagDOMRenderer() {
-    }
-    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
-        var vNodes = [];
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size));
-        }
-        if (createTag != null) {
-            vNodes = vNodes.concat(createTag.getDOMObjects(camera, size));
-        }
-        return vd.h("div.TagContainer", {}, vNodes);
-    };
-    TagDOMRenderer.prototype.clear = function () {
-        return vd.h("div", {}, []);
-    };
-    return TagDOMRenderer;
-}());
-exports.TagDOMRenderer = TagDOMRenderer;
-
-},{"virtual-dom":247}],370:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagMode = void 0;
-/**
- * Enumeration for tag modes
- * @enum {number}
- * @readonly
- * @description Modes for the interaction in the tag component.
- */
-var TagMode;
-(function (TagMode) {
-    /**
-     * Disables creating tags.
-     */
-    TagMode[TagMode["Default"] = 0] = "Default";
-    /**
-     * Create a point geometry through a click.
-     */
-    TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint";
-    /**
-     * Create a points geometry through clicks.
-     */
-    TagMode[TagMode["CreatePoints"] = 2] = "CreatePoints";
-    /**
-     * Create a polygon geometry through clicks.
-     */
-    TagMode[TagMode["CreatePolygon"] = 3] = "CreatePolygon";
-    /**
-     * Create a rect geometry through clicks.
-     */
-    TagMode[TagMode["CreateRect"] = 4] = "CreateRect";
-    /**
-     * Create a rect geometry through drag.
-     *
-     * @description Claims the mouse which results in mouse handlers like
-     * drag pan and scroll zoom becoming inactive.
-     */
-    TagMode[TagMode["CreateRectDrag"] = 5] = "CreateRectDrag";
-})(TagMode = exports.TagMode || (exports.TagMode = {}));
-exports.default = TagMode;
-
-},{}],371:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagOperation = void 0;
-var TagOperation;
-(function (TagOperation) {
-    TagOperation[TagOperation["None"] = 0] = "None";
-    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
-    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
-})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
-exports.default = TagOperation;
-
-},{}],372:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagScene = void 0;
-var THREE = require("three");
-var TagScene = /** @class */ (function () {
-    function TagScene(scene, raycaster) {
-        this._createTag = null;
-        this._needsRender = false;
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-        this._objectTags = {};
-        this._retrievableObjects = [];
-        this._tags = {};
-    }
-    Object.defineProperty(TagScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    TagScene.prototype.add = function (tags) {
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            if (tag.tag.id in this._tags) {
-                this._remove(tag.tag.id);
-            }
-            this._add(tag);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.addCreateTag = function (tag) {
-        for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.add(object);
-        }
-        this._createTag = { tag: tag, objects: tag.glObjects };
-        this._needsRender = true;
-    };
-    TagScene.prototype.clear = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = false;
-    };
-    TagScene.prototype.get = function (id) {
-        return this.has(id) ? this._tags[id].tag : undefined;
-    };
-    TagScene.prototype.has = function (id) {
-        return id in this._tags;
-    };
-    TagScene.prototype.hasCreateTag = function () {
-        return this._createTag != null;
-    };
-    TagScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._retrievableObjects);
-        var intersectedIds = [];
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectTags) {
-                intersectedIds.push(this._objectTags[intersect.object.uuid]);
-            }
-        }
-        return intersectedIds;
-    };
-    TagScene.prototype.remove = function (ids) {
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.removeAll = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.removeCreateTag = function () {
-        if (this._createTag == null) {
-            return;
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        this._createTag.tag.dispose();
-        this._createTag = null;
-        this._needsRender = true;
-    };
-    TagScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    TagScene.prototype.update = function () {
-        this._needsRender = true;
-    };
-    TagScene.prototype.updateCreateTagObjects = function (tag) {
-        if (this._createTag.tag !== tag) {
-            throw new Error("Create tags do not have the same reference.");
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) {
-            var object = _c[_b];
-            this._scene.add(object);
-        }
-        this._createTag.objects = tag.glObjects;
-        this._needsRender = true;
-    };
-    TagScene.prototype.updateObjects = function (tag) {
-        var id = tag.tag.id;
-        if (this._tags[id].tag !== tag) {
-            throw new Error("Tags do not have the same reference.");
-        }
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        delete this._tags[id];
-        this._add(tag);
-        this._needsRender = true;
-    };
-    TagScene.prototype._add = function (tag) {
-        var id = tag.tag.id;
-        var tagObjects = { tag: tag, objects: [], retrievableObjects: [] };
-        this._tags[id] = tagObjects;
-        for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) {
-            var object = _a[_i];
-            tagObjects.objects.push(object);
-            this._scene.add(object);
-        }
-        for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            tagObjects.retrievableObjects.push(retrievableObject);
-            this._retrievableObjects.push(retrievableObject);
-            this._objectTags[retrievableObject.uuid] = tag.tag.id;
-        }
-    };
-    TagScene.prototype._remove = function (id) {
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        tagObjects.tag.dispose();
-        delete this._tags[id];
-    };
-    TagScene.prototype._removeObjects = function (tagObjects) {
-        for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            var index = this._retrievableObjects.indexOf(retrievableObject);
-            if (index !== -1) {
-                this._retrievableObjects.splice(index, 1);
-            }
-        }
-    };
-    return TagScene;
-}());
-exports.TagScene = TagScene;
-exports.default = TagScene;
-
-},{"three":242}],373:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagSet = void 0;
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../Component");
-var ExtremePointTag_1 = require("./tag/ExtremePointTag");
-var ExtremePointRenderTag_1 = require("./tag/ExtremePointRenderTag");
-var TagSet = /** @class */ (function () {
-    function TagSet() {
-        this._active = false;
-        this._hash = {};
-        this._hashDeactivated = {};
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(TagSet.prototype, "active", {
-        get: function () {
-            return this._active;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TagSet.prototype, "changed$", {
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    TagSet.prototype.activate = function (transform) {
-        if (this._active) {
-            return;
-        }
-        for (var id in this._hashDeactivated) {
-            if (!this._hashDeactivated.hasOwnProperty(id)) {
-                continue;
-            }
-            var tag = this._hashDeactivated[id];
-            this._add(tag, transform);
-        }
-        this._hashDeactivated = {};
-        this._active = true;
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.deactivate = function () {
-        if (!this._active) {
-            return;
-        }
-        for (var id in this._hash) {
-            if (!this._hash.hasOwnProperty(id)) {
-                continue;
-            }
-            this._hashDeactivated[id] = this._hash[id].tag;
-        }
-        this._hash = {};
-        this._active = false;
-    };
-    TagSet.prototype.add = function (tags, transform) {
-        this._assertActivationState(true);
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            this._add(tag, transform);
-        }
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.addDeactivated = function (tags) {
-        this._assertActivationState(false);
-        for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) {
-            var tag = tags_2[_i];
-            if (!(tag instanceof Component_1.OutlineTag ||
-                tag instanceof Component_1.SpotTag ||
-                tag instanceof ExtremePointTag_1.default)) {
-                throw new Error("Tag type not supported");
-            }
-            this._hashDeactivated[tag.id] = tag;
-        }
-    };
-    TagSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id] : undefined;
-    };
-    TagSet.prototype.getAll = function () {
-        var hash = this._hash;
-        return Object.keys(hash)
-            .map(function (id) {
-            return hash[id];
-        });
-    };
-    TagSet.prototype.getAllDeactivated = function () {
-        var hashDeactivated = this._hashDeactivated;
-        return Object.keys(hashDeactivated)
-            .map(function (id) {
-            return hashDeactivated[id];
-        });
-    };
-    TagSet.prototype.getDeactivated = function (id) {
-        return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined;
-    };
-    TagSet.prototype.has = function (id) {
-        return id in this._hash;
-    };
-    TagSet.prototype.hasDeactivated = function (id) {
-        return id in this._hashDeactivated;
-    };
-    TagSet.prototype.remove = function (ids) {
-        this._assertActivationState(true);
-        var hash = this._hash;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            delete hash[id];
-        }
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.removeAll = function () {
-        this._assertActivationState(true);
-        this._hash = {};
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.removeAllDeactivated = function () {
-        this._assertActivationState(false);
-        this._hashDeactivated = {};
-    };
-    TagSet.prototype.removeDeactivated = function (ids) {
-        this._assertActivationState(false);
-        var hashDeactivated = this._hashDeactivated;
-        for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) {
-            var id = ids_2[_i];
-            if (!(id in hashDeactivated)) {
-                continue;
-            }
-            delete hashDeactivated[id];
-        }
-    };
-    TagSet.prototype._add = function (tag, transform) {
-        if (tag instanceof Component_1.OutlineTag) {
-            this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform);
-        }
-        else if (tag instanceof Component_1.SpotTag) {
-            this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform);
-        }
-        else if (tag instanceof ExtremePointTag_1.default) {
-            this._hash[tag.id] = new ExtremePointRenderTag_1.default(tag, transform);
-        }
-        else {
-            throw new Error("Tag type not supported");
-        }
-    };
-    TagSet.prototype._assertActivationState = function (should) {
-        if (should !== this._active) {
-            throw new Error("Tag set not in correct state for operation.");
-        }
-    };
-    return TagSet;
-}());
-exports.TagSet = TagSet;
-exports.default = TagSet;
-
-},{"../../Component":291,"./tag/ExtremePointRenderTag":393,"./tag/ExtremePointTag":394,"rxjs":43}],374:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GeometryTagError = void 0;
-var Error_1 = require("../../../Error");
-var GeometryTagError = /** @class */ (function (_super) {
-    __extends(GeometryTagError, _super);
-    function GeometryTagError(message) {
-        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
-        Object.setPrototypeOf(_this, GeometryTagError.prototype);
-        _this.name = "GeometryTagError";
-        return _this;
-    }
-    return GeometryTagError;
-}(Error_1.MapillaryError));
-exports.GeometryTagError = GeometryTagError;
-exports.default = Error_1.MapillaryError;
-
-},{"../../../Error":293}],375:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Geometry = void 0;
-var rxjs_1 = require("rxjs");
-/**
- * @class Geometry
- * @abstract
- * @classdesc Represents a geometry.
- */
-var Geometry = /** @class */ (function () {
-    /**
-     * Create a geometry.
-     *
-     * @constructor
-     * @ignore
-     */
-    function Geometry() {
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(Geometry.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         *
-         * @description Emits the geometry itself every time the geometry
-         * has changed.
-         *
-         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return Geometry;
-}());
-exports.Geometry = Geometry;
-exports.default = Geometry;
-
-},{"rxjs":43}],376:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PointGeometry = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class PointGeometry
- *
- * @classdesc Represents a point geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicPoint = [0.5, 0.7];
- * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
- * ```
- */
-var PointGeometry = /** @class */ (function (_super) {
-    __extends(PointGeometry, _super);
-    /**
-     * Create a point geometry.
-     *
-     * @constructor
-     * @param {Array<number>} point - An array representing the basic coordinates of
-     * the point.
-     *
-     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
-     */
-    function PointGeometry(point) {
-        var _this = _super.call(this) || this;
-        var x = point[0];
-        var y = point[1];
-        if (x < 0 || x > 1 || y < 0 || y > 1) {
-            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-        }
-        _this._point = point.slice();
-        return _this;
-    }
-    Object.defineProperty(PointGeometry.prototype, "point", {
-        /**
-         * Get point property.
-         * @returns {Array<number>} Array representing the basic coordinates of the point.
-         */
-        get: function () {
-            return this._point;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
-     * basic coordinates of the point itself.
-     *
-     * @returns {Array<number>} 2D basic coordinates representing the centroid.
-     * @ignore
-     */
-    PointGeometry.prototype.getCentroid2d = function () {
-        return this._point.slice();
-    };
-    /**
-     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
-     * world coordinates of the point itself.
-     *
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @returns {Array<number>} 3D world coordinates representing the centroid.
-     * @ignore
-     */
-    PointGeometry.prototype.getCentroid3d = function (transform) {
-        return transform.unprojectBasic(this._point, 200);
-    };
-    /**
-     * Set the centroid of the point, i.e. the point coordinates.
-     *
-     * @param {Array<number>} value - The new value of the centroid.
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @ignore
-     */
-    PointGeometry.prototype.setCentroid2d = function (value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        this._point[0] = changed[0];
-        this._point[1] = changed[1];
-        this._notifyChanged$.next(this);
-    };
-    return PointGeometry;
-}(Component_1.Geometry));
-exports.PointGeometry = PointGeometry;
-exports.default = PointGeometry;
-
-},{"../../../Component":291}],377:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PointsGeometry = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class PointsGeometry
- *
- * @classdesc Represents a point set in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var points = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5]];
- * var pointsGeometry = new Mapillary.TagComponent.PointsGeometry(points);
- * ```
- */
-var PointsGeometry = /** @class */ (function (_super) {
-    __extends(PointsGeometry, _super);
-    /**
-     * Create a points geometry.
-     *
-     * @constructor
-     * @param {Array<Array<number>>} points - Array of 2D points on the basic coordinate
-     * system. The number of points must be greater than or equal to two.
-     *
-     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
-     */
-    function PointsGeometry(points) {
-        var _this = _super.call(this) || this;
-        var pointsLength = points.length;
-        if (pointsLength < 2) {
-            throw new Component_1.GeometryTagError("A points geometry must have two or more positions.");
-        }
-        _this._points = [];
-        for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {
-            var point = points_1[_i];
-            if (point[0] < 0 || point[0] > 1 ||
-                point[1] < 0 || point[1] > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates of points must be on the interval [0, 1].");
-            }
-            _this._points.push(point.slice());
-        }
-        return _this;
-    }
-    Object.defineProperty(PointsGeometry.prototype, "points", {
-        /**
-         * Get points property.
-         * @returns {Array<Array<number>>} Array of 2d points.
-         */
-        get: function () {
-            return this._points;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Add a point to the point set.
-     *
-     * @param {Array<number>} point - Point to add.
-     * @ignore
-     */
-    PointsGeometry.prototype.addPoint2d = function (point) {
-        var clamped = [
-            Math.max(0, Math.min(1, point[0])),
-            Math.max(0, Math.min(1, point[1])),
-        ];
-        this._points.push(clamped);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the coordinates of a point from the point set representation of the geometry.
-     *
-     * @param {number} index - Point index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the point.
-     * @ignore
-     */
-    PointsGeometry.prototype.getPoint2d = function (index) {
-        return this._points[index].slice();
-    };
-    /**
-     * Remove a point from the point set.
-     *
-     * @param {number} index - The index of the point to remove.
-     * @ignore
-     */
-    PointsGeometry.prototype.removePoint2d = function (index) {
-        if (index < 0 ||
-            index >= this._points.length ||
-            this._points.length < 3) {
-            throw new Component_1.GeometryTagError("Index for removed point must be valid.");
-        }
-        this._points.splice(index, 1);
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.setVertex2d = function (index, value, transform) {
-        this.setPoint2d(index, value, transform);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.setPoint2d = function (index, value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        this._points[index] = changed;
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints3d(this._points, transform);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getPoint3d = function (index, transform) {
-        return transform.unprojectBasic(this._points[index], 200);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getPoints2d = function () {
-        return this._points.slice();
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getCentroid2d = function (transform) {
-        if (!transform) {
-            throw new Component_1.GeometryTagError("Get centroid must be called with a transform for points geometries.");
-        }
-        var _a = this.getRect2d(transform), minX = _a[0], minY = _a[1], maxX = _a[2], maxY = _a[3];
-        var centroidX = minX < maxX ?
-            (minX + maxX) / 2 :
-            ((minX + maxX + 1) / 2) % 1;
-        var centroidY = (minY + maxY) / 2;
-        return [centroidX, centroidY];
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /** @ignore */
-    PointsGeometry.prototype.getRect2d = function (transform) {
-        var minX = 1;
-        var maxX = 0;
-        var minY = 1;
-        var maxY = 0;
-        var points = this._points;
-        for (var _i = 0, points_2 = points; _i < points_2.length; _i++) {
-            var point = points_2[_i];
-            if (point[0] < minX) {
-                minX = point[0];
-            }
-            if (point[0] > maxX) {
-                maxX = point[0];
-            }
-            if (point[1] < minY) {
-                minY = point[1];
-            }
-            if (point[1] > maxY) {
-                maxY = point[1];
-            }
-        }
-        if (transform.fullPano) {
-            var indices = [];
-            for (var i = 0; i < points.length; i++) {
-                indices[i] = i;
-            }
-            indices.sort(function (a, b) {
-                return points[a][0] < points[b][0] ?
-                    -1 :
-                    points[a][0] > points[b][0] ?
-                        1 :
-                        a < b ? -1 : 1;
-            });
-            var maxDistanceX = points[indices[0]][0] + 1 - points[indices[indices.length - 1]][0];
-            var leftMostIndex = 0;
-            for (var i = 0; i < indices.length - 1; i++) {
-                var index1 = indices[i];
-                var index2 = indices[i + 1];
-                var distanceX = points[index2][0] - points[index1][0];
-                if (distanceX > maxDistanceX) {
-                    maxDistanceX = distanceX;
-                    leftMostIndex = i + 1;
-                }
-            }
-            if (leftMostIndex > 0) {
-                minX = points[indices[leftMostIndex]][0];
-                maxX = points[indices[leftMostIndex - 1]][0];
-            }
-        }
-        return [minX, minY, maxX, maxY];
-    };
-    /** @ignore */
-    PointsGeometry.prototype.setCentroid2d = function (value, transform) {
-        throw new Error("Not implemented");
-    };
-    PointsGeometry.prototype._getPoints3d = function (points2d, transform) {
-        return points2d
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    return PointsGeometry;
-}(Component_1.Geometry));
-exports.PointsGeometry = PointsGeometry;
-exports.default = PointsGeometry;
-
-},{"../../../Component":291}],378:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PolygonGeometry = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class PolygonGeometry
- *
- * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
- * All polygons and holes provided to the constructor needs to be closed.
- *
- * @example
- * ```
- * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
- * var polygonGeometry = new Mapillary.TagComponent.PolygonGeometry(basicPolygon);
- * ```
- */
-var PolygonGeometry = /** @class */ (function (_super) {
-    __extends(PolygonGeometry, _super);
-    /**
-     * Create a polygon geometry.
-     *
-     * @constructor
-     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
-     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
-     * Each array of holes vertices must be closed.
-     *
-     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
-     */
-    function PolygonGeometry(polygon, holes) {
-        var _this = _super.call(this) || this;
-        var polygonLength = polygon.length;
-        if (polygonLength < 3) {
-            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
-        }
-        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
-            polygon[0][1] !== polygon[polygonLength - 1][1]) {
-            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
-        }
-        _this._polygon = [];
-        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
-            var vertex = polygon_1[_i];
-            if (vertex[0] < 0 || vertex[0] > 1 ||
-                vertex[1] < 0 || vertex[1] > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
-            }
-            _this._polygon.push(vertex.slice());
-        }
-        _this._holes = [];
-        if (holes == null) {
-            return _this;
-        }
-        for (var i = 0; i < holes.length; i++) {
-            var hole = holes[i];
-            var holeLength = hole.length;
-            if (holeLength < 3) {
-                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
-            }
-            if (hole[0][0] !== hole[holeLength - 1][0] ||
-                hole[0][1] !== hole[holeLength - 1][1]) {
-                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
-            }
-            _this._holes.push([]);
-            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
-                var vertex = hole_1[_a];
-                if (vertex[0] < 0 || vertex[0] > 1 ||
-                    vertex[1] < 0 || vertex[1] > 1) {
-                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
-                }
-                _this._holes[i].push(vertex.slice());
-            }
-        }
-        return _this;
-    }
-    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
-        /**
-         * Get polygon property.
-         * @returns {Array<Array<number>>} Closed 2d polygon.
-         */
-        get: function () {
-            return this._polygon;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(PolygonGeometry.prototype, "holes", {
-        /**
-         * Get holes property.
-         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
-         */
-        get: function () {
-            return this._holes;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Add a vertex to the polygon by appending it after the last vertex.
-     *
-     * @param {Array<number>} vertex - Vertex to add.
-     * @ignore
-     */
-    PolygonGeometry.prototype.addVertex2d = function (vertex) {
-        var clamped = [
-            Math.max(0, Math.min(1, vertex[0])),
-            Math.max(0, Math.min(1, vertex[1])),
-        ];
-        this._polygon.splice(this._polygon.length - 1, 0, clamped);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getVertex2d = function (index) {
-        return this._polygon[index].slice();
-    };
-    /**
-     * Remove a vertex from the polygon.
-     *
-     * @param {number} index - The index of the vertex to remove.
-     * @ignore
-     */
-    PolygonGeometry.prototype.removeVertex2d = function (index) {
-        if (index < 0 ||
-            index >= this._polygon.length ||
-            this._polygon.length < 4) {
-            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
-        }
-        if (index > 0 && index < this._polygon.length - 1) {
-            this._polygon.splice(index, 1);
-        }
-        else {
-            this._polygon.splice(0, 1);
-            this._polygon.pop();
-            var closing = this._polygon[0].slice();
-            this._polygon.push(closing);
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        if (index === 0 || index === this._polygon.length - 1) {
-            this._polygon[0] = changed.slice();
-            this._polygon[this._polygon.length - 1] = changed.slice();
-        }
-        else {
-            this._polygon[index] = changed.slice();
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
-        var xs = this._polygon.map(function (point) { return point[0]; });
-        var ys = this._polygon.map(function (point) { return point[1]; });
-        var minX = Math.min.apply(Math, xs);
-        var maxX = Math.max.apply(Math, xs);
-        var minY = Math.min.apply(Math, ys);
-        var maxY = Math.max.apply(Math, ys);
-        var centroid = this.getCentroid2d();
-        var minTranslationX = -minX;
-        var maxTranslationX = 1 - maxX;
-        var minTranslationY = -minY;
-        var maxTranslationY = 1 - maxY;
-        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
-        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
-            var point = _a[_i];
-            point[0] += translationX;
-            point[1] += translationY;
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints3d(this._subsample(this._polygon), transform);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._polygon[index], 200);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertices2d = function () {
-        return this._polygon.slice();
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertices3d = function (transform) {
-        return this._getPoints3d(this._polygon, transform);
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry. Line segments between vertices will possibly be subsampled
-     * resulting in a larger number of points than the total number of vertices.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getHolePoints3d = function (transform) {
-        var _this = this;
-        return this._holes
-            .map(function (hole2d) {
-            return _this._getPoints3d(_this._subsample(hole2d), transform);
-        });
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
-        var _this = this;
-        return this._holes
-            .map(function (hole2d) {
-            return _this._getPoints3d(hole2d, transform);
-        });
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getCentroid2d = function () {
-        var polygon = this._polygon;
-        var area = 0;
-        var centroidX = 0;
-        var centroidY = 0;
-        for (var i = 0; i < polygon.length - 1; i++) {
-            var xi = polygon[i][0];
-            var yi = polygon[i][1];
-            var xi1 = polygon[i + 1][0];
-            var yi1 = polygon[i + 1][1];
-            var a = xi * yi1 - xi1 * yi;
-            area += a;
-            centroidX += (xi + xi1) * a;
-            centroidY += (yi + yi1) * a;
-        }
-        area /= 2;
-        centroidX /= 6 * area;
-        centroidY /= 6 * area;
-        return [centroidX, centroidY];
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.get3dDomainTriangles3d = function (transform) {
-        var _this = this;
-        return this._triangulate(this._project(this._polygon, transform), this.getVertices3d(transform), this._holes
-            .map(function (hole2d) {
-            return _this._project(hole2d, transform);
-        }), this.getHoleVertices3d(transform));
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getTriangles3d = function (transform) {
-        var _this = this;
-        if (transform.fullPano) {
-            return this._triangulatePano(this._polygon.slice(), this.holes.slice(), transform);
-        }
-        var points2d = this._project(this._subsample(this._polygon), transform);
-        var points3d = this.getPoints3d(transform);
-        var holes2d = this._holes
-            .map(function (hole) {
-            return _this._project(_this._subsample(hole), transform);
-        });
-        var holes3d = this.getHolePoints3d(transform);
-        return this._triangulate(points2d, points3d, holes2d, holes3d);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoleOfInaccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._polygon.slice());
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice());
-        return transform.unprojectBasic(pole2d, 200);
-    };
-    PolygonGeometry.prototype._getPoints3d = function (points2d, transform) {
-        return points2d
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    return PolygonGeometry;
-}(Component_1.VertexGeometry));
-exports.PolygonGeometry = PolygonGeometry;
-exports.default = PolygonGeometry;
-
-},{"../../../Component":291}],379:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RectGeometry = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class RectGeometry
- *
- * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicRect = [0.5, 0.3, 0.7, 0.4];
- * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
- * ```
- */
-var RectGeometry = /** @class */ (function (_super) {
-    __extends(RectGeometry, _super);
-    /**
-     * Create a rectangle geometry.
-     *
-     * @constructor
-     * @param {Array<number>} rect - An array representing the top-left and bottom-right
-     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
-     *
-     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
-     */
-    function RectGeometry(rect) {
-        var _this = _super.call(this) || this;
-        if (rect[1] > rect[3]) {
-            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
-        }
-        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
-            var coord = rect_1[_i];
-            if (coord < 0 || coord > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-            }
-        }
-        _this._anchorIndex = undefined;
-        _this._rect = rect.slice(0, 4);
-        _this._inverted = _this._rect[0] > _this._rect[2];
-        return _this;
-    }
-    Object.defineProperty(RectGeometry.prototype, "anchorIndex", {
-        /**
-         * Get anchor index property.
-         *
-         * @returns {number} Index representing the current anchor property if
-         * achoring indexing has been initialized. If anchor indexing has not been
-         * initialized or has been terminated undefined will be returned.
-         * @ignore
-         */
-        get: function () {
-            return this._anchorIndex;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RectGeometry.prototype, "inverted", {
-        /**
-         * Get inverted property.
-         *
-         * @returns {boolean} Boolean determining whether the rect geometry is
-         * inverted. For panoramas the rect geometrye may be inverted.
-         * @ignore
-         */
-        get: function () {
-            return this._inverted;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RectGeometry.prototype, "rect", {
-        /**
-         * Get rect property.
-         *
-         * @returns {Array<number>} Array representing the top-left and bottom-right
-         * corners of the rectangle in basic coordinates.
-         */
-        get: function () {
-            return this._rect;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Initialize anchor indexing to enable setting opposite vertex.
-     *
-     * @param {number} [index] - The index of the vertex to use as anchor.
-     *
-     * @throws {Error} If anchor indexing has already been initialized.
-     * @throws {Error} If index is not valid (0 to 3).
-     * @ignore
-     */
-    RectGeometry.prototype.initializeAnchorIndexing = function (index) {
-        if (this._anchorIndex !== undefined) {
-            throw new Error("Anchor indexing is already initialized.");
-        }
-        if (index < 0 || index > 3) {
-            throw new Error("Invalid anchor index: " + index + ".");
-        }
-        this._anchorIndex = index === undefined ? 0 : index;
-    };
-    /**
-     * Terminate anchor indexing to disable setting pposite vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.terminateAnchorIndexing = function () {
-        this._anchorIndex = undefined;
-    };
-    /**
-     * Set the value of the vertex opposite to the anchor in the polygon
-     * representation of the rectangle.
-     *
-     * @description Setting the opposite vertex may change the anchor index.
-     *
-     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     *
-     * @throws {Error} When anchor indexing has not been initialized.
-     * @ignore
-     */
-    RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) {
-        if (this._anchorIndex === undefined) {
-            throw new Error("Anchor indexing needs to be initialized.");
-        }
-        var changed = [
-            Math.max(0, Math.min(1, opposite[0])),
-            Math.max(0, Math.min(1, opposite[1])),
-        ];
-        var original = this._rect.slice();
-        var anchor = this._anchorIndex === 0 ? [original[0], original[3]] :
-            this._anchorIndex === 1 ? [original[0], original[1]] :
-                this._anchorIndex === 2 ? [original[2], original[1]] :
-                    [original[2], original[3]];
-        if (transform.fullPano) {
-            var deltaX = this._anchorIndex < 2 ?
-                changed[0] - original[2] :
-                changed[0] - original[0];
-            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
-                // right side passes boundary rightward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
-                // left side passes right side and boundary rightward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {
-                this._inverted = false;
-                if (anchor[0] > changed[0]) {
-                    // left side passes boundary rightward
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-                else {
-                    // left side passes right side and boundary rightward
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-            }
-            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
-                // left side passes boundary leftward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
-                // right side passes left side and boundary leftward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {
-                this._inverted = false;
-                if (anchor[0] > changed[0]) {
-                    // right side passes boundary leftward
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-                else {
-                    // right side passes left side and boundary leftward
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-            }
-            else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {
-                // inverted and right side passes left side completing a loop
-                this._inverted = false;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {
-                // inverted and left side passes right side completing a loop
-                this._inverted = false;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (this._inverted) {
-                // if still inverted only top and bottom can switch
-                if (this._anchorIndex < 2) {
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-                else {
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-            }
-            else {
-                // if still not inverted treat as non full pano
-                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
-                    this._anchorIndex = 0;
-                }
-                else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
-                    this._anchorIndex = 1;
-                }
-                else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
-                    this._anchorIndex = 2;
-                }
-                else {
-                    this._anchorIndex = 3;
-                }
-            }
-            var rect = [];
-            if (this._anchorIndex === 0) {
-                rect[0] = anchor[0];
-                rect[1] = changed[1];
-                rect[2] = changed[0];
-                rect[3] = anchor[1];
-            }
-            else if (this._anchorIndex === 1) {
-                rect[0] = anchor[0];
-                rect[1] = anchor[1];
-                rect[2] = changed[0];
-                rect[3] = changed[1];
-            }
-            else if (this._anchorIndex === 2) {
-                rect[0] = changed[0];
-                rect[1] = anchor[1];
-                rect[2] = anchor[0];
-                rect[3] = changed[1];
-            }
-            else {
-                rect[0] = changed[0];
-                rect[1] = changed[1];
-                rect[2] = anchor[0];
-                rect[3] = anchor[1];
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-            if (rect[1] > rect[3]) {
-                rect[1] = original[1];
-                rect[3] = original[3];
-            }
-            this._rect[0] = rect[0];
-            this._rect[1] = rect[1];
-            this._rect[2] = rect[2];
-            this._rect[3] = rect[3];
-        }
-        else {
-            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
-                this._anchorIndex = 0;
-            }
-            else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
-                this._anchorIndex = 1;
-            }
-            else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
-                this._anchorIndex = 2;
-            }
-            else {
-                this._anchorIndex = 3;
-            }
-            var rect = [];
-            if (this._anchorIndex === 0) {
-                rect[0] = anchor[0];
-                rect[1] = changed[1];
-                rect[2] = changed[0];
-                rect[3] = anchor[1];
-            }
-            else if (this._anchorIndex === 1) {
-                rect[0] = anchor[0];
-                rect[1] = anchor[1];
-                rect[2] = changed[0];
-                rect[3] = changed[1];
-            }
-            else if (this._anchorIndex === 2) {
-                rect[0] = changed[0];
-                rect[1] = anchor[1];
-                rect[2] = anchor[0];
-                rect[3] = changed[1];
-            }
-            else {
-                rect[0] = changed[0];
-                rect[1] = changed[1];
-                rect[2] = anchor[0];
-                rect[3] = anchor[1];
-            }
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-            if (rect[1] > rect[3]) {
-                rect[1] = original[1];
-                rect[3] = original[3];
-            }
-            this._rect[0] = rect[0];
-            this._rect[1] = rect[1];
-            this._rect[2] = rect[2];
-            this._rect[3] = rect[3];
-        }
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Set the value of a vertex in the polygon representation of the rectangle.
-     *
-     * @description The polygon is defined to have the first vertex at the
-     * bottom-left corner with the rest of the vertices following in clockwise order.
-     *
-     * @param {number} index - The index of the vertex to be set.
-     * @param {Array<number>} value - The new value of the vertex.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @ignore
-     */
-    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var original = this._rect.slice();
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        var rect = [];
-        if (index === 0) {
-            rect[0] = changed[0];
-            rect[1] = original[1];
-            rect[2] = original[2];
-            rect[3] = changed[1];
-        }
-        else if (index === 1) {
-            rect[0] = changed[0];
-            rect[1] = changed[1];
-            rect[2] = original[2];
-            rect[3] = original[3];
-        }
-        else if (index === 2) {
-            rect[0] = original[0];
-            rect[1] = changed[1];
-            rect[2] = changed[0];
-            rect[3] = original[3];
-        }
-        else if (index === 3) {
-            rect[0] = original[0];
-            rect[1] = original[1];
-            rect[2] = changed[0];
-            rect[3] = changed[1];
-        }
-        if (transform.fullPano) {
-            var passingBoundaryLeftward = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
-                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
-            var passingBoundaryRightward = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
-                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
-            if (passingBoundaryLeftward || passingBoundaryRightward) {
-                this._inverted = !this._inverted;
-            }
-            else {
-                if (rect[0] - original[0] < -0.25) {
-                    rect[0] = original[0];
-                }
-                if (rect[2] - original[2] > 0.25) {
-                    rect[2] = original[2];
-                }
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        else {
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        if (rect[1] > rect[3]) {
-            rect[1] = original[1];
-            rect[3] = original[3];
-        }
-        this._rect[0] = rect[0];
-        this._rect[1] = rect[1];
-        this._rect[2] = rect[2];
-        this._rect[3] = rect[3];
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    RectGeometry.prototype.setCentroid2d = function (value, transform) {
-        var original = this._rect.slice();
-        var x0 = original[0];
-        var x1 = this._inverted ? original[2] + 1 : original[2];
-        var y0 = original[1];
-        var y1 = original[3];
-        var centerX = x0 + (x1 - x0) / 2;
-        var centerY = y0 + (y1 - y0) / 2;
-        var translationX = 0;
-        if (transform.gpano != null &&
-            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
-            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
-        }
-        else {
-            var minTranslationX = -x0;
-            var maxTranslationX = 1 - x1;
-            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
-        }
-        var minTranslationY = -y0;
-        var maxTranslationY = 1 - y1;
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
-        this._rect[0] = original[0] + translationX;
-        this._rect[1] = original[1] + translationY;
-        this._rect[2] = original[2] + translationX;
-        this._rect[3] = original[3] + translationY;
-        if (this._rect[0] < 0) {
-            this._rect[0] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[0] > 1) {
-            this._rect[0] -= 1;
-            this._inverted = !this._inverted;
-        }
-        if (this._rect[2] < 0) {
-            this._rect[2] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[2] > 1) {
-            this._rect[2] -= 1;
-            this._inverted = !this._inverted;
-        }
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the 3D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
-     * representing the rectangle.
-     * @ignore
-     */
-    RectGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints2d()
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The method shifts the right side
-     * coordinates of the rectangle by one unit to ensure that the vertices are ordered
-     * clockwise.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertex2d = function (index) {
-        return this._rectToVertices2d(this._rect)[index];
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The coordinates will not be shifted
-     * so they may not appear in clockwise order when layed out on the plane.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.getNonAdjustedVertex2d = function (index) {
-        return this._rectToNonAdjustedVertices2d(this._rect)[index];
-    };
-    /**
-     * Get a vertex from the polygon representation of the 3D coordinates for the
-     * vertices of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the vertices of the geometry.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
-    };
-    /**
-     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
-     * the rectangle vertices.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertices2d = function () {
-        return this._rectToVertices2d(this._rect);
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the rectangle vertices.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertices3d = function (transform) {
-        return this._rectToVertices2d(this._rect)
-            .map(function (vertex) {
-            return transform.unprojectBasic(vertex, 200);
-        });
-    };
-    /** @ignore */
-    RectGeometry.prototype.getCentroid2d = function () {
-        var rect = this._rect;
-        var x0 = rect[0];
-        var x1 = this._inverted ? rect[2] + 1 : rect[2];
-        var y0 = rect[1];
-        var y1 = rect[3];
-        var centroidX = (x0 + x1) / 2;
-        var centroidY = (y0 + y1) / 2;
-        return [centroidX, centroidY];
-    };
-    /** @ignore */
-    RectGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /**
-     * @ignore
-     */
-    RectGeometry.prototype.getPoleOfInaccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
-    };
-    /** @ignore */
-    RectGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
-        return transform.unprojectBasic(pole2d, 200);
-    };
-    /** @ignore */
-    RectGeometry.prototype.getTriangles3d = function (transform) {
-        return transform.fullPano ?
-            [] :
-            this._triangulate(this._project(this._getPoints2d(), transform), this.getPoints3d(transform));
-    };
-    /**
-     * Check if a particular bottom-right value is valid according to the current
-     * rectangle coordinates.
-     *
-     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
-     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
-     * are valid.
-     * @ignore
-     */
-    RectGeometry.prototype.validate = function (bottomRight) {
-        var rect = this._rect;
-        if (!this._inverted && bottomRight[0] < rect[0] ||
-            bottomRight[0] - rect[2] > 0.25 ||
-            bottomRight[1] < rect[1]) {
-            return false;
-        }
-        return true;
-    };
-    /**
-     * Get the 2D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype._getPoints2d = function () {
-        var vertices2d = this._rectToVertices2d(this._rect);
-        var sides = vertices2d.length - 1;
-        var sections = 10;
-        var points2d = [];
-        for (var i = 0; i < sides; ++i) {
-            var startX = vertices2d[i][0];
-            var startY = vertices2d[i][1];
-            var endX = vertices2d[i + 1][0];
-            var endY = vertices2d[i + 1][1];
-            var intervalX = (endX - startX) / (sections - 1);
-            var intervalY = (endY - startY) / (sections - 1);
-            for (var j = 0; j < sections; ++j) {
-                var point = [
-                    startX + j * intervalX,
-                    startY + j * intervalY,
-                ];
-                points2d.push(point);
-            }
-        }
-        return points2d;
-    };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-left corner going
-     * clockwise.
-     *
-     * @description The method shifts the right side coordinates of the rectangle
-     * by one unit to ensure that the vertices are ordered clockwise.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
-    };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-left corner going
-     * clockwise.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The coordinates will not be shifted
-     * to ensure that the vertices are ordered clockwise when layed out on the plane.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToNonAdjustedVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [rect[2], rect[1]],
-            [rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
-    };
-    return RectGeometry;
-}(Component_1.VertexGeometry));
-exports.RectGeometry = RectGeometry;
-exports.default = RectGeometry;
-
-},{"../../../Component":291}],380:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-var __spreadArrays = (this && this.__spreadArrays) || function () {
-    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
-    for (var r = Array(s), k = 0, i = 0; i < il; i++)
-        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
-            r[k] = a[j];
-    return r;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.VertexGeometry = void 0;
-var earcut_1 = require("earcut");
-var martinez = require("martinez-polygon-clipping");
-var polylabel = require("@mapbox/polylabel");
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class VertexGeometry
- * @abstract
- * @classdesc Represents a vertex geometry.
- */
-var VertexGeometry = /** @class */ (function (_super) {
-    __extends(VertexGeometry, _super);
-    /**
-     * Create a vertex geometry.
-     *
-     * @constructor
-     * @ignore
-     */
-    function VertexGeometry() {
-        var _this = _super.call(this) || this;
-        _this._subsampleThreshold = 0.005;
-        return _this;
-    }
-    /**
-     * Finds the polygon pole of inaccessibility, the most distant internal
-     * point from the polygon outline.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @returns {Array<number>} Point of inaccessibility.
-     * @ignore
-     */
-    VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) {
-        var pole2d = polylabel([points2d], 3e-2);
-        return pole2d;
-    };
-    VertexGeometry.prototype._project = function (points2d, transform) {
-        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectSfM([0, 0], 10));
-        return this._deunproject(points2d, transform, camera);
-    };
-    VertexGeometry.prototype._subsample = function (points2d, threshold) {
-        if (threshold === void 0) { threshold = this._subsampleThreshold; }
-        var subsampled = [];
-        var length = points2d.length;
-        for (var index = 0; index < length; index++) {
-            var p1 = points2d[index];
-            var p2 = points2d[(index + 1) % length];
-            subsampled.push(p1);
-            var dist = Math.sqrt(Math.pow((p2[0] - p1[0]), 2) + Math.pow((p2[1] - p1[1]), 2));
-            var subsamples = Math.floor(dist / threshold);
-            var coeff = 1 / (subsamples + 1);
-            for (var i = 1; i <= subsamples; i++) {
-                var alpha = i * coeff;
-                var subsample = [
-                    (1 - alpha) * p1[0] + alpha * p2[0],
-                    (1 - alpha) * p1[1] + alpha * p2[1],
-                ];
-                subsampled.push(subsample);
-            }
-        }
-        return subsampled;
-    };
-    /**
-     * Triangulates a 2d polygon and returns the triangle
-     * representation as a flattened array of 3d points.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
-     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
-     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
-     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
-     * @ignore
-     */
-    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
-        var data = [points2d.slice(0, -1)];
-        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
-            var hole2d = _a[_i];
-            data.push(hole2d.slice(0, -1));
-        }
-        var points = points3d.slice(0, -1);
-        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
-            var hole3d = _c[_b];
-            points = points.concat(hole3d.slice(0, -1));
-        }
-        var flattened = earcut_1.default.flatten(data);
-        var indices = earcut_1.default(flattened.vertices, flattened.holes, flattened.dimensions);
-        var triangles = [];
-        for (var i = 0; i < indices.length; ++i) {
-            var point = points[indices[i]];
-            triangles.push(point[0]);
-            triangles.push(point[1]);
-            triangles.push(point[2]);
-        }
-        return triangles;
-    };
-    VertexGeometry.prototype._triangulatePano = function (points2d, holes2d, transform) {
-        var triangles = [];
-        var epsilon = 1e-9;
-        var subareasX = 3;
-        var subareasY = 3;
-        for (var x = 0; x < subareasX; x++) {
-            for (var y = 0; y < subareasY; y++) {
-                var epsilonX0 = x === 0 ? -epsilon : epsilon;
-                var epsilonY0 = y === 0 ? -epsilon : epsilon;
-                var x0 = x / subareasX + epsilonX0;
-                var y0 = y / subareasY + epsilonY0;
-                var x1 = (x + 1) / subareasX + epsilon;
-                var y1 = (y + 1) / subareasY + epsilon;
-                var bbox2d = [
-                    [x0, y0],
-                    [x0, y1],
-                    [x1, y1],
-                    [x1, y0],
-                    [x0, y0],
-                ];
-                var lookat2d = [
-                    (2 * x + 1) / (2 * subareasX),
-                    (2 * y + 1) / (2 * subareasY),
-                ];
-                triangles.push.apply(triangles, this._triangulateSubarea(points2d, holes2d, bbox2d, lookat2d, transform));
-            }
-        }
-        return triangles;
-    };
-    VertexGeometry.prototype._unproject = function (points2d, transform, distance) {
-        if (distance === void 0) { distance = 200; }
-        return points2d
-            .map(function (point) {
-            return transform.unprojectBasic(point, distance);
-        });
-    };
-    VertexGeometry.prototype._createCamera = function (upVector, position, lookAt) {
-        var camera = new THREE.Camera();
-        camera.up.copy(new THREE.Vector3().fromArray(upVector));
-        camera.position.copy(new THREE.Vector3().fromArray(position));
-        camera.lookAt(new THREE.Vector3().fromArray(lookAt));
-        camera.updateMatrix();
-        camera.updateMatrixWorld(true);
-        return camera;
-    };
-    VertexGeometry.prototype._deunproject = function (points2d, transform, camera) {
-        return points2d
-            .map(function (point2d) {
-            var pointWorld = transform.unprojectBasic(point2d, 10000);
-            var pointCamera = new THREE.Vector3(pointWorld[0], pointWorld[1], pointWorld[2])
-                .applyMatrix4(camera.matrixWorldInverse);
-            return [pointCamera.x / pointCamera.z, pointCamera.y / pointCamera.z];
-        });
-    };
-    VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) {
-        var intersections = martinez.intersection(__spreadArrays([points2d], holes2d), [bbox2d]);
-        if (!intersections) {
-            return [];
-        }
-        var triangles = [];
-        var threshold = this._subsampleThreshold;
-        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectBasic(lookat2d, 10));
-        for (var _i = 0, intersections_1 = intersections; _i < intersections_1.length; _i++) {
-            var intersection = intersections_1[_i];
-            var subsampledPolygon2d = this._subsample(intersection[0], threshold);
-            var polygon2d = this._deunproject(subsampledPolygon2d, transform, camera);
-            var polygon3d = this._unproject(subsampledPolygon2d, transform);
-            var polygonHoles2d = [];
-            var polygonHoles3d = [];
-            for (var i = 1; i < intersection.length; i++) {
-                var subsampledHole2d = this._subsample(intersection[i], threshold);
-                var hole2d = this._deunproject(subsampledHole2d, transform, camera);
-                var hole3d = this._unproject(subsampledHole2d, transform);
-                polygonHoles2d.push(hole2d);
-                polygonHoles3d.push(hole3d);
-            }
-            triangles.push.apply(triangles, this._triangulate(polygon2d, polygon3d, polygonHoles2d, polygonHoles3d));
-        }
-        return triangles;
-    };
-    return VertexGeometry;
-}(Component_1.Geometry));
-exports.VertexGeometry = VertexGeometry;
-exports.default = VertexGeometry;
-
-},{"../../../Component":291,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":242}],381:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateHandlerBase = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../../Component");
-var CreateHandlerBase = /** @class */ (function (_super) {
-    __extends(CreateHandlerBase, _super);
-    function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._tagCreator = tagCreator;
-        _this._geometryCreated$ = new rxjs_1.Subject();
-        return _this;
-    }
-    Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", {
-        get: function () {
-            return this._geometryCreated$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CreateHandlerBase.prototype._enable = function () {
-        this._enableCreate();
-        this._container.element.classList.add("component-tag-create");
-    };
-    CreateHandlerBase.prototype._disable = function () {
-        this._container.element.classList.remove("component-tag-create");
-        this._disableCreate();
-    };
-    CreateHandlerBase.prototype._validateBasic = function (basic) {
-        var x = basic[0];
-        var y = basic[1];
-        return 0 <= x && x <= 1 && 0 <= y && y <= 1;
-    };
-    CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) {
-        var _this = this;
-        return mouseEvent$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var event = _a[0], camera = _a[1], transform = _a[2];
-            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-        }));
-    };
-    return CreateHandlerBase;
-}(Component_1.TagHandlerBase));
-exports.CreateHandlerBase = CreateHandlerBase;
-exports.default = CreateHandlerBase;
-
-},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],382:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreatePointHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreatePointHandler = /** @class */ (function (_super) {
-    __extends(CreatePointHandler, _super);
-    function CreatePointHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreatePointHandler.prototype._enableCreate = function () {
-        this._container.mouseService.deferPixels(this._name, 4);
-        this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.filter(this._validateBasic), operators_1.map(function (basic) {
-            return new Component_1.PointGeometry(basic);
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreatePointHandler.prototype._disableCreate = function () {
-        this._container.mouseService.undeferPixels(this._name);
-        this._geometryCreatedSubscription.unsubscribe();
-    };
-    CreatePointHandler.prototype._getNameExtension = function () {
-        return "create-point";
-    };
-    return CreatePointHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreatePointHandler = CreatePointHandler;
-exports.default = CreatePointHandler;
-
-},{"../../../Component":291,"rxjs/operators":241}],383:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreatePointsHandler = void 0;
-var Component_1 = require("../../../Component");
-var CreatePointsHandler = /** @class */ (function (_super) {
-    __extends(CreatePointsHandler, _super);
-    function CreatePointsHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    Object.defineProperty(CreatePointsHandler.prototype, "_create$", {
-        get: function () {
-            return this._tagCreator.createPoints$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CreatePointsHandler.prototype._addPoint = function (tag, basicPoint) {
-        tag.geometry.addPoint2d(basicPoint);
-    };
-    CreatePointsHandler.prototype._getNameExtension = function () {
-        return "create-points";
-    };
-    CreatePointsHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
-        tag.geometry.setPoint2d((tag.geometry).points.length - 1, basicPoint, transform);
-    };
-    return CreatePointsHandler;
-}(Component_1.CreateVertexHandler));
-exports.CreatePointsHandler = CreatePointsHandler;
-exports.default = CreatePointsHandler;
-
-},{"../../../Component":291}],384:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreatePolygonHandler = void 0;
-var Component_1 = require("../../../Component");
-var CreatePolygonHandler = /** @class */ (function (_super) {
-    __extends(CreatePolygonHandler, _super);
-    function CreatePolygonHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    Object.defineProperty(CreatePolygonHandler.prototype, "_create$", {
-        get: function () {
-            return this._tagCreator.createPolygon$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) {
-        tag.addPoint(basicPoint);
-    };
-    CreatePolygonHandler.prototype._getNameExtension = function () {
-        return "create-polygon";
-    };
-    CreatePolygonHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
-        tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basicPoint, transform);
-    };
-    return CreatePolygonHandler;
-}(Component_1.CreateVertexHandler));
-exports.CreatePolygonHandler = CreatePolygonHandler;
-exports.default = CreatePolygonHandler;
-
-},{"../../../Component":291}],385:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateRectDragHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateRectDragHandler = /** @class */ (function (_super) {
-    __extends(CreateRectDragHandler, _super);
-    function CreateRectDragHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreateRectDragHandler.prototype._enableCreate = function () {
-        var _this = this;
-        this._container.mouseService.claimMouse(this._name, 2);
-        this._deleteSubscription = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function (transform) { return null; }), operators_1.skip(1))
-            .subscribe(this._tagCreator.delete$);
-        this._createSubscription = this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDragStart$)).pipe(operators_1.filter(this._validateBasic))
-            .subscribe(this._tagCreator.createRect$);
-        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
-            return !!tag;
-        }))
-            .subscribe(function (tag) {
-            tag.geometry.initializeAnchorIndexing();
-        });
-        var basicMouse$ = rxjs_1.combineLatest(rxjs_1.merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)), this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], event = _b[0], camera = _b[1], transform = _a[1];
-            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-        }));
-        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1], transform = _a[2];
-            tag.geometry.setOppositeVertex2d(basicPoint, transform);
-        });
-        var basicMouseDragEnd$ = this._container.mouseService.mouseDragEnd$.pipe(operators_1.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)).pipe(operators_1.filter(this._validateBasic)), function (event, basicPoint) {
-            return basicPoint;
-        }), operators_1.share());
-        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouseDragEnd$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1];
-            var rectGeometry = tag.geometry;
-            if (!rectGeometry.validate(basicPoint)) {
-                basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
-            }
-            tag.addPoint(basicPoint);
-        });
-        this._geometryCreatedSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                tag.created$.pipe(operators_1.map(function (t) {
-                    return t.geometry;
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreateRectDragHandler.prototype._disableCreate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._tagCreator.delete$.next(null);
-        this._addPointSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._deleteSubscription.unsubscribe();
-        this._geometryCreatedSubscription.unsubscribe();
-        this._initializeAnchorIndexingSubscription.unsubscribe();
-        this._setVertexSubscription.unsubscribe();
-    };
-    CreateRectDragHandler.prototype._getNameExtension = function () {
-        return "create-rect-drag";
-    };
-    return CreateRectDragHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreateRectDragHandler = CreateRectDragHandler;
-exports.default = CreateRectDragHandler;
-
-},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],386:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateRectHandler = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateRectHandler = /** @class */ (function (_super) {
-    __extends(CreateRectHandler, _super);
-    function CreateRectHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    Object.defineProperty(CreateRectHandler.prototype, "_create$", {
-        get: function () {
-            return this._tagCreator.createRect$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CreateRectHandler.prototype._addPoint = function (tag, basicPoint) {
-        var rectGeometry = tag.geometry;
-        if (!rectGeometry.validate(basicPoint)) {
-            basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
-        }
-        tag.addPoint(basicPoint);
-    };
-    CreateRectHandler.prototype._enable = function () {
-        _super.prototype._enable.call(this);
-        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
-            return !!tag;
-        }))
-            .subscribe(function (tag) {
-            tag.geometry.initializeAnchorIndexing();
-        });
-    };
-    CreateRectHandler.prototype._disable = function () {
-        _super.prototype._disable.call(this);
-        this._initializeAnchorIndexingSubscription.unsubscribe();
-    };
-    CreateRectHandler.prototype._getNameExtension = function () {
-        return "create-rect";
-    };
-    CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
-        tag.geometry.setOppositeVertex2d(basicPoint, transform);
-    };
-    return CreateRectHandler;
-}(Component_1.CreateVertexHandler));
-exports.CreateRectHandler = CreateRectHandler;
-exports.default = CreateRectHandler;
-
-},{"../../../Component":291,"rxjs/operators":241}],387:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateVertexHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateVertexHandler = /** @class */ (function (_super) {
-    __extends(CreateVertexHandler, _super);
-    function CreateVertexHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreateVertexHandler.prototype._enableCreate = function () {
-        var _this = this;
-        this._container.mouseService.deferPixels(this._name, 4);
-        var transformChanged$ = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
-        this._deleteSubscription = transformChanged$.pipe(operators_1.skip(1))
-            .subscribe(this._tagCreator.delete$);
-        var basicClick$ = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.share());
-        this._createSubscription = transformChanged$.pipe(operators_1.switchMap(function () {
-            return basicClick$.pipe(operators_1.filter(_this._validateBasic), operators_1.take(1));
-        }))
-            .subscribe(this._create$);
-        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), rxjs_1.merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], event = _a[1], camera = _a[2], transform = _a[3];
-            var basicPoint = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            _this._setVertex2d(tag, basicPoint, transform);
-        });
-        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicClick$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1];
-            _this._addPoint(tag, basicPoint);
-        });
-        this._geometryCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                tag.created$.pipe(operators_1.map(function (t) {
-                    return t.geometry;
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreateVertexHandler.prototype._disableCreate = function () {
-        this._container.mouseService.undeferPixels(this._name);
-        this._tagCreator.delete$.next(null);
-        this._addPointSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._deleteSubscription.unsubscribe();
-        this._geometryCreateSubscription.unsubscribe();
-        this._setVertexSubscription.unsubscribe();
-    };
-    return CreateVertexHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreateVertexHandler = CreateVertexHandler;
-exports.default = CreateVertexHandler;
-
-},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],388:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EditVertexHandler = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var EditVertexHandler = /** @class */ (function (_super) {
-    __extends(EditVertexHandler, _super);
-    function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._tagSet = tagSet;
-        return _this;
-    }
-    EditVertexHandler.prototype._enable = function () {
-        var _this = this;
-        var interaction$ = this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
-            return tagSet.getAll();
-        }), operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return tag.interact$;
-            }));
-        }), operators_1.switchMap(function (interaction) {
-            return rxjs_1.concat(rxjs_1.of(interaction), _this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function () {
-                return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
-            }), operators_1.first()));
-        }), operators_1.share());
-        var mouseMove$ = rxjs_1.merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$).pipe(operators_1.share());
-        this._claimMouseSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : rxjs_1.empty();
-        }))
-            .subscribe(function () {
-            _this._container.mouseService.claimMouse(_this._name, 3);
-        });
-        this._cursorSubscription = interaction$.pipe(operators_1.map(function (interaction) {
-            return interaction.cursor;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (cursor) {
-            var interactionCursors = ["crosshair", "move", "nesw-resize", "nwse-resize"];
-            for (var _i = 0, interactionCursors_1 = interactionCursors; _i < interactionCursors_1.length; _i++) {
-                var interactionCursor = interactionCursors_1[_i];
-                _this._container.element.classList.remove("component-tag-edit-" + interactionCursor);
-            }
-            if (!!cursor) {
-                _this._container.element.classList.add("component-tag-edit-" + cursor);
-            }
-        });
-        this._unclaimMouseSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.domMouseDragEnd$)
-            .subscribe(function (e) {
-            _this._container.mouseService.unclaimMouse(_this._name);
-        });
-        this._preventDefaultSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            return !!interaction.tag ?
-                _this._container.mouseService.documentMouseMove$ :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        this._updateGeometrySubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) {
-                return rxjs_1.empty();
-            }
-            var mouseDrag$ = _this._container.mouseService
-                .filtered$(_this._name, _this._container.mouseService.domMouseDrag$).pipe(operators_1.filter(function (event) {
-                return _this._viewportCoords.insideElement(event, _this._container.element);
-            }));
-            return rxjs_1.combineLatest(mouseDrag$, _this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(rxjs_1.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) {
-                var event = _a[0], render = _a[1];
-                return [event, render, i, transform];
-            }));
-        }))
-            .subscribe(function (_a) {
-            var mouseEvent = _a[0], renderCamera = _a[1], interaction = _a[2], transform = _a[3];
-            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, interaction.offsetX, interaction.offsetY);
-            var geometry = interaction.tag.geometry;
-            if (interaction.operation === Component_1.TagOperation.Centroid) {
-                geometry.setCentroid2d(basic, transform);
-            }
-            else if (interaction.operation === Component_1.TagOperation.Vertex) {
-                geometry.setVertex2d(interaction.vertexIndex, basic, transform);
-            }
-        });
-    };
-    EditVertexHandler.prototype._disable = function () {
-        this._claimMouseSubscription.unsubscribe();
-        this._cursorSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._unclaimMouseSubscription.unsubscribe();
-        this._updateGeometrySubscription.unsubscribe();
-    };
-    EditVertexHandler.prototype._getNameExtension = function () {
-        return "edit-vertex";
-    };
-    return EditVertexHandler;
-}(Component_1.TagHandlerBase));
-exports.EditVertexHandler = EditVertexHandler;
-exports.default = EditVertexHandler;
-
-
-},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],389:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagHandlerBase = void 0;
-var Component_1 = require("../../../Component");
-var TagHandlerBase = /** @class */ (function (_super) {
-    __extends(TagHandlerBase, _super);
-    function TagHandlerBase(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._name = _this._component.name + "-" + _this._getNameExtension();
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    TagHandlerBase.prototype._getConfiguration = function (enable) {
-        return {};
-    };
-    TagHandlerBase.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
-        offsetX = offsetX != null ? offsetX : 0;
-        offsetY = offsetY != null ? offsetY : 0;
-        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-        var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective);
-        return basic;
-    };
-    return TagHandlerBase;
-}(Component_1.HandlerBase));
-exports.TagHandlerBase = TagHandlerBase;
-exports.default = TagHandlerBase;
-
-
-},{"../../../Component":291}],390:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],391:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateTag = void 0;
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../../Geo");
-var CreateTag = /** @class */ (function () {
-    function CreateTag(geometry, transform, viewportCoords) {
-        var _this = this;
-        this._geometry = geometry;
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._aborted$ = new rxjs_1.Subject();
-        this._created$ = new rxjs_1.Subject();
-        this._glObjectsChanged$ = new rxjs_1.Subject();
-        this._geometryChangedSubscription = this._geometry.changed$
-            .subscribe(function () {
-            _this._onGeometryChanged();
-            _this._glObjectsChanged$.next(_this);
-        });
-    }
-    Object.defineProperty(CreateTag.prototype, "geometry", {
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(CreateTag.prototype, "glObjects", {
-        get: function () {
-            return this._glObjects;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(CreateTag.prototype, "aborted$", {
-        get: function () {
-            return this._aborted$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(CreateTag.prototype, "created$", {
-        get: function () {
-            return this._created$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(CreateTag.prototype, "glObjectsChanged$", {
-        get: function () {
-            return this._glObjectsChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(CreateTag.prototype, "geometryChanged$", {
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$.pipe(operators_1.map(function () {
-                return _this;
-            }));
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CreateTag.prototype.dispose = function () {
-        this._geometryChangedSubscription.unsubscribe();
-    };
-    CreateTag.prototype._canvasToTransform = function (canvas) {
-        var canvasX = Math.round(canvas[0]);
-        var canvasY = Math.round(canvas[1]);
-        var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-        return transform;
-    };
-    CreateTag.prototype._colorToBackground = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    CreateTag.prototype._createOutine = function (polygon3d, color) {
-        var positions = this._getLinePositions(polygon3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        var material = new THREE.LineBasicMaterial({
-            color: color,
-            linewidth: 1,
-        });
-        return new THREE.Line(geometry, material);
-    };
-    CreateTag.prototype._disposeLine = function (line) {
-        if (line == null) {
-            return;
-        }
-        line.geometry.dispose();
-        line.material.dispose();
-    };
-    CreateTag.prototype._getLinePositions = function (polygon3d) {
-        var length = polygon3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = polygon3d[i];
-            positions[index] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
-    };
-    return CreateTag;
-}());
-exports.CreateTag = CreateTag;
-exports.default = CreateTag;
-
-},{"../../../Geo":294,"rxjs":43,"rxjs/operators":241,"three":242}],392:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ExtremePointCreateTag = void 0;
-var vd = require("virtual-dom");
-var Tag_1 = require("../Tag");
-var Component_1 = require("../../../Component");
-var ExtremePointCreateTag = /** @class */ (function (_super) {
-    __extends(ExtremePointCreateTag, _super);
-    function ExtremePointCreateTag(geometry, options, transform, viewportCoords) {
-        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
-        _this._options = {
-            color: options.color == null ? 0xFFFFFF : options.color,
-            indicateCompleter: options.indicateCompleter == null ? true : options.indicateCompleter,
-        };
-        _this._rectGeometry = new Tag_1.RectGeometry(_this._geometry.getRect2d(transform));
-        _this._createGlObjects();
-        return _this;
-    }
-    ExtremePointCreateTag.prototype.create = function () {
-        if (this._geometry.points.length < 3) {
-            return;
-        }
-        this._geometry.removePoint2d(this._geometry.points.length - 1);
-        this._created$.next(this);
-    };
-    ExtremePointCreateTag.prototype.dispose = function () {
-        _super.prototype.dispose.call(this);
-        this._disposeObjects();
-    };
-    ExtremePointCreateTag.prototype.getDOMObjects = function (camera, size) {
-        var _this = this;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var vNodes = [];
-        var points2d = this._geometry.getPoints2d();
-        var length = points2d.length;
-        var _loop_1 = function (index) {
-            var nonModifiedIndex = index;
-            var _a = points2d[index], pointX = _a[0], pointY = _a[1];
-            var pointCanvas = this_1._viewportCoords.basicToCanvasSafe(pointX, pointY, container, this_1._transform, camera);
-            if (!pointCanvas) {
-                return "continue";
-            }
-            var abort = function (e) {
-                e.stopPropagation();
-                _this._aborted$.next(_this);
-            };
-            var remove = function (e) {
-                e.stopPropagation();
-                _this._geometry.removePoint2d(nonModifiedIndex);
-            };
-            var transform = this_1._canvasToTransform(pointCanvas);
-            var completerProperties = {
-                onclick: index === 0 && length < 3 ? abort : remove,
-                style: { transform: transform },
-            };
-            vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-            var background = this_1._colorToBackground(this_1._options.color);
-            var pointProperties = {
-                style: {
-                    background: background,
-                    transform: transform,
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        };
-        var this_1 = this;
-        for (var index = 0; index < length - 1; index++) {
-            _loop_1(index);
-        }
-        if (length > 2 && this._options.indicateCompleter === true) {
-            var _a = this._geometry.getCentroid2d(this._transform), centroidX = _a[0], centroidY = _a[1];
-            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidX, centroidY, container, this._transform, camera);
-            if (!!centroidCanvas) {
-                var complete = function (e) {
-                    e.stopPropagation();
-                    _this._geometry.removePoint2d(_this._geometry.points.length - 1);
-                    _this._created$.next(_this);
-                };
-                var transform = this._canvasToTransform(centroidCanvas);
-                var completerProperties = {
-                    onclick: complete,
-                    style: { transform: transform },
-                };
-                vNodes.push(vd.h("div.TagCompleter.TagLarger", completerProperties, []));
-                var pointProperties = {
-                    style: {
-                        background: this._colorToBackground(this._options.color),
-                        transform: transform,
-                    },
-                };
-                vNodes.push(vd.h("div.TagVertex.TagLarger", pointProperties, []));
-                var dotProperties = {
-                    style: {
-                        transform: transform,
-                    },
-                };
-                vNodes.push(vd.h("div.TagDot", dotProperties, []));
-            }
-        }
-        return vNodes;
-    };
-    ExtremePointCreateTag.prototype._onGeometryChanged = function () {
-        this._disposeObjects();
-        this._rectGeometry = new Tag_1.RectGeometry(this._geometry.getRect2d(this._transform));
-        this._createGlObjects();
-    };
-    ExtremePointCreateTag.prototype._createGlObjects = function () {
-        this._glObjects = [];
-        var polygon3d = this._rectGeometry.getPoints3d(this._transform);
-        this._outline = this._createOutine(polygon3d, this._options.color);
-        this._glObjects.push(this._outline);
-    };
-    ExtremePointCreateTag.prototype._disposeObjects = function () {
-        this._disposeLine(this._outline);
-        this._outline = null;
-        this._glObjects = null;
-    };
-    return ExtremePointCreateTag;
-}(Component_1.CreateTag));
-exports.ExtremePointCreateTag = ExtremePointCreateTag;
-
-
-},{"../../../Component":291,"../Tag":366,"virtual-dom":247}],393:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ExtremePointRenderTag = void 0;
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-/**
- * @class OutlineRenderTag
- * @classdesc Tag visualizing the properties of an OutlineTag.
- */
-var ExtremePointRenderTag = /** @class */ (function (_super) {
-    __extends(ExtremePointRenderTag, _super);
-    function ExtremePointRenderTag(tag, transform) {
-        var _this = _super.call(this, tag, transform) || this;
-        _this._rectGeometry = new Component_1.RectGeometry(_this._tag.geometry.getRect2d(transform));
-        _this._fill = !transform.gpano ?
-            _this._createFill() : null;
-        _this._outline = _this._tag.lineWidth >= 1 ?
-            _this._createOutline() :
-            null;
-        return _this;
-    }
-    ExtremePointRenderTag.prototype.dispose = function () {
-        _super.prototype.dispose.call(this);
-        this._disposeFill();
-        this._disposeOutline();
-    };
-    ExtremePointRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var vNodes = [];
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        if (!this._tag.editable) {
-            return vNodes;
-        }
-        var lineColor = this._colorToCss(this._tag.lineColor);
-        var points2d = this._tag.geometry.getPoints2d();
-        for (var i = 0; i < points2d.length; i++) {
-            var _a = points2d[i], vertexBasicX = _a[0], vertexBasicY = _a[1];
-            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
-            if (vertexCanvas == null) {
-                continue;
-            }
-            var cursor = "crosshair";
-            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
-            var vertexCanvasX = Math.round(vertexCanvas[0]);
-            var vertexCanvasY = Math.round(vertexCanvas[1]);
-            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
-            var properties = {
-                onmousedown: interact,
-                style: { background: lineColor, transform: transform, cursor: cursor },
-            };
-            vNodes.push(vd.h("div.TagResizer", properties, []));
-            if (!this._tag.indicateVertices) {
-                continue;
-            }
-            var pointProperties = {
-                style: { background: lineColor, transform: transform },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    ExtremePointRenderTag.prototype.getGLObjects = function () {
-        var glObjects = [];
-        if (this._fill != null) {
-            glObjects.push(this._fill);
-        }
-        if (this._outline != null) {
-            glObjects.push(this._outline);
-        }
-        return glObjects;
-    };
-    ExtremePointRenderTag.prototype.getRetrievableObjects = function () {
-        return this._fill != null ? [this._fill] : [];
-    };
-    ExtremePointRenderTag.prototype._onGeometryChanged = function () {
-        this._rectGeometry = new Component_1.RectGeometry(this._tag.geometry.getRect2d(this._transform));
-        if (this._fill != null) {
-            this._updateFillGeometry();
-        }
-        if (this._outline != null) {
-            this._updateOulineGeometry();
-        }
-    };
-    ExtremePointRenderTag.prototype._onTagChanged = function () {
-        var glObjectsChanged = false;
-        if (this._fill != null) {
-            this._updateFillMaterial(this._fill.material);
-        }
-        if (this._outline == null) {
-            if (this._tag.lineWidth >= 1) {
-                this._outline = this._createOutline();
-                glObjectsChanged = true;
-            }
-        }
-        else {
-            this._updateOutlineMaterial();
-        }
-        return glObjectsChanged;
-    };
-    ExtremePointRenderTag.prototype._getPoints3d = function () {
-        return this._rectGeometry.getPoints3d(this._transform);
-    };
-    ExtremePointRenderTag.prototype._getTriangles = function () {
-        return this._rectGeometry.getTriangles3d(this._transform);
-    };
-    ExtremePointRenderTag.prototype._updateFillMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    ExtremePointRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
-        material.opacity = this._tag.lineOpacity;
-        material.transparent = this._tag.lineOpacity < 1;
-        material.needsUpdate = true;
-    };
-    ExtremePointRenderTag.prototype._updateOutlineMaterial = function () {
-        var material = this._outline.material;
-        this._updateLineBasicMaterial(material);
-    };
-    return ExtremePointRenderTag;
-}(Component_1.OutlineRenderTagBase));
-exports.ExtremePointRenderTag = ExtremePointRenderTag;
-exports.default = ExtremePointRenderTag;
-
-
-},{"../../../Component":291,"three":242,"virtual-dom":247}],394:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ExtremePointTag = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class ExtremePointTag
- *
- * @classdesc Tag holding properties for visualizing a extreme points
- * and their outline.
- *
- * @example
- * ```
- * var geometry = new Mapillary.TagComponent.PointsGeometry([[0.3, 0.3], [0.5, 0.4]]);
- * var tag = new Mapillary.TagComponent.ExtremePointTag(
- *     "id-1",
- *     geometry
- *     { editable: true, lineColor: 0xff0000 });
- *
- * tagComponent.add([tag]);
- * ```
- */
-var ExtremePointTag = /** @class */ (function (_super) {
-    __extends(ExtremePointTag, _super);
-    /**
-     * Create an extreme point tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id - Unique identifier of the tag.
-     * @param {PointsGeometry} geometry - Geometry defining points of tag.
-     * @param {IExtremePointTagOptions} options - Options defining the visual appearance and
-     * behavior of the extreme point tag.
-     */
-    function ExtremePointTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        _this._editable = options.editable == null ? false : options.editable;
-        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
-        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
-        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
-        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
-        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
-        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
-        return _this;
-    }
-    Object.defineProperty(ExtremePointTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "fillColor", {
-        /**
-         * Get fill color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillColor;
-        },
-        /**
-         * Set fill color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "fillOpacity", {
-        /**
-         * Get fill opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillOpacity;
-        },
-        /**
-         * Set fill opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "geometry", {
-        /** @inheritdoc */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "indicateVertices", {
-        /**
-         * Get indicate vertices property.
-         * @returns {boolean} Value indicating if vertices should be indicated
-         * when tag is editable.
-         */
-        get: function () {
-            return this._indicateVertices;
-        },
-        /**
-         * Set indicate vertices property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._indicateVertices = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "lineColor", {
-        /**
-         * Get line color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineColor;
-        },
-        /**
-         * Set line color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "lineOpacity", {
-        /**
-         * Get line opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineOpacity;
-        },
-        /**
-         * Set line opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ExtremePointTag.prototype, "lineWidth", {
-        /**
-         * Get line width property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineWidth;
-        },
-        /**
-         * Set line width property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineWidth = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keeps
-     * the rest of the values as is.
-     *
-     * @param {IExtremePointTagOptions} options - Extreme point tag options
-     *
-     * @fires {Tag#changed}
-     */
-    ExtremePointTag.prototype.setOptions = function (options) {
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
-        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
-        this._notifyChanged$.next(this);
-    };
-    return ExtremePointTag;
-}(Component_1.Tag));
-exports.ExtremePointTag = ExtremePointTag;
-exports.default = ExtremePointTag;
-
-},{"../../../Component":291}],395:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.OutlineCreateTag = void 0;
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var OutlineCreateTag = /** @class */ (function (_super) {
-    __extends(OutlineCreateTag, _super);
-    function OutlineCreateTag(geometry, options, transform, viewportCoords) {
-        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
-        _this._options = { color: options.color == null ? 0xFFFFFF : options.color };
-        _this._createGlObjects();
-        return _this;
-    }
-    OutlineCreateTag.prototype.create = function () {
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            this._created$.next(this);
-        }
-        else if (this._geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._geometry;
-            polygonGeometry.removeVertex2d(polygonGeometry.polygon.length - 2);
-            this._created$.next(this);
-        }
-    };
-    OutlineCreateTag.prototype.dispose = function () {
-        _super.prototype.dispose.call(this);
-        this._disposeLine(this._outline);
-        this._disposeObjects();
-    };
-    OutlineCreateTag.prototype.getDOMObjects = function (camera, size) {
-        var _this = this;
-        var vNodes = [];
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var abort = function (e) {
-            e.stopPropagation();
-            _this._aborted$.next(_this);
-        };
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            var anchorIndex = this._geometry.anchorIndex;
-            var vertexIndex = anchorIndex === undefined ? 1 : anchorIndex;
-            var _a = this._geometry.getVertex2d(vertexIndex), basicX = _a[0], basicY = _a[1];
-            var canvasPoint = this._viewportCoords.basicToCanvasSafe(basicX, basicY, container, this._transform, camera);
-            if (canvasPoint != null) {
-                var background = this._colorToBackground(this._options.color);
-                var transform = this._canvasToTransform(canvasPoint);
-                var pointProperties = {
-                    style: { background: background, transform: transform },
-                };
-                var completerProperties = {
-                    onclick: abort,
-                    style: { transform: transform },
-                };
-                vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-                vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-            }
-        }
-        else if (this._geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry_1 = this._geometry;
-            var _b = polygonGeometry_1.getVertex2d(0), firstVertexBasicX = _b[0], firstVertexBasicY = _b[1];
-            var firstVertexCanvas = this._viewportCoords.basicToCanvasSafe(firstVertexBasicX, firstVertexBasicY, container, this._transform, camera);
-            if (firstVertexCanvas != null) {
-                var firstOnclick = polygonGeometry_1.polygon.length > 4 ?
-                    function (e) {
-                        e.stopPropagation();
-                        polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 2);
-                        _this._created$.next(_this);
-                    } :
-                    abort;
-                var transform = this._canvasToTransform(firstVertexCanvas);
-                var completerProperties = {
-                    onclick: firstOnclick,
-                    style: { transform: transform },
-                };
-                var firstClass = polygonGeometry_1.polygon.length > 4 ?
-                    "TagCompleter" :
-                    "TagInteractor";
-                vNodes.push(vd.h("div." + firstClass, completerProperties, []));
-            }
-            if (polygonGeometry_1.polygon.length > 3) {
-                var _c = polygonGeometry_1.getVertex2d(polygonGeometry_1.polygon.length - 3), lastVertexBasicX = _c[0], lastVertexBasicY = _c[1];
-                var lastVertexCanvas = this._viewportCoords.basicToCanvasSafe(lastVertexBasicX, lastVertexBasicY, container, this._transform, camera);
-                if (lastVertexCanvas != null) {
-                    var remove = function (e) {
-                        e.stopPropagation();
-                        polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3);
-                    };
-                    var transform = this._canvasToTransform(lastVertexCanvas);
-                    var completerProperties = {
-                        onclick: remove,
-                        style: { transform: transform },
-                    };
-                    vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-                }
-            }
-            var verticesBasic = polygonGeometry_1.polygon.slice();
-            verticesBasic.splice(-2, 2);
-            for (var _i = 0, verticesBasic_1 = verticesBasic; _i < verticesBasic_1.length; _i++) {
-                var vertexBasic = verticesBasic_1[_i];
-                var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasic[0], vertexBasic[1], container, this._transform, camera);
-                if (vertexCanvas != null) {
-                    var background = this._colorToBackground(this._options.color);
-                    var transform = this._canvasToTransform(vertexCanvas);
-                    var pointProperties = {
-                        style: {
-                            background: background,
-                            transform: transform,
-                        },
-                    };
-                    vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-                }
-            }
-        }
-        return vNodes;
-    };
-    OutlineCreateTag.prototype.addPoint = function (point) {
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            var rectGeometry = this._geometry;
-            if (!rectGeometry.validate(point)) {
-                return;
-            }
-            this._created$.next(this);
-        }
-        else if (this._geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._geometry;
-            polygonGeometry.addVertex2d(point);
-        }
-    };
-    OutlineCreateTag.prototype._onGeometryChanged = function () {
-        this._disposeLine(this._outline);
-        this._disposeObjects();
-        this._createGlObjects();
-    };
-    OutlineCreateTag.prototype._disposeObjects = function () {
-        this._outline = null;
-        this._glObjects = [];
-    };
-    OutlineCreateTag.prototype._createGlObjects = function () {
-        var polygon3d = this._geometry instanceof Component_1.RectGeometry ?
-            this._geometry.getPoints3d(this._transform) :
-            this._geometry.getVertices3d(this._transform);
-        this._outline = this._createOutine(polygon3d, this._options.color);
-        this._glObjects = [this._outline];
-    };
-    return OutlineCreateTag;
-}(Component_1.CreateTag));
-exports.OutlineCreateTag = OutlineCreateTag;
-exports.default = OutlineCreateTag;
-
-
-},{"../../../Component":291,"virtual-dom":247}],396:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.OutlineRenderTag = void 0;
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-/**
- * @class OutlineRenderTag
- * @classdesc Tag visualizing the properties of an OutlineTag.
- */
-var OutlineRenderTag = /** @class */ (function (_super) {
-    __extends(OutlineRenderTag, _super);
-    function OutlineRenderTag(tag, transform) {
-        var _this = _super.call(this, tag, transform) || this;
-        _this._fill = !transform.gpano ?
-            _this._createFill() :
-            transform.fullPano &&
-                tag.domain === Component_1.TagDomain.TwoDimensional &&
-                tag.geometry instanceof Component_1.PolygonGeometry ?
-                _this._createFill() :
-                null;
-        _this._holes = _this._tag.lineWidth >= 1 ?
-            _this._createHoles() :
-            [];
-        _this._outline = _this._tag.lineWidth >= 1 ?
-            _this._createOutline() :
-            null;
-        return _this;
-    }
-    OutlineRenderTag.prototype.dispose = function () {
-        _super.prototype.dispose.call(this);
-        this._disposeFill();
-        this._disposeHoles();
-        this._disposeOutline();
-    };
-    OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var _this = this;
-        var vNodes = [];
-        var isRect = this._tag.geometry instanceof Component_1.RectGeometry;
-        var isPerspective = !this._transform.gpano;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        if (this._tag.icon != null && (isRect || isPerspective)) {
-            var _a = this._tag.geometry instanceof Component_1.RectGeometry ?
-                this._tag.geometry.getVertex2d(this._tag.iconIndex) :
-                this._tag.geometry.getPoleOfInaccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1];
-            var iconCanvas = this._viewportCoords.basicToCanvasSafe(iconBasicX, iconBasicY, container, this._transform, camera);
-            if (iconCanvas != null) {
-                var interact = function () {
-                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                };
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(this._tag.icon, this._tag.iconFloat);
-                    var iconCanvasX = Math.round(iconCanvas[0]);
-                    var iconCanvasY = Math.round(iconCanvas[1]);
-                    var transform = "translate(" + iconCanvasX + "px," + iconCanvasY + "px)";
-                    var click = function (e) {
-                        e.stopPropagation();
-                        _this._tag.click$.next(_this._tag);
-                    };
-                    var properties = {
-                        onclick: click,
-                        onmousedown: interact,
-                        style: { transform: transform },
-                    };
-                    vNodes.push(vd.h("div.TagSymbol", properties, [sprite]));
-                }
-            }
-        }
-        else if (this._tag.text != null && (isRect || isPerspective)) {
-            var _b = this._tag.geometry instanceof Component_1.RectGeometry ?
-                this._tag.geometry.getVertex2d(3) :
-                this._tag.geometry.getPoleOfInaccessibility2d(), textBasicX = _b[0], textBasicY = _b[1];
-            var textCanvas = this._viewportCoords.basicToCanvasSafe(textBasicX, textBasicY, container, this._transform, camera);
-            if (textCanvas != null) {
-                var textCanvasX = Math.round(textCanvas[0]);
-                var textCanvasY = Math.round(textCanvas[1]);
-                var transform = this._tag.geometry instanceof Component_1.RectGeometry ?
-                    "translate(" + textCanvasX + "px," + textCanvasY + "px)" :
-                    "translate(-50%, -50%) translate(" + textCanvasX + "px," + textCanvasY + "px)";
-                var interact = function () {
-                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                };
-                var properties = {
-                    onmousedown: interact,
-                    style: {
-                        color: this._colorToCss(this._tag.textColor),
-                        transform: transform,
-                    },
-                    textContent: this._tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-        }
-        if (!this._tag.editable) {
-            return vNodes;
-        }
-        var lineColor = this._colorToCss(this._tag.lineColor);
-        if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            var _c = this._tag.geometry.getCentroid2d(), centroidBasicX = _c[0], centroidBasicY = _c[1];
-            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
-            if (centroidCanvas != null) {
-                var interact = this._interact(Component_1.TagOperation.Centroid, "move");
-                var centroidCanvasX = Math.round(centroidCanvas[0]);
-                var centroidCanvasY = Math.round(centroidCanvas[1]);
-                var transform = "translate(-50%, -50%) translate(" + centroidCanvasX + "px," + centroidCanvasY + "px)";
-                var properties = {
-                    onmousedown: interact,
-                    style: { background: lineColor, transform: transform },
-                };
-                vNodes.push(vd.h("div.TagMover", properties, []));
-            }
-        }
-        var vertices2d = this._tag.geometry.getVertices2d();
-        for (var i = 0; i < vertices2d.length - 1; i++) {
-            if (isRect &&
-                ((this._tag.icon != null && i === this._tag.iconIndex) ||
-                    (this._tag.icon == null && this._tag.text != null && i === 3))) {
-                continue;
-            }
-            var _d = vertices2d[i], vertexBasicX = _d[0], vertexBasicY = _d[1];
-            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
-            if (vertexCanvas == null) {
-                continue;
-            }
-            var cursor = isRect ?
-                i % 2 === 0 ? "nesw-resize" : "nwse-resize" :
-                "crosshair";
-            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
-            var vertexCanvasX = Math.round(vertexCanvas[0]);
-            var vertexCanvasY = Math.round(vertexCanvas[1]);
-            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
-            var properties = {
-                onmousedown: interact,
-                style: { background: lineColor, transform: transform, cursor: cursor },
-            };
-            vNodes.push(vd.h("div.TagResizer", properties, []));
-            if (!this._tag.indicateVertices) {
-                continue;
-            }
-            var pointProperties = {
-                style: { background: lineColor, transform: transform },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    OutlineRenderTag.prototype.getGLObjects = function () {
-        var glObjects = [];
-        if (this._fill != null) {
-            glObjects.push(this._fill);
-        }
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            glObjects.push(hole);
-        }
-        if (this._outline != null) {
-            glObjects.push(this._outline);
-        }
-        return glObjects;
-    };
-    OutlineRenderTag.prototype.getRetrievableObjects = function () {
-        return this._fill != null ? [this._fill] : [];
-    };
-    OutlineRenderTag.prototype._onGeometryChanged = function () {
-        if (this._fill != null) {
-            this._updateFillGeometry();
-        }
-        if (this._holes.length > 0) {
-            this._updateHoleGeometries();
-        }
-        if (this._outline != null) {
-            this._updateOulineGeometry();
-        }
-    };
-    OutlineRenderTag.prototype._onTagChanged = function () {
-        var glObjectsChanged = false;
-        if (this._fill != null) {
-            this._updateFillMaterial(this._fill.material);
-        }
-        if (this._outline == null) {
-            if (this._tag.lineWidth >= 1) {
-                this._holes = this._createHoles();
-                this._outline = this._createOutline();
-                glObjectsChanged = true;
-            }
-        }
-        else {
-            this._updateHoleMaterials();
-            this._updateOutlineMaterial();
-        }
-        return glObjectsChanged;
-    };
-    OutlineRenderTag.prototype._getPoints3d = function () {
-        return this._in3dDomain() ?
-            this._tag.geometry.getVertices3d(this._transform) :
-            this._tag.geometry.getPoints3d(this._transform);
-    };
-    OutlineRenderTag.prototype._getTriangles = function () {
-        return this._in3dDomain() ?
-            this._tag.geometry.get3dDomainTriangles3d(this._transform) :
-            this._tag.geometry.getTriangles3d(this._transform);
-    };
-    OutlineRenderTag.prototype._updateFillMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
-        material.opacity = this._tag.lineOpacity;
-        material.transparent = this._tag.lineOpacity < 1;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._createHoles = function () {
-        var holes = [];
-        if (this._tag.geometry instanceof Component_1.PolygonGeometry) {
-            var holes3d = this._getHoles3d();
-            for (var _i = 0, holes3d_1 = holes3d; _i < holes3d_1.length; _i++) {
-                var holePoints3d = holes3d_1[_i];
-                var hole = this._createLine(holePoints3d);
-                holes.push(hole);
-            }
-        }
-        return holes;
-    };
-    OutlineRenderTag.prototype._disposeHoles = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            hole.geometry.dispose();
-            hole.material.dispose();
-        }
-        this._holes = [];
-    };
-    OutlineRenderTag.prototype._getHoles3d = function () {
-        var polygonGeometry = this._tag.geometry;
-        return this._in3dDomain() ?
-            polygonGeometry.getHoleVertices3d(this._transform) :
-            polygonGeometry.getHolePoints3d(this._transform);
-    };
-    OutlineRenderTag.prototype._in3dDomain = function () {
-        return this._tag.geometry instanceof Component_1.PolygonGeometry && this._tag.domain === Component_1.TagDomain.ThreeDimensional;
-    };
-    OutlineRenderTag.prototype._updateHoleGeometries = function () {
-        var holes3d = this._getHoles3d();
-        if (holes3d.length !== this._holes.length) {
-            throw new Error("Changing the number of holes is not supported.");
-        }
-        for (var i = 0; i < this._holes.length; i++) {
-            var holePoints3d = holes3d[i];
-            var hole = this._holes[i];
-            this._updateLine(hole, holePoints3d);
-        }
-    };
-    OutlineRenderTag.prototype._updateHoleMaterials = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            this._updateLineBasicMaterial(hole.material);
-        }
-    };
-    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
-        this._updateLineBasicMaterial(this._outline.material);
-    };
-    return OutlineRenderTag;
-}(Component_1.OutlineRenderTagBase));
-exports.OutlineRenderTag = OutlineRenderTag;
-
-
-},{"../../../Component":291,"three":242,"virtual-dom":247}],397:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.OutlineRenderTagBase = void 0;
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-var OutlineRenderTagBase = /** @class */ (function (_super) {
-    __extends(OutlineRenderTagBase, _super);
-    function OutlineRenderTagBase(tag, transform) {
-        var _this = _super.call(this, tag, transform) || this;
-        _this._geometryChangedSubscription = _this._tag.geometry.changed$
-            .subscribe(function () {
-            _this._onGeometryChanged();
-        });
-        _this._changedSubscription = _this._tag.changed$
-            .subscribe(function () {
-            var glObjectsChanged = _this._onTagChanged();
-            if (glObjectsChanged) {
-                _this._glObjectsChanged$.next(_this);
-            }
-        });
-        return _this;
-    }
-    OutlineRenderTagBase.prototype.dispose = function () {
-        this._changedSubscription.unsubscribe();
-        this._geometryChangedSubscription.unsubscribe();
-    };
-    OutlineRenderTagBase.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    OutlineRenderTagBase.prototype._createFill = function () {
-        var triangles = this._getTriangles();
-        var positions = new Float32Array(triangles);
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });
-        this._updateFillMaterial(material);
-        return new THREE.Mesh(geometry, material);
-    };
-    OutlineRenderTagBase.prototype._createLine = function (points3d) {
-        var positions = this._getLinePositions(points3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.LineBasicMaterial();
-        this._updateLineBasicMaterial(material);
-        var line = new THREE.Line(geometry, material);
-        line.renderOrder = 1;
-        return line;
-    };
-    OutlineRenderTagBase.prototype._createOutline = function () {
-        return this._createLine(this._getPoints3d());
-    };
-    OutlineRenderTagBase.prototype._disposeFill = function () {
-        if (this._fill == null) {
-            return;
-        }
-        this._fill.geometry.dispose();
-        this._fill.material.dispose();
-        this._fill = null;
-    };
-    OutlineRenderTagBase.prototype._disposeOutline = function () {
-        if (this._outline == null) {
-            return;
-        }
-        this._outline.geometry.dispose();
-        this._outline.material.dispose();
-        this._outline = null;
-    };
-    OutlineRenderTagBase.prototype._getLinePositions = function (points3d) {
-        var length = points3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = points3d[i];
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
-    };
-    OutlineRenderTagBase.prototype._interact = function (operation, cursor, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                cursor: cursor,
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: _this._tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    OutlineRenderTagBase.prototype._updateFillGeometry = function () {
-        var triangles = this._getTriangles();
-        var positions = new Float32Array(triangles);
-        var geometry = this._fill.geometry;
-        var attribute = geometry.getAttribute("position");
-        if (attribute.array.length === positions.length) {
-            attribute.set(positions);
-            attribute.needsUpdate = true;
-        }
-        else {
-            geometry.removeAttribute("position");
-            geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        }
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTagBase.prototype._updateLine = function (line, points3d) {
-        var positions = this._getLinePositions(points3d);
-        var geometry = line.geometry;
-        var attribute = geometry.getAttribute("position");
-        attribute.set(positions);
-        attribute.needsUpdate = true;
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTagBase.prototype._updateOulineGeometry = function () {
-        this._updateLine(this._outline, this._getPoints3d());
-    };
-    return OutlineRenderTagBase;
-}(Component_1.RenderTag));
-exports.OutlineRenderTagBase = OutlineRenderTagBase;
-exports.default = OutlineRenderTagBase;
-
-
-},{"../../../Component":291,"three":242}],398:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.OutlineTag = void 0;
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class OutlineTag
- *
- * @classdesc Tag holding properties for visualizing a geometry outline.
- *
- * @example
- * ```
- * var geometry = new Mapillary.TagComponent.RectGeometry([0.3, 0.3, 0.5, 0.4]);
- * var tag = new Mapillary.TagComponent.OutlineTag(
- *     "id-1",
- *     geometry
- *     { editable: true, lineColor: 0xff0000 });
- *
- * tagComponent.add([tag]);
- * ```
- */
-var OutlineTag = /** @class */ (function (_super) {
-    __extends(OutlineTag, _super);
-    /**
-     * Create an outline tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id - Unique identifier of the tag.
-     * @param {VertexGeometry} geometry - Geometry defining vertices of tag.
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the outline tag.
-     */
-    function OutlineTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        var domain = options.domain != null && geometry instanceof Component_1.PolygonGeometry ?
-            options.domain : Component_1.TagDomain.TwoDimensional;
-        var twoDimensionalPolygon = _this._twoDimensionalPolygon(domain, geometry);
-        _this._domain = domain;
-        _this._editable = options.editable == null || twoDimensionalPolygon ? false : options.editable;
-        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
-        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
-        _this._icon = options.icon === undefined ? null : options.icon;
-        _this._iconFloat = options.iconFloat == null ? Viewer_1.Alignment.Center : options.iconFloat;
-        _this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex;
-        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
-        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
-        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
-        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
-        _this._text = options.text === undefined ? null : options.text;
-        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        _this._click$ = new rxjs_1.Subject();
-        _this._click$
-            .subscribe(function (t) {
-            _this.fire(OutlineTag.click, _this);
-        });
-        return _this;
-    }
-    Object.defineProperty(OutlineTag.prototype, "click$", {
-        /**
-         * Click observable.
-         *
-         * @description An observable emitting the tag when the icon of the
-         * tag has been clicked.
-         *
-         * @returns {Observable<Tag>}
-         */
-        get: function () {
-            return this._click$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "domain", {
-        /**
-         * Get domain property.
-         *
-         * @description Readonly property that can only be set in constructor.
-         *
-         * @returns Value indicating the domain of the tag.
-         */
-        get: function () {
-            return this._domain;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            if (this._twoDimensionalPolygon(this._domain, this._geometry)) {
-                return;
-            }
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "fillColor", {
-        /**
-         * Get fill color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillColor;
-        },
-        /**
-         * Set fill color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "fillOpacity", {
-        /**
-         * Get fill opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillOpacity;
-        },
-        /**
-         * Set fill opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "geometry", {
-        /** @inheritdoc */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "iconFloat", {
-        /**
-         * Get icon float property.
-         * @returns {Alignment}
-         */
-        get: function () {
-            return this._iconFloat;
-        },
-        /**
-         * Set icon float property.
-         * @param {Alignment}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._iconFloat = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "iconIndex", {
-        /**
-         * Get icon index property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._iconIndex;
-        },
-        /**
-         * Set icon index property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._iconIndex = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "indicateVertices", {
-        /**
-         * Get indicate vertices property.
-         * @returns {boolean} Value indicating if vertices should be indicated
-         * when tag is editable.
-         */
-        get: function () {
-            return this._indicateVertices;
-        },
-        /**
-         * Set indicate vertices property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._indicateVertices = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineColor", {
-        /**
-         * Get line color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineColor;
-        },
-        /**
-         * Set line color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineOpacity", {
-        /**
-         * Get line opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineOpacity;
-        },
-        /**
-         * Set line opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
-        /**
-         * Get line width property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineWidth;
-        },
-        /**
-         * Set line width property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineWidth = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keeps
-     * the rest of the values as is.
-     *
-     * @param {IOutlineTagOptions} options - Outline tag options
-     *
-     * @fires {Tag#changed}
-     */
-    OutlineTag.prototype.setOptions = function (options) {
-        var twoDimensionalPolygon = this._twoDimensionalPolygon(this._domain, this._geometry);
-        this._editable = twoDimensionalPolygon || options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;
-        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
-        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
-        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
-    };
-    OutlineTag.prototype._twoDimensionalPolygon = function (domain, geometry) {
-        return domain !== Component_1.TagDomain.ThreeDimensional && geometry instanceof Component_1.PolygonGeometry;
-    };
-    /**
-     * Event fired when the icon of the outline tag is clicked.
-     *
-     * @event OutlineTag#click
-     * @type {OutlineTag} The tag instance that was clicked.
-     */
-    OutlineTag.click = "click";
-    return OutlineTag;
-}(Component_1.Tag));
-exports.OutlineTag = OutlineTag;
-exports.default = OutlineTag;
-
-},{"../../../Component":291,"../../../Viewer":302,"rxjs":43}],399:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RenderTag = void 0;
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../../Geo");
-var RenderTag = /** @class */ (function () {
-    function RenderTag(tag, transform, viewportCoords) {
-        this._tag = tag;
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._glObjectsChanged$ = new rxjs_1.Subject();
-        this._interact$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
-        get: function () {
-            return this._glObjectsChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "interact$", {
-        get: function () {
-            return this._interact$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "tag", {
-        get: function () {
-            return this._tag;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return RenderTag;
-}());
-exports.RenderTag = RenderTag;
-exports.default = RenderTag;
-
-},{"../../../Geo":294,"rxjs":43}],400:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpotRenderTag = void 0;
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class SpotRenderTag
- * @classdesc Tag visualizing the properties of a SpotTag.
- */
-var SpotRenderTag = /** @class */ (function (_super) {
-    __extends(SpotRenderTag, _super);
-    function SpotRenderTag() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    SpotRenderTag.prototype.dispose = function () { };
-    SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var _this = this;
-        var tag = this._tag;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var vNodes = [];
-        var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1];
-        var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
-        if (centroidCanvas != null) {
-            var interactNone = function (e) {
-                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag });
-            };
-            var canvasX = Math.round(centroidCanvas[0]);
-            var canvasY = Math.round(centroidCanvas[1]);
-            if (tag.icon != null) {
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
-                    var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                    var properties = {
-                        onmousedown: interactNone,
-                        style: {
-                            pointerEvents: "all",
-                            transform: iconTransform,
-                        },
-                    };
-                    vNodes.push(vd.h("div", properties, [sprite]));
-                }
-            }
-            else if (tag.text != null) {
-                var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                var properties = {
-                    onmousedown: interactNone,
-                    style: {
-                        color: this._colorToCss(tag.textColor),
-                        transform: textTransform,
-                    },
-                    textContent: tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-            var interact = this._interact(Component_1.TagOperation.Centroid, tag, "move");
-            var background = this._colorToCss(tag.color);
-            var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-            if (tag.editable) {
-                var interactorProperties = {
-                    onmousedown: interact,
-                    style: {
-                        background: background,
-                        transform: transform,
-                    },
-                };
-                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
-            }
-            var pointProperties = {
-                style: {
-                    background: background,
-                    transform: transform,
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    SpotRenderTag.prototype.getGLObjects = function () { return []; };
-    SpotRenderTag.prototype.getRetrievableObjects = function () { return []; };
-    SpotRenderTag.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    SpotRenderTag.prototype._interact = function (operation, tag, cursor, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                cursor: cursor,
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    return SpotRenderTag;
-}(Component_1.RenderTag));
-exports.SpotRenderTag = SpotRenderTag;
-
-
-},{"../../../Component":291,"../../../Viewer":302,"virtual-dom":247}],401:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpotTag = void 0;
-var Component_1 = require("../../../Component");
-/**
- * @class SpotTag
- *
- * @classdesc Tag holding properties for visualizing the centroid of a geometry.
- *
- * @example
- * ```
- * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);
- * var tag = new Mapillary.TagComponent.SpotTag(
- *     "id-1",
- *     geometry
- *     { editable: true, color: 0xff0000 });
- *
- * tagComponent.add([tag]);
- * ```
- */
-var SpotTag = /** @class */ (function (_super) {
-    __extends(SpotTag, _super);
-    /**
-     * Create a spot tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the spot tag.
-     */
-    function SpotTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        _this._color = options.color == null ? 0xFFFFFF : options.color;
-        _this._editable = options.editable == null ? false : options.editable;
-        _this._icon = options.icon === undefined ? null : options.icon;
-        _this._text = options.text === undefined ? null : options.text;
-        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        return _this;
-    }
-    Object.defineProperty(SpotTag.prototype, "color", {
-        /**
-         * Get color property.
-         * @returns {number} The color of the spot as a hexagonal number;
-         */
-        get: function () {
-            return this._color;
-        },
-        /**
-         * Set color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._color = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keps
-     * the rest of the values as is.
-     *
-     * @param {ISpotTagOptions} options - Spot tag options
-     *
-     * @fires {Tag#changed}
-     */
-    SpotTag.prototype.setOptions = function (options) {
-        this._color = options.color == null ? this._color : options.color;
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
-    };
-    return SpotTag;
-}(Component_1.Tag));
-exports.SpotTag = SpotTag;
-exports.default = SpotTag;
-
-},{"../../../Component":291}],402:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Tag = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Utils_1 = require("../../../Utils");
-/**
- * @class Tag
- * @abstract
- * @classdesc Abstract class representing the basic functionality of for a tag.
- */
-var Tag = /** @class */ (function (_super) {
-    __extends(Tag, _super);
-    /**
-     * Create a tag.
-     *
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     */
-    function Tag(id, geometry) {
-        var _this = _super.call(this) || this;
-        _this._id = id;
-        _this._geometry = geometry;
-        _this._notifyChanged$ = new rxjs_1.Subject();
-        _this._notifyChanged$
-            .subscribe(function (t) {
-            _this.fire(Tag.changed, _this);
-        });
-        _this._geometry.changed$
-            .subscribe(function (g) {
-            _this.fire(Tag.geometrychanged, _this);
-        });
-        return _this;
-    }
-    Object.defineProperty(Tag.prototype, "id", {
-        /**
-         * Get id property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._id;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometry", {
-        /**
-         * Get geometry property.
-         * @returns {Geometry} The geometry of the tag.
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometryChanged$", {
-        /**
-         * Get geometry changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$.pipe(operators_1.map(function (geometry) {
-                return _this;
-            }), operators_1.share());
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Event fired when a property related to the visual appearance of the
-     * tag has changed.
-     *
-     * @event Tag#changed
-     * @type {Tag} The tag instance that has changed.
-     */
-    Tag.changed = "changed";
-    /**
-     * Event fired when the geometry of the tag has changed.
-     *
-     * @event Tag#geometrychanged
-     * @type {Tag} The tag instance whose geometry has changed.
-     */
-    Tag.geometrychanged = "geometrychanged";
-    return Tag;
-}(Utils_1.EventEmitter));
-exports.Tag = Tag;
-exports.default = Tag;
-
-},{"../../../Utils":301,"rxjs":43,"rxjs/operators":241}],403:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TagDomain = void 0;
-/**
- * Enumeration for tag domains.
- * @enum {number}
- * @readonly
- * @description Defines where lines between two vertices are treated
- * as straight.
- *
- * Only applicable for polygons. For rectangles lines between
- * vertices are always treated as straight in the distorted 2D
- * projection and bended in the undistorted 3D space.
- */
-var TagDomain;
-(function (TagDomain) {
-    /**
-     * Treats lines between two vertices as straight in the
-     * distorted 2D projection, i.e. on the image. If the image
-     * is distorted this will result in bended lines when rendered
-     * in the undistorted 3D space.
-     */
-    TagDomain[TagDomain["TwoDimensional"] = 0] = "TwoDimensional";
-    /**
-     * Treats lines as straight in the undistorted 3D space. If the
-     * image is distorted this will result in bended lines when rendered
-     * on the distorted 2D projection of the image.
-     */
-    TagDomain[TagDomain["ThreeDimensional"] = 1] = "ThreeDimensional";
-})(TagDomain = exports.TagDomain || (exports.TagDomain = {}));
-exports.default = TagDomain;
-
-},{}],404:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ComponentSize = void 0;
-/**
- * Enumeration for component size.
- * @enum {number}
- * @readonly
- * @description May be used by a component to allow for resizing
- * of the UI elements rendered by the component.
- */
-var ComponentSize;
-(function (ComponentSize) {
-    /**
-     * Automatic size. The size of the elements will automatically
-     * change at a predefined threshold.
-     */
-    ComponentSize[ComponentSize["Automatic"] = 0] = "Automatic";
-    /**
-     * Large size. The size of the elements will be fixed until another
-     * component size is configured.
-     */
-    ComponentSize[ComponentSize["Large"] = 1] = "Large";
-    /**
-     * Small size. The size of the elements will be fixed until another
-     * component size is configured.
-     */
-    ComponentSize[ComponentSize["Small"] = 2] = "Small";
-})(ComponentSize = exports.ComponentSize || (exports.ComponentSize = {}));
-exports.default = ComponentSize;
-
-},{}],405:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.HandlerBase = void 0;
-var HandlerBase = /** @class */ (function () {
-    /** @ignore */
-    function HandlerBase(component, container, navigator) {
-        this._component = component;
-        this._container = container;
-        this._navigator = navigator;
-        this._enabled = false;
-    }
-    Object.defineProperty(HandlerBase.prototype, "isEnabled", {
-        /**
-         * Returns a Boolean indicating whether the interaction is enabled.
-         *
-         * @returns {boolean} `true` if the interaction is enabled.
-         */
-        get: function () {
-            return this._enabled;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Enables the interaction.
-     *
-     * @example ```<component-name>.<handler-name>.enable();```
-     */
-    HandlerBase.prototype.enable = function () {
-        if (this._enabled || !this._component.activated) {
-            return;
-        }
-        this._enable();
-        this._enabled = true;
-        this._component.configure(this._getConfiguration(true));
-    };
-    /**
-     * Disables the interaction.
-     *
-     * @example ```<component-name>.<handler-name>.disable();```
-     */
-    HandlerBase.prototype.disable = function () {
-        if (!this._enabled) {
-            return;
-        }
-        this._disable();
-        this._enabled = false;
-        if (this._component.activated) {
-            this._component.configure(this._getConfiguration(false));
-        }
-    };
-    return HandlerBase;
-}());
-exports.HandlerBase = HandlerBase;
-exports.default = HandlerBase;
-
-},{}],406:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MeshFactory = void 0;
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var MeshFactory = /** @class */ (function () {
-    function MeshFactory(imagePlaneDepth, imageSphereRadius) {
-        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
-        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
-    }
-    MeshFactory.prototype.createMesh = function (node, transform) {
-        if (node.pano) {
-            return this._createImageSphere(node, transform);
-        }
-        else if (transform.cameraProjection === "fisheye") {
-            return this._createImagePlaneFisheye(node, transform);
-        }
-        else {
-            return this._createImagePlane(node, transform);
-        }
-    };
-    MeshFactory.prototype.createFlatMesh = function (node, transform, basicX0, basicX1, basicY0, basicY1) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createDistortedPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._getFlatImagePlaneGeoFromBasic(transform, basicX0, basicX1, basicY0, basicY1);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype.createCurtainMesh = function (node, transform) {
-        if (node.pano && !node.fullPano) {
-            throw new Error("Cropped panoramas cannot have curtain.");
-        }
-        if (node.pano) {
-            return this._createSphereCurtainMesh(node, transform);
-        }
-        else if (transform.cameraProjection === "fisheye") {
-            return this._createCurtainMeshFisheye(node, transform);
-        }
-        else {
-            return this._createCurtainMesh(node, transform);
-        }
-    };
-    MeshFactory.prototype.createDistortedCurtainMesh = function (node, transform) {
-        if (node.pano) {
-            throw new Error("Cropped panoramas cannot have curtain.");
-        }
-        return this._createDistortedCurtainMesh(node, transform);
-    };
-    MeshFactory.prototype._createCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createCurtainMeshFisheye = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainPlaneMaterialParametersFisheye(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeoFisheye(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createDistortedCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createDistortedCurtainPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createSphereCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        return this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-    };
-    MeshFactory.prototype._createImageSphere = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var mesh = this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-        return mesh;
-    };
-    MeshFactory.prototype._createImagePlane = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createImagePlaneFisheye = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParametersFisheye(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeoFisheye(transform, node) :
-            this._getRegularFlatImagePlaneGeoFisheye(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.equirectangular.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: { value: 1.0 },
-                phiLength: { value: phiLength },
-                phiShift: { value: phiShift },
-                projectorMat: { value: transform.rt },
-                projectorTex: { value: texture },
-                thetaLength: { value: thetaLength },
-                thetaShift: { value: thetaShift },
-            },
-            vertexShader: Component_1.Shaders.equirectangular.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.equirectangularCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: { value: 1.0 },
-                opacity: { value: 1.0 },
-                phiLength: { value: phiLength },
-                phiShift: { value: phiShift },
-                projectorMat: { value: transform.rt },
-                projectorTex: { value: texture },
-                thetaLength: { value: thetaLength },
-                thetaShift: { value: thetaShift },
-            },
-            vertexShader: Component_1.Shaders.equirectangularCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspective.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                focal: { value: transform.focal },
-                k1: { value: transform.ck1 },
-                k2: { value: transform.ck2 },
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.basicRt },
-                projectorTex: { value: texture },
-                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
-                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
-                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
-            },
-            vertexShader: Component_1.Shaders.perspective.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createPlaneMaterialParametersFisheye = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.fisheye.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                focal: { value: transform.focal },
-                k1: { value: transform.ck1 },
-                k2: { value: transform.ck2 },
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.basicRt },
-                projectorTex: { value: texture },
-                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
-                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
-                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
-            },
-            vertexShader: Component_1.Shaders.fisheye.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainPlaneMaterialParametersFisheye = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.fisheyeCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: { value: 1.0 },
-                focal: { value: transform.focal },
-                k1: { value: transform.ck1 },
-                k2: { value: transform.ck2 },
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.basicRt },
-                projectorTex: { value: texture },
-                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
-                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
-                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
-            },
-            vertexShader: Component_1.Shaders.fisheyeCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: { value: 1.0 },
-                focal: { value: transform.focal },
-                k1: { value: transform.ck1 },
-                k2: { value: transform.ck2 },
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.basicRt },
-                projectorTex: { value: texture },
-                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
-                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
-                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
-            },
-            vertexShader: Component_1.Shaders.perspectiveCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createDistortedCurtainPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveDistortedCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: { value: 1.0 },
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.projectorMatrix() },
-                projectorTex: { value: texture },
-            },
-            vertexShader: Component_1.Shaders.perspectiveDistortedCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createDistortedPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveDistorted.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: { value: 1.0 },
-                projectorMat: { value: transform.projectorMatrix() },
-                projectorTex: { value: texture },
-            },
-            vertexShader: Component_1.Shaders.perspectiveDistorted.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createTexture = function (image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        return texture;
-    };
-    MeshFactory.prototype._useMesh = function (transform, node) {
-        return node.mesh.vertices.length && transform.hasValidScale;
-    };
-    MeshFactory.prototype._getImageSphereGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imageSphereRadius * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getImagePlaneGeo = function (transform, node) {
-        var undistortionMarginFactor = 3;
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            if (i < 4) {
-                x *= undistortionMarginFactor;
-                y *= undistortionMarginFactor;
-            }
-            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
-            var factor = boundedZ / z;
-            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getImagePlaneGeoFisheye = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getFlatImageSphereGeo = function (transform) {
-        var gpano = transform.gpano;
-        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var thetaStart = Math.PI *
-            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
-            gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
-        geometry.applyMatrix4(new THREE.Matrix4().getInverse(transform.rt));
-        return geometry;
-    };
-    MeshFactory.prototype._getRegularFlatImagePlaneGeo = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        return this._getFlatImagePlaneGeo(transform, dx, dy);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeo = function (transform, dx, dy) {
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._getRegularFlatImagePlaneGeoFisheye = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        return this._getFlatImagePlaneGeoFisheye(transform, dx, dy);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeoFisheye = function (transform, dx, dy) {
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeoFromBasic = function (transform, basicX0, basicX1, basicY0, basicY1) {
-        var vertices = [];
-        vertices.push(transform.unprojectBasic([basicX0, basicY0], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX1, basicY0], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX1, basicY1], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX0, basicY1], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._createFlatGeometry = function (vertices) {
-        var positions = new Float32Array(12);
-        for (var i = 0; i < vertices.length; i++) {
-            var index = 3 * i;
-            positions[index + 0] = vertices[i][0];
-            positions[index + 1] = vertices[i][1];
-            positions[index + 2] = vertices[i][2];
-        }
-        var indices = new Uint16Array(6);
-        indices[0] = 0;
-        indices[1] = 1;
-        indices[2] = 3;
-        indices[3] = 1;
-        indices[4] = 2;
-        indices[5] = 3;
-        var geometry = new THREE.BufferGeometry();
-        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    return MeshFactory;
-}());
-exports.MeshFactory = MeshFactory;
-exports.default = MeshFactory;
-
-},{"../../Component":291,"three":242}],407:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MeshScene = void 0;
-var THREE = require("three");
-var MeshScene = /** @class */ (function () {
-    function MeshScene() {
-        this._planes = {};
-        this._planesOld = {};
-        this._planesPeriphery = {};
-        this._scene = new THREE.Scene();
-        this._sceneOld = new THREE.Scene();
-        this._scenePeriphery = new THREE.Scene();
-    }
-    Object.defineProperty(MeshScene.prototype, "planes", {
-        get: function () {
-            return this._planes;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "planesOld", {
-        get: function () {
-            return this._planesOld;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "planesPeriphery", {
-        get: function () {
-            return this._planesPeriphery;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "scene", {
-        get: function () {
-            return this._scene;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "sceneOld", {
-        get: function () {
-            return this._sceneOld;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "scenePeriphery", {
-        get: function () {
-            return this._scenePeriphery;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    MeshScene.prototype.updateImagePlanes = function (planes) {
-        this._dispose(this._planesOld, this.sceneOld);
-        for (var key in this._planes) {
-            if (!this._planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = this._planes[key];
-            this._scene.remove(plane);
-            this._sceneOld.add(plane);
-        }
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            this._scene.add(planes[key]);
-        }
-        this._planesOld = this._planes;
-        this._planes = planes;
-    };
-    MeshScene.prototype.addImagePlanes = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._scene.add(plane);
-            this._planes[key] = plane;
-        }
-    };
-    MeshScene.prototype.addImagePlanesOld = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._sceneOld.add(plane);
-            this._planesOld[key] = plane;
-        }
-    };
-    MeshScene.prototype.setImagePlanes = function (planes) {
-        this._clear();
-        this.addImagePlanes(planes);
-    };
-    MeshScene.prototype.addPeripheryPlanes = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._scenePeriphery.add(plane);
-            this._planesPeriphery[key] = plane;
-        }
-    };
-    MeshScene.prototype.setPeripheryPlanes = function (planes) {
-        this._clearPeriphery();
-        this.addPeripheryPlanes(planes);
-    };
-    MeshScene.prototype.setImagePlanesOld = function (planes) {
-        this._clearOld();
-        this.addImagePlanesOld(planes);
-    };
-    MeshScene.prototype.clear = function () {
-        this._clear();
-        this._clearOld();
-    };
-    MeshScene.prototype._clear = function () {
-        this._dispose(this._planes, this._scene);
-        this._planes = {};
-    };
-    MeshScene.prototype._clearOld = function () {
-        this._dispose(this._planesOld, this._sceneOld);
-        this._planesOld = {};
-    };
-    MeshScene.prototype._clearPeriphery = function () {
-        this._dispose(this._planesPeriphery, this._scenePeriphery);
-        this._planesPeriphery = {};
-    };
-    MeshScene.prototype._dispose = function (planes, scene) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            scene.remove(plane);
-            plane.geometry.dispose();
-            plane.material.dispose();
-            var texture = plane.material.uniforms.projectorTex.value;
-            if (texture != null) {
-                texture.dispose();
-            }
-        }
-    };
-    return MeshScene;
-}());
-exports.MeshScene = MeshScene;
-exports.default = MeshScene;
-
-},{"three":242}],408:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MouseOperator = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var MouseOperator = /** @class */ (function () {
-    function MouseOperator() {
-    }
-    MouseOperator.filteredPairwiseMouseDrag$ = function (name, mouseService) {
-        return mouseService
-            .filtered$(name, mouseService.mouseDragStart$).pipe(operators_1.switchMap(function (mouseDragStart) {
-            var mouseDragging$ = rxjs_1.concat(rxjs_1.of(mouseDragStart), mouseService
-                .filtered$(name, mouseService.mouseDrag$));
-            var mouseDragEnd$ = mouseService
-                .filtered$(name, mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
-                return null;
-            }));
-            return rxjs_1.merge(mouseDragging$, mouseDragEnd$).pipe(operators_1.takeWhile(function (e) {
-                return !!e;
-            }), operators_1.startWith(null));
-        }), operators_1.pairwise(), operators_1.filter(function (pair) {
-            return pair[0] != null && pair[1] != null;
-        }));
-    };
-    return MouseOperator;
-}());
-exports.MouseOperator = MouseOperator;
-exports.default = MouseOperator;
-
-},{"rxjs":43,"rxjs/operators":241}],409:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ZoomComponent = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var ComponentSize_1 = require("../utils/ComponentSize");
-/**
- * @class ZoomComponent
- *
- * @classdesc Component rendering UI elements used for zooming.
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var zoomComponent = viewer.getComponent("zoom");
- * zoomComponent.configure({ size: Mapillary.ComponentSize.Small });
- * ```
- */
-var ZoomComponent = /** @class */ (function (_super) {
-    __extends(ZoomComponent, _super);
-    function ZoomComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._zoomDelta$ = new rxjs_1.Subject();
-        return _this;
-    }
-    ZoomComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], state = _a[1], configuration = _a[2], size = _a[3];
-            var zoom = frame.state.zoom;
-            var zoomInIcon = vd.h("div.ZoomInIcon", []);
-            var zoomInButton = zoom >= 3 || state === State_1.State.Waiting ?
-                vd.h("div.ZoomInButtonDisabled", [zoomInIcon]) :
-                vd.h("div.ZoomInButton", { onclick: function () { _this._zoomDelta$.next(1); } }, [zoomInIcon]);
-            var zoomOutIcon = vd.h("div.ZoomOutIcon", []);
-            var zoomOutButton = zoom <= 0 || state === State_1.State.Waiting ?
-                vd.h("div.ZoomOutButtonDisabled", [zoomOutIcon]) :
-                vd.h("div.ZoomOutButton", { onclick: function () { _this._zoomDelta$.next(-1); } }, [zoomOutIcon]);
-            var compact = configuration.size === ComponentSize_1.default.Small ||
-                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
-                ".ZoomCompact" : "";
-            return {
-                name: _this._name,
-                vnode: vd.h("div.ZoomContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._zoomSubscription = this._zoomDelta$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var zoomDelta = _a[0], render = _a[1], transform = _a[2];
-            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            _this._navigator.stateService.zoomIn(zoomDelta, reference);
-        });
-    };
-    ZoomComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-    };
-    ZoomComponent.prototype._getDefaultConfiguration = function () {
-        return { size: ComponentSize_1.default.Automatic };
-    };
-    ZoomComponent.componentName = "zoom";
-    return ZoomComponent;
-}(Component_1.Component));
-exports.ZoomComponent = ZoomComponent;
-Component_1.ComponentService.register(ZoomComponent);
-exports.default = ZoomComponent;
-
-},{"../../Component":291,"../../Geo":294,"../../State":298,"../utils/ComponentSize":404,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],410:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AbortMapillaryError = void 0;
-var MapillaryError_1 = require("./MapillaryError");
-/**
- * @class AbortMapillaryError
- *
- * @classdesc Error thrown when a move to request has been
- * aborted before completing because of a subsequent request.
- */
-var AbortMapillaryError = /** @class */ (function (_super) {
-    __extends(AbortMapillaryError, _super);
-    function AbortMapillaryError(message) {
-        var _this = _super.call(this, message != null ? message : "The request was aborted.") || this;
-        Object.setPrototypeOf(_this, AbortMapillaryError.prototype);
-        _this.name = "AbortMapillaryError";
-        return _this;
-    }
-    return AbortMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.AbortMapillaryError = AbortMapillaryError;
-exports.default = AbortMapillaryError;
-
-},{"./MapillaryError":413}],411:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ArgumentMapillaryError = void 0;
-var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = /** @class */ (function (_super) {
-    __extends(ArgumentMapillaryError, _super);
-    function ArgumentMapillaryError(message) {
-        var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
-        Object.setPrototypeOf(_this, ArgumentMapillaryError.prototype);
-        _this.name = "ArgumentMapillaryError";
-        return _this;
-    }
-    return ArgumentMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.ArgumentMapillaryError = ArgumentMapillaryError;
-exports.default = ArgumentMapillaryError;
-
-},{"./MapillaryError":413}],412:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GraphMapillaryError = void 0;
-var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = /** @class */ (function (_super) {
-    __extends(GraphMapillaryError, _super);
-    function GraphMapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        Object.setPrototypeOf(_this, GraphMapillaryError.prototype);
-        _this.name = "GraphMapillaryError";
-        return _this;
-    }
-    return GraphMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.GraphMapillaryError = GraphMapillaryError;
-exports.default = GraphMapillaryError;
-
-},{"./MapillaryError":413}],413:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MapillaryError = void 0;
-var MapillaryError = /** @class */ (function (_super) {
-    __extends(MapillaryError, _super);
-    function MapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        Object.setPrototypeOf(_this, MapillaryError.prototype);
-        _this.name = "MapillaryError";
-        return _this;
-    }
-    return MapillaryError;
-}(Error));
-exports.MapillaryError = MapillaryError;
-exports.default = MapillaryError;
-
-},{}],414:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Camera = void 0;
-var THREE = require("three");
-/**
- * @class Camera
- *
- * @classdesc Holds information about a camera.
- */
-var Camera = /** @class */ (function () {
-    /**
-     * Create a new camera instance.
-     * @param {Transform} [transform] - Optional transform instance.
-     */
-    function Camera(transform) {
-        if (transform != null) {
-            this._position = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0));
-            this._lookat = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10));
-            this._up = transform.upVector();
-            this._focal = this._getFocal(transform);
-        }
-        else {
-            this._position = new THREE.Vector3(0, 0, 0);
-            this._lookat = new THREE.Vector3(0, 0, 1);
-            this._up = new THREE.Vector3(0, -1, 0);
-            this._focal = 1;
-        }
-    }
-    Object.defineProperty(Camera.prototype, "position", {
-        /**
-         * Get position.
-         * @returns {THREE.Vector3} The position vector.
-         */
-        get: function () {
-            return this._position;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "lookat", {
-        /**
-         * Get lookat.
-         * @returns {THREE.Vector3} The lookat vector.
-         */
-        get: function () {
-            return this._lookat;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "up", {
-        /**
-         * Get up.
-         * @returns {THREE.Vector3} The up vector.
-         */
-        get: function () {
-            return this._up;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "focal", {
-        /**
-         * Get focal.
-         * @returns {number} The focal length.
-         */
-        get: function () {
-            return this._focal;
-        },
-        /**
-         * Set focal.
-         */
-        set: function (value) {
-            this._focal = value;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Update this camera to the linearly interpolated value of two other cameras.
-     *
-     * @param {Camera} a - First camera.
-     * @param {Camera} b - Second camera.
-     * @param {number} alpha - Interpolation value on the interval [0, 1].
-     */
-    Camera.prototype.lerpCameras = function (a, b, alpha) {
-        this._position.subVectors(b.position, a.position).multiplyScalar(alpha).add(a.position);
-        this._lookat.subVectors(b.lookat, a.lookat).multiplyScalar(alpha).add(a.lookat);
-        this._up.subVectors(b.up, a.up).multiplyScalar(alpha).add(a.up);
-        this._focal = (1 - alpha) * a.focal + alpha * b.focal;
-    };
-    /**
-     * Copy the properties of another camera to this camera.
-     *
-     * @param {Camera} other - Another camera.
-     */
-    Camera.prototype.copy = function (other) {
-        this._position.copy(other.position);
-        this._lookat.copy(other.lookat);
-        this._up.copy(other.up);
-        this._focal = other.focal;
-    };
-    /**
-     * Clone this camera.
-     *
-     * @returns {Camera} A camera with cloned properties equal to this camera.
-     */
-    Camera.prototype.clone = function () {
-        var camera = new Camera();
-        camera.position.copy(this._position);
-        camera.lookat.copy(this._lookat);
-        camera.up.copy(this._up);
-        camera.focal = this._focal;
-        return camera;
-    };
-    /**
-     * Determine the distance between this camera and another camera.
-     *
-     * @param {Camera} other - Another camera.
-     * @returns {number} The distance between the cameras.
-     */
-    Camera.prototype.diff = function (other) {
-        var pd = this._position.distanceToSquared(other.position);
-        var ld = this._lookat.distanceToSquared(other.lookat);
-        var ud = this._up.distanceToSquared(other.up);
-        var fd = 100 * Math.abs(this._focal - other.focal);
-        return Math.max(pd, ld, ud, fd);
-    };
-    /**
-     * Get the focal length based on the transform.
-     *
-     * @description Returns the focal length of the transform if gpano info is not available.
-     * Returns a focal length corresponding to a vertical fov clamped to [45, 90] degrees based on
-     * the gpano information if available.
-     *
-     * @returns {number} Focal length.
-     */
-    Camera.prototype._getFocal = function (transform) {
-        if (transform.gpano == null) {
-            return transform.focal;
-        }
-        var vFov = Math.PI * transform.gpano.CroppedAreaImageHeightPixels / transform.gpano.FullPanoHeightPixels;
-        var focal = 0.5 / Math.tan(vFov / 2);
-        return Math.min(1 / (2 * (Math.sqrt(2) - 1)), Math.max(0.5, focal));
-    };
-    return Camera;
-}());
-exports.Camera = Camera;
-
-},{"three":242}],415:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.computeProjectedPoints = exports.computeTranslation = void 0;
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var geoCoords = new Geo_1.GeoCoords();
-var spatial = new Geo_1.Spatial();
-function computeTranslation(position, rotation, reference) {
-    var C = geoCoords.geodeticToEnu(position.lat, position.lon, position.alt, reference.lat, reference.lon, reference.alt);
-    var RC = spatial.rotate(C, rotation);
-    var translation = [-RC.x, -RC.y, -RC.z];
-    return translation;
-}
-exports.computeTranslation = computeTranslation;
-function computeProjectedPoints(transform, basicVertices, basicDirections, pointsPerLine, viewportCoords) {
-    var basicPoints = [];
-    for (var side = 0; side < basicVertices.length; ++side) {
-        var v = basicVertices[side];
-        var d = basicDirections[side];
-        for (var i = 0; i <= pointsPerLine; ++i) {
-            basicPoints.push([v[0] + d[0] * i / pointsPerLine,
-                v[1] + d[1] * i / pointsPerLine]);
-        }
-    }
-    var camera = new THREE.Camera();
-    camera.up.copy(transform.upVector());
-    camera.position.copy(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0)));
-    camera.lookAt(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10)));
-    camera.updateMatrix();
-    camera.updateMatrixWorld(true);
-    var projectedPoints = basicPoints
-        .map(function (basicPoint) {
-        var worldPoint = transform.unprojectBasic(basicPoint, 10000);
-        var cameraPoint = viewportCoords.worldToCamera(worldPoint, camera);
-        return [
-            Math.abs(cameraPoint[0] / cameraPoint[2]),
-            Math.abs(cameraPoint[1] / cameraPoint[2]),
-        ];
-    });
-    return projectedPoints;
-}
-exports.computeProjectedPoints = computeProjectedPoints;
-
-},{"../Geo":294,"three":242}],416:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GeoCoords = void 0;
-/**
- * @class GeoCoords
- *
- * @classdesc Converts coordinates between the geodetic (WGS84),
- * Earth-Centered, Earth-Fixed (ECEF) and local topocentric
- * East, North, Up (ENU) reference frames.
- *
- * The WGS84 has latitude (degrees), longitude (degrees) and
- * altitude (meters) values.
- *
- * The ECEF Z-axis pierces the north pole and the
- * XY-axis defines the equatorial plane. The X-axis extends
- * from the geocenter to the intersection of the Equator and
- * the Greenwich Meridian. All values in meters.
- *
- * The WGS84 parameters are:
- *
- * a = 6378137
- * b = a * (1 - f)
- * f = 1 / 298.257223563
- * e = Math.sqrt((a^2 - b^2) / a^2)
- * e' = Math.sqrt((a^2 - b^2) / b^2)
- *
- * The WGS84 to ECEF conversion is performed using the following:
- *
- * X = (N - h) * cos(phi) * cos(lambda)
- * Y = (N + h) * cos(phi) * sin(lambda)
- * Z = (b^2 * N / a^2 + h) * sin(phi)
- *
- * where
- *
- * phi = latitude
- * lambda = longitude
- * h = height above ellipsoid (altitude)
- * N = Radius of curvature (meters)
- *   = a / Math.sqrt(1 - e^2 * sin(phi)^2)
- *
- * The ECEF to WGS84 conversion is performed using the following:
- *
- * phi = arctan((Z + e'^2 * b * sin(theta)^3) / (p - e^2 * a * cos(theta)^3))
- * lambda = arctan(Y / X)
- * h = p / cos(phi) - N
- *
- * where
- *
- * p = Math.sqrt(X^2 + Y^2)
- * theta = arctan(Z * a / p * b)
- *
- * In the ENU reference frame the x-axis points to the
- * East, the y-axis to the North and the z-axis Up. All values
- * in meters.
- *
- * The ECEF to ENU conversion is performed using the following:
- *
- * | x |   |       -sin(lambda_r)                cos(lambda_r)             0      | | X - X_r |
- * | y | = | -sin(phi_r) * cos(lambda_r)  -sin(phi_r) * sin(lambda_r)  cos(phi_r) | | Y - Y_r |
- * | z |   |  cos(phi_r) * cos(lambda_r)   cos(phi_r) * sin(lambda_r)  sin(phi_r) | | Z - Z_r |
- *
- * where
- *
- * phi_r = latitude of reference
- * lambda_r = longitude of reference
- * X_r, Y_r, Z_r = ECEF coordinates of reference
- *
- * The ENU to ECEF conversion is performed by solving the above equation for X, Y, Z.
- *
- * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in
- * the first step for both conversions.
- */
-var GeoCoords = /** @class */ (function () {
-    function GeoCoords() {
-        this._wgs84a = 6378137.0;
-        this._wgs84b = 6356752.31424518;
-    }
-    /**
-     * Convert coordinates from geodetic (WGS84) reference to local topocentric
-     * (ENU) reference.
-     *
-     * @param {number} lat Latitude in degrees.
-     * @param {number} lon Longitude in degrees.
-     * @param {number} alt Altitude in meters.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The x, y, z local topocentric ENU coordinates.
-     */
-    GeoCoords.prototype.geodeticToEnu = function (lat, lon, alt, refLat, refLon, refAlt) {
-        var ecef = this.geodeticToEcef(lat, lon, alt);
-        return this.ecefToEnu(ecef[0], ecef[1], ecef[2], refLat, refLon, refAlt);
-    };
-    /**
-     * Convert coordinates from local topocentric (ENU) reference to
-     * geodetic (WGS84) reference.
-     *
-     * @param {number} x Topocentric ENU coordinate in East direction.
-     * @param {number} y Topocentric ENU coordinate in North direction.
-     * @param {number} z Topocentric ENU coordinate in Up direction.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The latitude and longitude in degrees
-     *                          as well as altitude in meters.
-     */
-    GeoCoords.prototype.enuToGeodetic = function (x, y, z, refLat, refLon, refAlt) {
-        var ecef = this.enuToEcef(x, y, z, refLat, refLon, refAlt);
-        return this.ecefToGeodetic(ecef[0], ecef[1], ecef[2]);
-    };
-    /**
-     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
-     * to local topocentric (ENU) reference.
-     *
-     * @param {number} X ECEF X-value.
-     * @param {number} Y ECEF Y-value.
-     * @param {number} Z ECEF Z-value.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The x, y, z topocentric ENU coordinates in East, North
-     * and Up directions respectively.
-     */
-    GeoCoords.prototype.ecefToEnu = function (X, Y, Z, refLat, refLon, refAlt) {
-        var refEcef = this.geodeticToEcef(refLat, refLon, refAlt);
-        var V = [X - refEcef[0], Y - refEcef[1], Z - refEcef[2]];
-        refLat = refLat * Math.PI / 180.0;
-        refLon = refLon * Math.PI / 180.0;
-        var cosLat = Math.cos(refLat);
-        var sinLat = Math.sin(refLat);
-        var cosLon = Math.cos(refLon);
-        var sinLon = Math.sin(refLon);
-        var x = -sinLon * V[0] + cosLon * V[1];
-        var y = -sinLat * cosLon * V[0] - sinLat * sinLon * V[1] + cosLat * V[2];
-        var z = cosLat * cosLon * V[0] + cosLat * sinLon * V[1] + sinLat * V[2];
-        return [x, y, z];
-    };
-    /**
-     * Convert coordinates from local topocentric (ENU) reference
-     * to Earth-Centered, Earth-Fixed (ECEF) reference.
-     *
-     * @param {number} x Topocentric ENU coordinate in East direction.
-     * @param {number} y Topocentric ENU coordinate in North direction.
-     * @param {number} z Topocentric ENU coordinate in Up direction.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The X, Y, Z ECEF coordinates.
-     */
-    GeoCoords.prototype.enuToEcef = function (x, y, z, refLat, refLon, refAlt) {
-        var refEcef = this.geodeticToEcef(refLat, refLon, refAlt);
-        refLat = refLat * Math.PI / 180.0;
-        refLon = refLon * Math.PI / 180.0;
-        var cosLat = Math.cos(refLat);
-        var sinLat = Math.sin(refLat);
-        var cosLon = Math.cos(refLon);
-        var sinLon = Math.sin(refLon);
-        var X = -sinLon * x - sinLat * cosLon * y + cosLat * cosLon * z + refEcef[0];
-        var Y = cosLon * x - sinLat * sinLon * y + cosLat * sinLon * z + refEcef[1];
-        var Z = cosLat * y + sinLat * z + refEcef[2];
-        return [X, Y, Z];
-    };
-    /**
-     * Convert coordinates from geodetic reference (WGS84) to Earth-Centered,
-     * Earth-Fixed (ECEF) reference.
-     *
-     * @param {number} lat Latitude in degrees.
-     * @param {number} lon Longitude in degrees.
-     * @param {number} alt Altitude in meters.
-     * @returns {Array<number>} The X, Y, Z ECEF coordinates.
-     */
-    GeoCoords.prototype.geodeticToEcef = function (lat, lon, alt) {
-        var a = this._wgs84a;
-        var b = this._wgs84b;
-        lat = lat * Math.PI / 180.0;
-        lon = lon * Math.PI / 180.0;
-        var cosLat = Math.cos(lat);
-        var sinLat = Math.sin(lat);
-        var cosLon = Math.cos(lon);
-        var sinLon = Math.sin(lon);
-        var a2 = a * a;
-        var b2 = b * b;
-        var L = 1.0 / Math.sqrt(a2 * cosLat * cosLat + b2 * sinLat * sinLat);
-        var nhcl = (a2 * L + alt) * cosLat;
-        var X = nhcl * cosLon;
-        var Y = nhcl * sinLon;
-        var Z = (b2 * L + alt) * sinLat;
-        return [X, Y, Z];
-    };
-    /**
-     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
-     * to geodetic reference (WGS84).
-     *
-     * @param {number} X ECEF X-value.
-     * @param {number} Y ECEF Y-value.
-     * @param {number} Z ECEF Z-value.
-     * @returns {Array<number>} The latitude and longitude in degrees
-     *                          as well as altitude in meters.
-     */
-    GeoCoords.prototype.ecefToGeodetic = function (X, Y, Z) {
-        var a = this._wgs84a;
-        var b = this._wgs84b;
-        var a2 = a * a;
-        var b2 = b * b;
-        var a2mb2 = a2 - b2;
-        var ea = Math.sqrt(a2mb2 / a2);
-        var eb = Math.sqrt(a2mb2 / b2);
-        var p = Math.sqrt(X * X + Y * Y);
-        var theta = Math.atan2(Z * a, p * b);
-        var sinTheta = Math.sin(theta);
-        var cosTheta = Math.cos(theta);
-        var lon = Math.atan2(Y, X);
-        var lat = Math.atan2(Z + eb * eb * b * sinTheta * sinTheta * sinTheta, p - ea * ea * a * cosTheta * cosTheta * cosTheta);
-        var sinLat = Math.sin(lat);
-        var cosLat = Math.cos(lat);
-        var N = a / Math.sqrt(1 - ea * ea * sinLat * sinLat);
-        var alt = p / cosLat - N;
-        return [lat * 180.0 / Math.PI, lon * 180.0 / Math.PI, alt];
-    };
-    return GeoCoords;
-}());
-exports.GeoCoords = GeoCoords;
-exports.default = GeoCoords;
-
-},{}],417:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GeoRBush = void 0;
-var RBush = require("rbush");
-var GeoRBush = /** @class */ (function (_super) {
-    __extends(GeoRBush, _super);
-    function GeoRBush() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    GeoRBush.prototype.compareMinX = function (a, b) { return a.lat - b.lat; };
-    GeoRBush.prototype.compareMinY = function (a, b) { return a.lon - b.lon; };
-    GeoRBush.prototype.toBBox = function (item) {
-        return { minX: item.lat, minY: item.lon, maxX: item.lat, maxY: item.lon };
-    };
-    return GeoRBush;
-}(RBush));
-exports.GeoRBush = GeoRBush;
-exports.default = GeoRBush;
-
-},{"rbush":42}],418:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.segmentIntersection = exports.segmentsIntersect = void 0;
-function sign(n) {
-    return n > 0 ? 1 : n < 0 ? -1 : 0;
-}
-function colinearPointOnSegment(p, s) {
-    return p.x <= Math.max(s.p1.x, s.p2.x) &&
-        p.x >= Math.min(s.p1.x, s.p2.x) &&
-        p.y >= Math.max(s.p1.y, s.p2.y) &&
-        p.y >= Math.min(s.p1.y, s.p2.y);
-}
-function parallel(s1, s2) {
-    var ux = s1.p2.x - s1.p1.x;
-    var uy = s1.p2.y - s1.p1.y;
-    var vx = s2.p2.x - s2.p1.x;
-    var vy = s2.p2.y - s2.p1.y;
-    var cross = ux * vy - uy * vx;
-    var u2 = ux * ux + uy * uy;
-    var v2 = vx * vx + vy * vy;
-    var epsilon2 = 1e-10;
-    return cross * cross < epsilon2 * u2 * v2;
-}
-function tripletOrientation(p1, p2, p3) {
-    var orientation = (p2.y - p1.y) * (p3.x - p2.x) -
-        (p3.y - p2.y) * (p2.x - p1.x);
-    return sign(orientation);
-}
-function segmentsIntersect(s1, s2) {
-    if (parallel(s1, s2)) {
-        return false;
-    }
-    var o1 = tripletOrientation(s1.p1, s1.p2, s2.p1);
-    var o2 = tripletOrientation(s1.p1, s1.p2, s2.p2);
-    var o3 = tripletOrientation(s2.p1, s2.p2, s1.p1);
-    var o4 = tripletOrientation(s2.p1, s2.p2, s1.p2);
-    if (o1 !== o2 && o3 !== o4) {
-        return true;
-    }
-    if (o1 === 0 && colinearPointOnSegment(s2.p1, s1)) {
-        return true;
-    }
-    if (o2 === 0 && colinearPointOnSegment(s2.p2, s1)) {
-        return true;
-    }
-    if (o3 === 0 && colinearPointOnSegment(s1.p1, s2)) {
-        return true;
-    }
-    if (o4 === 0 && colinearPointOnSegment(s1.p2, s2)) {
-        return true;
-    }
-    return false;
-}
-exports.segmentsIntersect = segmentsIntersect;
-function segmentIntersection(s1, s2) {
-    if (parallel(s1, s2)) {
-        return undefined;
-    }
-    var x1 = s1.p1.x;
-    var x2 = s1.p2.x;
-    var y1 = s1.p1.y;
-    var y2 = s1.p2.y;
-    var x3 = s2.p1.x;
-    var x4 = s2.p2.x;
-    var y3 = s2.p1.y;
-    var y4 = s2.p2.y;
-    var den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
-    var xNum = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
-    var yNum = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
-    return { x: xNum / den, y: yNum / den };
-}
-exports.segmentIntersection = segmentIntersection;
-
-},{}],419:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Spatial = void 0;
-var THREE = require("three");
-/**
- * @class Spatial
- *
- * @classdesc Provides methods for scalar, vector and matrix calculations.
- */
-var Spatial = /** @class */ (function () {
-    function Spatial() {
-        this._epsilon = 1e-9;
-    }
-    /**
-     * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to
-     * bearing (clockwise with origin at north or Y-axis).
-     *
-     * @param {number} phi - Azimuthal phi angle in radians.
-     * @returns {number} Bearing in radians.
-     */
-    Spatial.prototype.azimuthalToBearing = function (phi) {
-        return -phi + Math.PI / 2;
-    };
-    /**
-     * Converts degrees to radians.
-     *
-     * @param {number} deg - Degrees.
-     * @returns {number} Radians.
-     */
-    Spatial.prototype.degToRad = function (deg) {
-        return Math.PI * deg / 180;
-    };
-    /**
-     * Converts radians to degrees.
-     *
-     * @param {number} rad - Radians.
-     * @returns {number} Degrees.
-     */
-    Spatial.prototype.radToDeg = function (rad) {
-        return 180 * rad / Math.PI;
-    };
-    /**
-     * Creates a rotation matrix from an angle-axis vector.
-     *
-     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
-     * @returns {THREE.Matrix4} Rotation matrix.
-     */
-    Spatial.prototype.rotationMatrix = function (angleAxis) {
-        var axis = new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]);
-        var angle = axis.length();
-        if (angle > 0) {
-            axis.normalize();
-        }
-        return new THREE.Matrix4().makeRotationAxis(axis, angle);
-    };
-    /**
-     * Rotates a vector according to a angle-axis rotation vector.
-     *
-     * @param {Array<number>} vector - Vector to rotate.
-     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
-     * @returns {THREE.Vector3} Rotated vector.
-     */
-    Spatial.prototype.rotate = function (vector, angleAxis) {
-        var v = new THREE.Vector3(vector[0], vector[1], vector[2]);
-        var rotationMatrix = this.rotationMatrix(angleAxis);
-        v.applyMatrix4(rotationMatrix);
-        return v;
-    };
-    /**
-     * Calculates the optical center from a rotation vector
-     * on the angle-axis representation and a translation vector
-     * according to C = -R^T t.
-     *
-     * @param {Array<number>} rotation - Angle-axis representation of a rotation.
-     * @param {Array<number>} translation - Translation vector.
-     * @returns {THREE.Vector3} Optical center.
-     */
-    Spatial.prototype.opticalCenter = function (rotation, translation) {
-        var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
-        var vector = [-translation[0], -translation[1], -translation[2]];
-        return this.rotate(vector, angleAxis);
-    };
-    /**
-     * Calculates the viewing direction from a rotation vector
-     * on the angle-axis representation.
-     *
-     * @param {number[]} rotation - Angle-axis representation of a rotation.
-     * @returns {THREE.Vector3} Viewing direction.
-     */
-    Spatial.prototype.viewingDirection = function (rotation) {
-        var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
-        return this.rotate([0, 0, 1], angleAxis);
-    };
-    /**
-     * Wrap a number on the interval [min, max].
-     *
-     * @param {number} value - Value to wrap.
-     * @param {number} min - Lower endpoint of interval.
-     * @param {number} max - Upper endpoint of interval.
-     * @returns {number} The wrapped number.
-     */
-    Spatial.prototype.wrap = function (value, min, max) {
-        if (max < min) {
-            throw new Error("Invalid arguments: max must be larger than min.");
-        }
-        var interval = (max - min);
-        while (value > max || value < min) {
-            if (value > max) {
-                value = value - interval;
-            }
-            else if (value < min) {
-                value = value + interval;
-            }
-        }
-        return value;
-    };
-    /**
-     * Wrap an angle on the interval [-Pi, Pi].
-     *
-     * @param {number} angle - Value to wrap.
-     * @returns {number} Wrapped angle.
-     */
-    Spatial.prototype.wrapAngle = function (angle) {
-        return this.wrap(angle, -Math.PI, Math.PI);
-    };
-    /**
-     * Limit the value to the interval [min, max] by changing the value to
-     * the nearest available one when it is outside the interval.
-     *
-     * @param {number} value - Value to clamp.
-     * @param {number} min - Minimum of the interval.
-     * @param {number} max - Maximum of the interval.
-     * @returns {number} Clamped value.
-     */
-    Spatial.prototype.clamp = function (value, min, max) {
-        if (value < min) {
-            return min;
-        }
-        if (value > max) {
-            return max;
-        }
-        return value;
-    };
-    /**
-     * Calculates the counter-clockwise angle from the first
-     * vector (x1, y1)^T to the second (x2, y2)^T.
-     *
-     * @param {number} x1 - X coordinate of first vector.
-     * @param {number} y1 - Y coordinate of first vector.
-     * @param {number} x2 - X coordinate of second vector.
-     * @param {number} y2 - Y coordinate of second vector.
-     * @returns {number} Counter clockwise angle between the vectors.
-     */
-    Spatial.prototype.angleBetweenVector2 = function (x1, y1, x2, y2) {
-        var angle = Math.atan2(y2, x2) - Math.atan2(y1, x1);
-        return this.wrapAngle(angle);
-    };
-    /**
-     * Calculates the minimum (absolute) angle change for rotation
-     * from one angle to another on the [-Pi, Pi] interval.
-     *
-     * @param {number} angle1 - Start angle.
-     * @param {number} angle2 - Destination angle.
-     * @returns {number} Absolute angle change between angles.
-     */
-    Spatial.prototype.angleDifference = function (angle1, angle2) {
-        var angle = angle2 - angle1;
-        return this.wrapAngle(angle);
-    };
-    /**
-     * Calculates the relative rotation angle between two
-     * angle-axis vectors.
-     *
-     * @param {number} rotation1 - First angle-axis vector.
-     * @param {number} rotation2 - Second angle-axis vector.
-     * @returns {number} Relative rotation angle.
-     */
-    Spatial.prototype.relativeRotationAngle = function (rotation1, rotation2) {
-        var R1T = this.rotationMatrix([-rotation1[0], -rotation1[1], -rotation1[2]]);
-        var R2 = this.rotationMatrix(rotation2);
-        var R = R1T.multiply(R2);
-        var elements = R.elements;
-        // from Tr(R) = 1 + 2 * cos(theta)
-        var tr = elements[0] + elements[5] + elements[10];
-        var theta = Math.acos(Math.max(Math.min((tr - 1) / 2, 1), -1));
-        return theta;
-    };
-    /**
-     * Calculates the angle from a vector to a plane.
-     *
-     * @param {Array<number>} vector - The vector.
-     * @param {Array<number>} planeNormal - Normal of the plane.
-     * @returns {number} Angle from between plane and vector.
-     */
-    Spatial.prototype.angleToPlane = function (vector, planeNormal) {
-        var v = new THREE.Vector3().fromArray(vector);
-        var norm = v.length();
-        if (norm < this._epsilon) {
-            return 0;
-        }
-        var projection = v.dot(new THREE.Vector3().fromArray(planeNormal));
-        return Math.asin(projection / norm);
-    };
-    Spatial.prototype.azimuthal = function (direction, up) {
-        var directionVector = new THREE.Vector3().fromArray(direction);
-        var upVector = new THREE.Vector3().fromArray(up);
-        var upProjection = directionVector.clone().dot(upVector);
-        var planeProjection = directionVector.clone().sub(upVector.clone().multiplyScalar(upProjection));
-        return Math.atan2(planeProjection.y, planeProjection.x);
-    };
-    /**
-     * Calculates the distance between two coordinates
-     * (latitude longitude pairs) in meters according to
-     * the haversine formula.
-     *
-     * @param {number} lat1 - Latitude of the first coordinate in degrees.
-     * @param {number} lon1 - Longitude of the first coordinate in degrees.
-     * @param {number} lat2 - Latitude of the second coordinate in degrees.
-     * @param {number} lon2 - Longitude of the second coordinate in degrees.
-     * @returns {number} Distance between lat lon positions in meters.
-     */
-    Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) {
-        var r = 6371000;
-        var dLat = this.degToRad(lat2 - lat1);
-        var dLon = this.degToRad(lon2 - lon1);
-        var hav = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
-            Math.cos(this.degToRad(lat1)) * Math.cos(this.degToRad(lat2)) *
-                Math.sin(dLon / 2) * Math.sin(dLon / 2);
-        var d = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav));
-        return d;
-    };
-    return Spatial;
-}());
-exports.Spatial = Spatial;
-exports.default = Spatial;
-
-},{"three":242}],420:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Transform = void 0;
-var THREE = require("three");
-/**
- * @class Transform
- *
- * @classdesc Class used for calculating coordinate transformations
- * and projections.
- */
-var Transform = /** @class */ (function () {
-    /**
-     * Create a new transform instance.
-     * @param {number} orientation - Image orientation.
-     * @param {number} width - Image height.
-     * @param {number} height - Image width.
-     * @param {number} focal - Focal length.
-     * @param {number} scale - Atomic scale.
-     * @param {IGPano} gpano - Panorama properties.
-     * @param {Array<number>} rotation - Rotation vector in three dimensions.
-     * @param {Array<number>} translation - Translation vector in three dimensions.
-     * @param {HTMLImageElement} image - Image for fallback size calculations.
-     */
-    function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale, ck1, ck2, cameraProjection) {
-        this._orientation = this._getValue(orientation, 1);
-        var imageWidth = image != null ? image.width : 4;
-        var imageHeight = image != null ? image.height : 3;
-        var keepOrientation = this._orientation < 5;
-        this._width = this._getValue(width, keepOrientation ? imageWidth : imageHeight);
-        this._height = this._getValue(height, keepOrientation ? imageHeight : imageWidth);
-        this._basicAspect = keepOrientation ?
-            this._width / this._height :
-            this._height / this._width;
-        this._basicWidth = keepOrientation ? width : height;
-        this._basicHeight = keepOrientation ? height : width;
-        this._focal = this._getValue(focal, 1);
-        this._scale = this._getValue(scale, 0);
-        this._gpano = gpano != null ? gpano : null;
-        this._rt = this._getRt(rotation, translation);
-        this._srt = this._getSrt(this._rt, this._scale);
-        this._basicRt = this._getBasicRt(this._rt, orientation);
-        this._textureScale = !!textureScale ? textureScale : [1, 1];
-        this._ck1 = !!ck1 ? ck1 : 0;
-        this._ck2 = !!ck2 ? ck2 : 0;
-        this._cameraProjection = !!cameraProjection ?
-            cameraProjection :
-            !!gpano ?
-                "equirectangular" :
-                "perspective";
-        this._radialPeak = this._getRadialPeak(this._ck1, this._ck2);
-    }
-    Object.defineProperty(Transform.prototype, "ck1", {
-        get: function () {
-            return this._ck1;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "ck2", {
-        get: function () {
-            return this._ck2;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "cameraProjection", {
-        get: function () {
-            return this._cameraProjection;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicAspect", {
-        /**
-         * Get basic aspect.
-         * @returns {number} The orientation adjusted aspect ratio.
-         */
-        get: function () {
-            return this._basicAspect;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicHeight", {
-        /**
-         * Get basic height.
-         *
-         * @description Does not fall back to node image height but
-         * uses original value from API so can be faulty.
-         *
-         * @returns {number} The height of the basic version image
-         * (adjusted for orientation).
-         */
-        get: function () {
-            return this._basicHeight;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicRt", {
-        get: function () {
-            return this._basicRt;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicWidth", {
-        /**
-         * Get basic width.
-         *
-         * @description Does not fall back to node image width but
-         * uses original value from API so can be faulty.
-         *
-         * @returns {number} The width of the basic version image
-         * (adjusted for orientation).
-         */
-        get: function () {
-            return this._basicWidth;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "focal", {
-        /**
-         * Get focal.
-         * @returns {number} The node focal length.
-         */
-        get: function () {
-            return this._focal;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "fullPano", {
-        /**
-         * Get fullPano.
-         *
-         * @returns {boolean} Value indicating whether the node is a complete
-         * 360 panorama.
-         */
-        get: function () {
-            return this._gpano != null &&
-                this._gpano.CroppedAreaLeftPixels === 0 &&
-                this._gpano.CroppedAreaTopPixels === 0 &&
-                this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&
-                this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "gpano", {
-        /**
-         * Get gpano.
-         * @returns {number} The node gpano information.
-         */
-        get: function () {
-            return this._gpano;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "height", {
-        /**
-         * Get height.
-         *
-         * @description Falls back to the node image height if
-         * the API data is faulty.
-         *
-         * @returns {number} The orientation adjusted image height.
-         */
-        get: function () {
-            return this._height;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "orientation", {
-        /**
-         * Get orientation.
-         * @returns {number} The image orientation.
-         */
-        get: function () {
-            return this._orientation;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "rt", {
-        /**
-         * Get rt.
-         * @returns {THREE.Matrix4} The extrinsic camera matrix.
-         */
-        get: function () {
-            return this._rt;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "srt", {
-        /**
-         * Get srt.
-         * @returns {THREE.Matrix4} The scaled extrinsic camera matrix.
-         */
-        get: function () {
-            return this._srt;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "scale", {
-        /**
-         * Get scale.
-         * @returns {number} The node atomic reconstruction scale.
-         */
-        get: function () {
-            return this._scale;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "hasValidScale", {
-        /**
-         * Get has valid scale.
-         * @returns {boolean} Value indicating if the scale of the transform is valid.
-         */
-        get: function () {
-            return this._scale > 1e-2 && this._scale < 50;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "radialPeak", {
-        /**
-         * Get radial peak.
-         * @returns {number} Value indicating the radius where the radial
-         * undistortion function peaks.
-         */
-        get: function () {
-            return this._radialPeak;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "width", {
-        /**
-         * Get width.
-         *
-         * @description Falls back to the node image width if
-         * the API data is faulty.
-         *
-         * @returns {number} The orientation adjusted image width.
-         */
-        get: function () {
-            return this._width;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Calculate the up vector for the node transform.
-     *
-     * @returns {THREE.Vector3} Normalized and orientation adjusted up vector.
-     */
-    Transform.prototype.upVector = function () {
-        var rte = this._rt.elements;
-        switch (this._orientation) {
-            case 1:
-                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);
-            case 3:
-                return new THREE.Vector3(rte[1], rte[5], rte[9]);
-            case 6:
-                return new THREE.Vector3(-rte[0], -rte[4], -rte[8]);
-            case 8:
-                return new THREE.Vector3(rte[0], rte[4], rte[8]);
-            default:
-                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);
-        }
-    };
-    /**
-     * Calculate projector matrix for projecting 3D points to texture map
-     * coordinates (u and v).
-     *
-     * @returns {THREE.Matrix4} Projection matrix for 3D point to texture
-     * map coordinate calculations.
-     */
-    Transform.prototype.projectorMatrix = function () {
-        var projector = this._normalizedToTextureMatrix();
-        var f = this._focal;
-        var projection = new THREE.Matrix4().set(f, 0, 0, 0, 0, f, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);
-        projector.multiply(projection);
-        projector.multiply(this._rt);
-        return projector;
-    };
-    /**
-     * Project 3D world coordinates to basic coordinates.
-     *
-     * @param {Array<number>} point3d - 3D world coordinates.
-     * @return {Array<number>} 2D basic coordinates.
-     */
-    Transform.prototype.projectBasic = function (point3d) {
-        var sfm = this.projectSfM(point3d);
-        return this._sfmToBasic(sfm);
-    };
-    /**
-     * Unproject basic coordinates to 3D world coordinates.
-     *
-     * @param {Array<number>} basic - 2D basic coordinates.
-     * @param {Array<number>} distance - Distance to unproject from camera center.
-     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
-     *                            Only applicable for perspective images. Will be
-     *                            ignored for panoramas.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectBasic = function (basic, distance, depth) {
-        var sfm = this._basicToSfm(basic);
-        return this.unprojectSfM(sfm, distance, depth);
-    };
-    /**
-     * Project 3D world coordinates to SfM coordinates.
-     *
-     * @param {Array<number>} point3d - 3D world coordinates.
-     * @return {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype.projectSfM = function (point3d) {
-        var v = new THREE.Vector4(point3d[0], point3d[1], point3d[2], 1);
-        v.applyMatrix4(this._rt);
-        return this._bearingToSfm([v.x, v.y, v.z]);
-    };
-    /**
-     * Unproject SfM coordinates to a 3D world coordinates.
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @param {Array<number>} distance - Distance to unproject from camera center.
-     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
-     *                            Only applicable for perspective images. Will be
-     *                            ignored for panoramas.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectSfM = function (sfm, distance, depth) {
-        var bearing = this._sfmToBearing(sfm);
-        var v = depth && !this.gpano ?
-            new THREE.Vector4(distance * bearing[0] / bearing[2], distance * bearing[1] / bearing[2], distance, 1) :
-            new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
-        v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));
-        return [v.x / v.w, v.y / v.w, v.z / v.w];
-    };
-    /**
-     * Transform SfM coordinates to bearing vector (3D cartesian
-     * coordinates on the unit sphere).
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @returns {Array<number>} Bearing vector (3D cartesian coordinates
-     * on the unit sphere).
-     */
-    Transform.prototype._sfmToBearing = function (sfm) {
-        if (this._fullPano()) {
-            var lon = sfm[0] * 2 * Math.PI;
-            var lat = -sfm[1] * 2 * Math.PI;
-            var x = Math.cos(lat) * Math.sin(lon);
-            var y = -Math.sin(lat);
-            var z = Math.cos(lat) * Math.cos(lon);
-            return [x, y, z];
-        }
-        else if (this._gpano) {
-            var size = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);
-            var fullPanoPixel = [
-                sfm[0] * size + this.gpano.CroppedAreaImageWidthPixels / 2 + this.gpano.CroppedAreaLeftPixels,
-                sfm[1] * size + this.gpano.CroppedAreaImageHeightPixels / 2 + this.gpano.CroppedAreaTopPixels,
-            ];
-            var lon = 2 * Math.PI * (fullPanoPixel[0] / this.gpano.FullPanoWidthPixels - 0.5);
-            var lat = -Math.PI * (fullPanoPixel[1] / this.gpano.FullPanoHeightPixels - 0.5);
-            var x = Math.cos(lat) * Math.sin(lon);
-            var y = -Math.sin(lat);
-            var z = Math.cos(lat) * Math.cos(lon);
-            return [x, y, z];
-        }
-        else if (this._cameraProjection === "fisheye") {
-            var _a = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _a[0], dyn = _a[1];
-            var dTheta = Math.sqrt(dxn * dxn + dyn * dyn);
-            var d = this._distortionFromDistortedRadius(dTheta, this._ck1, this._ck2, this._radialPeak);
-            var theta = dTheta / d;
-            var z = Math.cos(theta);
-            var r = Math.sin(theta);
-            var x = r * dxn / dTheta;
-            var y = r * dyn / dTheta;
-            return [x, y, z];
-        }
-        else {
-            var _b = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _b[0], dyn = _b[1];
-            var dr = Math.sqrt(dxn * dxn + dyn * dyn);
-            var d = this._distortionFromDistortedRadius(dr, this._ck1, this._ck2, this._radialPeak);
-            var xn = dxn / d;
-            var yn = dyn / d;
-            var v = new THREE.Vector3(xn, yn, 1);
-            v.normalize();
-            return [v.x, v.y, v.z];
-        }
-    };
-    /** Compute distortion given the distorted radius.
-     *
-     *  Solves for d in the equation
-     *    y = d(x, k1, k2) * x
-     * given the distorted radius, y.
-     */
-    Transform.prototype._distortionFromDistortedRadius = function (distortedRadius, k1, k2, radialPeak) {
-        var d = 1.0;
-        for (var i = 0; i < 10; i++) {
-            var radius = distortedRadius / d;
-            if (radius > radialPeak) {
-                radius = radialPeak;
-            }
-            d = 1 + k1 * Math.pow(radius, 2) + k2 * Math.pow(radius, 4);
-        }
-        return d;
-    };
-    /**
-     * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to
-     * SfM coordinates.
-     *
-     * @param {Array<number>} bearing - Bearing vector (3D cartesian coordinates on the
-     * unit sphere).
-     * @returns {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype._bearingToSfm = function (bearing) {
-        if (this._fullPano()) {
-            var x = bearing[0];
-            var y = bearing[1];
-            var z = bearing[2];
-            var lon = Math.atan2(x, z);
-            var lat = Math.atan2(-y, Math.sqrt(x * x + z * z));
-            return [lon / (2 * Math.PI), -lat / (2 * Math.PI)];
-        }
-        else if (this._gpano) {
-            var x = bearing[0];
-            var y = bearing[1];
-            var z = bearing[2];
-            var lon = Math.atan2(x, z);
-            var lat = Math.atan2(-y, Math.sqrt(x * x + z * z));
-            var fullPanoPixel = [
-                (lon / (2 * Math.PI) + 0.5) * this.gpano.FullPanoWidthPixels,
-                (-lat / Math.PI + 0.5) * this.gpano.FullPanoHeightPixels,
-            ];
-            var size = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);
-            return [
-                (fullPanoPixel[0] - this.gpano.CroppedAreaLeftPixels - this.gpano.CroppedAreaImageWidthPixels / 2) / size,
-                (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,
-            ];
-        }
-        else if (this._cameraProjection === "fisheye") {
-            if (bearing[2] > 0) {
-                var x = bearing[0], y = bearing[1], z = bearing[2];
-                var r = Math.sqrt(x * x + y * y);
-                var theta = Math.atan2(r, z);
-                if (theta > this._radialPeak) {
-                    theta = this._radialPeak;
-                }
-                var distortion = 1.0 + Math.pow(theta, 2) * (this._ck1 + Math.pow(theta, 2) * this._ck2);
-                var s = this._focal * distortion * theta / r;
-                return [s * x, s * y];
-            }
-            else {
-                return [
-                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                ];
-            }
-        }
-        else {
-            if (bearing[2] > 0) {
-                var _a = [bearing[0] / bearing[2], bearing[1] / bearing[2]], xn = _a[0], yn = _a[1];
-                var r2 = xn * xn + yn * yn;
-                var rp2 = Math.pow(this._radialPeak, 2);
-                if (r2 > rp2) {
-                    r2 = rp2;
-                }
-                var d = 1 + this._ck1 * r2 + this._ck2 * Math.pow(r2, 2);
-                return [
-                    this._focal * d * xn,
-                    this._focal * d * yn,
-                ];
-            }
-            else {
-                return [
-                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                ];
-            }
-        }
-    };
-    /**
-     * Convert basic coordinates to SfM coordinates.
-     *
-     * @param {Array<number>} basic - 2D basic coordinates.
-     * @returns {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype._basicToSfm = function (basic) {
-        var rotatedX;
-        var rotatedY;
-        switch (this._orientation) {
-            case 1:
-                rotatedX = basic[0];
-                rotatedY = basic[1];
-                break;
-            case 3:
-                rotatedX = 1 - basic[0];
-                rotatedY = 1 - basic[1];
-                break;
-            case 6:
-                rotatedX = basic[1];
-                rotatedY = 1 - basic[0];
-                break;
-            case 8:
-                rotatedX = 1 - basic[1];
-                rotatedY = basic[0];
-                break;
-            default:
-                rotatedX = basic[0];
-                rotatedY = basic[1];
-                break;
-        }
-        var w = this._width;
-        var h = this._height;
-        var s = Math.max(w, h);
-        var sfmX = rotatedX * w / s - w / s / 2;
-        var sfmY = rotatedY * h / s - h / s / 2;
-        return [sfmX, sfmY];
-    };
-    /**
-     * Convert SfM coordinates to basic coordinates.
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    Transform.prototype._sfmToBasic = function (sfm) {
-        var w = this._width;
-        var h = this._height;
-        var s = Math.max(w, h);
-        var rotatedX = (sfm[0] + w / s / 2) / w * s;
-        var rotatedY = (sfm[1] + h / s / 2) / h * s;
-        var basicX;
-        var basicY;
-        switch (this._orientation) {
-            case 1:
-                basicX = rotatedX;
-                basicY = rotatedY;
-                break;
-            case 3:
-                basicX = 1 - rotatedX;
-                basicY = 1 - rotatedY;
-                break;
-            case 6:
-                basicX = 1 - rotatedY;
-                basicY = rotatedX;
-                break;
-            case 8:
-                basicX = rotatedY;
-                basicY = 1 - rotatedX;
-                break;
-            default:
-                basicX = rotatedX;
-                basicY = rotatedY;
-                break;
-        }
-        return [basicX, basicY];
-    };
-    /**
-     * Determines if the gpano information indicates a full panorama.
-     *
-     * @returns {boolean} Value determining if the gpano information indicates
-     * a full panorama.
-     */
-    Transform.prototype._fullPano = function () {
-        return this.gpano != null &&
-            this.gpano.CroppedAreaLeftPixels === 0 &&
-            this.gpano.CroppedAreaTopPixels === 0 &&
-            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&
-            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;
-    };
-    /**
-     * Checks a value and returns it if it exists and is larger than 0.
-     * Fallbacks if it is null.
-     *
-     * @param {number} value - Value to check.
-     * @param {number} fallback - Value to fall back to.
-     * @returns {number} The value or its fallback value if it is not defined or negative.
-     */
-    Transform.prototype._getValue = function (value, fallback) {
-        return value != null && value > 0 ? value : fallback;
-    };
-    /**
-     * Creates the extrinsic camera matrix [ R | t ].
-     *
-     * @param {Array<number>} rotation - Rotation vector in angle axis representation.
-     * @param {Array<number>} translation - Translation vector.
-     * @returns {THREE.Matrix4} Extrisic camera matrix.
-     */
-    Transform.prototype._getRt = function (rotation, translation) {
-        var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);
-        var angle = axis.length();
-        if (angle > 0) {
-            axis.normalize();
-        }
-        var rt = new THREE.Matrix4();
-        rt.makeRotationAxis(axis, angle);
-        rt.setPosition(new THREE.Vector3(translation[0], translation[1], translation[2]));
-        return rt;
-    };
-    /**
-     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].
-     *
-     * @param {THREE.Matrix4} rt - Extrisic camera matrix.
-     * @param {number} scale - Scale factor.
-     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.
-     */
-    Transform.prototype._getSrt = function (rt, scale) {
-        var srt = rt.clone();
-        var elements = srt.elements;
-        elements[12] = scale * elements[12];
-        elements[13] = scale * elements[13];
-        elements[14] = scale * elements[14];
-        srt.scale(new THREE.Vector3(scale, scale, scale));
-        return srt;
-    };
-    Transform.prototype._getBasicRt = function (rt, orientation) {
-        var axis = new THREE.Vector3(0, 0, 1);
-        var angle = 0;
-        switch (orientation) {
-            case 3:
-                angle = Math.PI;
-                break;
-            case 6:
-                angle = Math.PI / 2;
-                break;
-            case 8:
-                angle = 3 * Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        return new THREE.Matrix4()
-            .makeRotationAxis(axis, angle)
-            .multiply(rt);
-    };
-    Transform.prototype._getRadialPeak = function (k1, k2) {
-        var a = 5 * k2;
-        var b = 3 * k1;
-        var c = 1;
-        var d = Math.pow(b, 2) - 4 * a * c;
-        if (d < 0) {
-            return undefined;
-        }
-        var root1 = (-b - Math.sqrt(d)) / 2 / a;
-        var root2 = (-b + Math.sqrt(d)) / 2 / a;
-        var minRoot = Math.min(root1, root2);
-        var maxRoot = Math.max(root1, root2);
-        return minRoot > 0 ?
-            Math.sqrt(minRoot) :
-            maxRoot > 0 ?
-                Math.sqrt(maxRoot) :
-                undefined;
-    };
-    /**
-     * Calculate a transformation matrix from normalized coordinates for
-     * texture map coordinates.
-     *
-     * @returns {THREE.Matrix4} Normalized coordinates to texture map
-     * coordinates transformation matrix.
-     */
-    Transform.prototype._normalizedToTextureMatrix = function () {
-        var size = Math.max(this._width, this._height);
-        var scaleX = this._orientation < 5 ? this._textureScale[0] : this._textureScale[1];
-        var scaleY = this._orientation < 5 ? this._textureScale[1] : this._textureScale[0];
-        var w = size / this._width * scaleX;
-        var h = size / this._height * scaleY;
-        switch (this._orientation) {
-            case 1:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 3:
-                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 6:
-                return new THREE.Matrix4().set(0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 8:
-                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            default:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-        }
-    };
-    return Transform;
-}());
-exports.Transform = Transform;
-
-},{"three":242}],421:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ViewportCoords = void 0;
-var THREE = require("three");
-/**
- * @class ViewportCoords
- *
- * @classdesc Provides methods for calculating 2D coordinate conversions
- * as well as 3D projection and unprojection.
- *
- * Basic coordinates are 2D coordinates on the [0, 1] interval and
- * have the origin point, (0, 0), at the top left corner and the
- * maximum value, (1, 1), at the bottom right corner of the original
- * image.
- *
- * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
- * have the origin point in the center. The bottom left corner point is
- * (-1, -1) and the top right corner point is (1, 1).
- *
- * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and
- * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left
- * corner and the maximum value is (canvasWidth, canvasHeight) is in the
- * bottom right corner.
- *
- * 3D coordinates are in the topocentric world reference frame.
- */
-var ViewportCoords = /** @class */ (function () {
-    function ViewportCoords() {
-        this._unprojectDepth = 200;
-    }
-    /**
-     * Convert basic coordinates to canvas coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, container, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var canvas = this.projectToCanvas(point3d, container, camera);
-        return canvas;
-    };
-    /**
-     * Convert basic coordinates to canvas coordinates safely. If 3D point is
-     * behind camera null will be returned.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point
-     * in front of the camera, otherwise null.
-     */
-    ViewportCoords.prototype.basicToCanvasSafe = function (basicX, basicY, container, transform, camera) {
-        var viewport = this.basicToViewportSafe(basicX, basicY, transform, camera);
-        if (viewport === null) {
-            return null;
-        }
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
-        return canvas;
-    };
-    /**
-     * Convert basic coordinates to viewport coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var viewport = this.projectToViewport(point3d, camera);
-        return viewport;
-    };
-    /**
-     * Convert basic coordinates to viewport coordinates safely. If 3D point is
-     * behind camera null will be returned.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.basicToViewportSafe = function (basicX, basicY, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var pointCamera = this.worldToCamera(point3d, camera);
-        if (pointCamera[2] > 0) {
-            return null;
-        }
-        var viewport = this.projectToViewport(point3d, camera);
-        return viewport;
-    };
-    /**
-     * Convert camera 3D coordinates to viewport coordinates.
-     *
-     * @param {number} pointCamera - 3D point in camera coordinate system.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.cameraToViewport = function (pointCamera, camera) {
-        var viewport = new THREE.Vector3().fromArray(pointCamera)
-            .applyMatrix4(camera.projectionMatrix);
-        return [viewport.x, viewport.y];
-    };
-    /**
-     * Get canvas pixel position from event.
-     *
-     * @param {Event} event - Event containing clientX and clientY properties.
-     * @param {HTMLElement} element - HTML element.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.canvasPosition = function (event, element) {
-        var clientRect = element.getBoundingClientRect();
-        var canvasX = event.clientX - clientRect.left - element.clientLeft;
-        var canvasY = event.clientY - clientRect.top - element.clientTop;
-        return [canvasX, canvasY];
-    };
-    /**
-     * Convert canvas coordinates to basic coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, container, transform, camera) {
-        var point3d = this.unprojectFromCanvas(canvasX, canvasY, container, camera)
-            .toArray();
-        var basic = transform.projectBasic(point3d);
-        return basic;
-    };
-    /**
-     * Convert canvas coordinates to viewport coordinates.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, container) {
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        var viewportX = 2 * canvasX / canvasWidth - 1;
-        var viewportY = 1 - 2 * canvasY / canvasHeight;
-        return [viewportX, viewportY];
-    };
-    /**
-     * Determines the width and height of the container in canvas coordinates.
-     *
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.containerToCanvas = function (container) {
-        return [container.offsetWidth, container.offsetHeight];
-    };
-    /**
-     * Determine basic distances from image to canvas corners.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * Determines the smallest basic distance for every side of the canvas.
-     *
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getBasicDistances = function (transform, camera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
-        var topBasicDistance = 0;
-        var rightBasicDistance = 0;
-        var bottomBasicDistance = 0;
-        var leftBasicDistance = 0;
-        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
-            topBasicDistance = topLeftBasic[1] > topRightBasic[1] ?
-                -topLeftBasic[1] :
-                -topRightBasic[1];
-        }
-        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
-            rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ?
-                topRightBasic[0] - 1 :
-                bottomRightBasic[0] - 1;
-        }
-        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
-            bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ?
-                bottomRightBasic[1] - 1 :
-                bottomLeftBasic[1] - 1;
-        }
-        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
-            leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ?
-                -bottomLeftBasic[0] :
-                -topLeftBasic[0];
-        }
-        return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance];
-    };
-    /**
-     * Determine pixel distances from image to canvas corners.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * Determines the smallest pixel distance for every side of the canvas.
-     *
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getPixelDistances = function (container, transform, camera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
-        var topPixelDistance = 0;
-        var rightPixelDistance = 0;
-        var bottomPixelDistance = 0;
-        var leftPixelDistance = 0;
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
-            var basicX = topLeftBasic[1] > topRightBasic[1] ?
-                topLeftBasic[0] :
-                topRightBasic[0];
-            var canvas = this.basicToCanvas(basicX, 0, container, transform, camera);
-            topPixelDistance = canvas[1] > 0 ? canvas[1] : 0;
-        }
-        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
-            var basicY = topRightBasic[0] < bottomRightBasic[0] ?
-                topRightBasic[1] :
-                bottomRightBasic[1];
-            var canvas = this.basicToCanvas(1, basicY, container, transform, camera);
-            rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0;
-        }
-        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
-            var basicX = bottomRightBasic[1] < bottomLeftBasic[1] ?
-                bottomRightBasic[0] :
-                bottomLeftBasic[0];
-            var canvas = this.basicToCanvas(basicX, 1, container, transform, camera);
-            bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0;
-        }
-        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
-            var basicY = bottomLeftBasic[0] > topLeftBasic[0] ?
-                bottomLeftBasic[1] :
-                topLeftBasic[1];
-            var canvas = this.basicToCanvas(0, basicY, container, transform, camera);
-            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;
-        }
-        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];
-    };
-    /**
-     * Determine if an event occured inside an element.
-     *
-     * @param {Event} event - Event containing clientX and clientY properties.
-     * @param {HTMLElement} element - HTML element.
-     * @returns {boolean} Value indicating if the event occured inside the element or not.
-     */
-    ViewportCoords.prototype.insideElement = function (event, element) {
-        var clientRect = element.getBoundingClientRect();
-        var minX = clientRect.left + element.clientLeft;
-        var maxX = minX + element.clientWidth;
-        var minY = clientRect.top + element.clientTop;
-        var maxY = minY + element.clientHeight;
-        return event.clientX > minX &&
-            event.clientX < maxX &&
-            event.clientY > minY &&
-            event.clientY < maxY;
-    };
-    /**
-     * Project 3D world coordinates to canvas coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.projectToCanvas = function (point3d, container, camera) {
-        var viewport = this.projectToViewport(point3d, camera);
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
-        return canvas;
-    };
-    /**
-     * Project 3D world coordinates to canvas coordinates safely. If 3D
-     * point is behind camera null will be returned.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.projectToCanvasSafe = function (point3d, container, camera) {
-        var pointCamera = this.worldToCamera(point3d, camera);
-        if (pointCamera[2] > 0) {
-            return null;
-        }
-        var viewport = this.projectToViewport(point3d, camera);
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
-        return canvas;
-    };
-    /**
-     * Project 3D world coordinates to viewport coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.projectToViewport = function (point3d, camera) {
-        var viewport = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
-            .project(camera);
-        return [viewport.x, viewport.y];
-    };
-    /**
-     * Uproject canvas coordinates to 3D world coordinates.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, container, camera) {
-        var viewport = this.canvasToViewport(canvasX, canvasY, container);
-        var point3d = this.unprojectFromViewport(viewport[0], viewport[1], camera);
-        return point3d;
-    };
-    /**
-     * Unproject viewport coordinates to 3D world coordinates.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, camera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(camera);
-        return point3d;
-    };
-    /**
-     * Convert viewport coordinates to basic coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, camera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(camera)
-            .toArray();
-        var basic = transform.projectBasic(point3d);
-        return basic;
-    };
-    /**
-     * Convert viewport coordinates to canvas coordinates.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, container) {
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        var canvasX = canvasWidth * (viewportX + 1) / 2;
-        var canvasY = -canvasHeight * (viewportY - 1) / 2;
-        return [canvasX, canvasY];
-    };
-    /**
-     * Convert 3D world coordinates to 3D camera coordinates.
-     *
-     * @param {number} point3D - 3D point in world coordinate system.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D camera coordinates.
-     */
-    ViewportCoords.prototype.worldToCamera = function (point3d, camera) {
-        var pointCamera = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
-            .applyMatrix4(camera.matrixWorldInverse);
-        return pointCamera.toArray();
-    };
-    return ViewportCoords;
-}());
-exports.ViewportCoords = ViewportCoords;
-exports.default = ViewportCoords;
-
-
-},{"three":242}],422:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],423:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.FilterCreator = void 0;
-/**
- * @class Filter
- *
- * @classdesc Represents a class for creating node filters. Implementation and
- * definitions based on https://github.com/mapbox/feature-filter.
- */
-var FilterCreator = /** @class */ (function () {
-    function FilterCreator() {
-    }
-    /**
-     * Create a filter from a filter expression.
-     *
-     * @description The following filters are supported:
-     *
-     * Comparison
-     * `==`
-     * `!=`
-     * `<`
-     * `<=`
-     * `>`
-     * `>=`
-     *
-     * Set membership
-     * `in`
-     * `!in`
-     *
-     * Combining
-     * `all`
-     *
-     * @param {FilterExpression} filter - Comparison, set membership or combinding filter
-     * expression.
-     * @returns {FilterFunction} Function taking a node and returning a boolean that
-     * indicates whether the node passed the test or not.
-     */
-    FilterCreator.prototype.createFilter = function (filter) {
-        return new Function("node", "return " + this._compile(filter) + ";");
-    };
-    FilterCreator.prototype._compile = function (filter) {
-        if (filter == null || filter.length <= 1) {
-            return "true";
-        }
-        var operator = filter[0];
-        var operation = operator === "==" ? this._compileComparisonOp("===", filter[1], filter[2], false) :
-            operator === "!=" ? this._compileComparisonOp("!==", filter[1], filter[2], false) :
-                operator === ">" ||
-                    operator === ">=" ||
-                    operator === "<" ||
-                    operator === "<=" ? this._compileComparisonOp(operator, filter[1], filter[2], true) :
-                    operator === "in" ?
-                        this._compileInOp(filter[1], filter.slice(2)) :
-                        operator === "!in" ?
-                            this._compileNegation(this._compileInOp(filter[1], filter.slice(2))) :
-                            operator === "all" ? this._compileLogicalOp(filter.slice(1), "&&") :
-                                "true";
-        return "(" + operation + ")";
-    };
-    FilterCreator.prototype._compare = function (a, b) {
-        return a < b ? -1 : a > b ? 1 : 0;
-    };
-    FilterCreator.prototype._compileComparisonOp = function (operator, property, value, checkType) {
-        var left = this._compilePropertyReference(property);
-        var right = JSON.stringify(value);
-        return (checkType ? "typeof " + left + "===typeof " + right + "&&" : "") + left + operator + right;
-    };
-    FilterCreator.prototype._compileInOp = function (property, values) {
-        var compare = this._compare;
-        var left = JSON.stringify(values.sort(compare));
-        var right = this._compilePropertyReference(property);
-        return left + ".indexOf(" + right + ")!==-1";
-    };
-    FilterCreator.prototype._compileLogicalOp = function (filters, operator) {
-        var compile = this._compile.bind(this);
-        return filters.map(compile).join(operator);
-    };
-    FilterCreator.prototype._compileNegation = function (expression) {
-        return "!(" + expression + ")";
-    };
-    FilterCreator.prototype._compilePropertyReference = function (property) {
-        return "node[" + JSON.stringify(property) + "]";
-    };
-    return FilterCreator;
-}());
-exports.FilterCreator = FilterCreator;
-exports.default = FilterCreator;
-
-},{}],424:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Graph = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var Graph_1 = require("../Graph");
-var Geo_1 = require("../Geo");
-/**
- * @class Graph
- *
- * @classdesc Represents a graph of nodes with edges.
- */
-var Graph = /** @class */ (function () {
-    /**
-     * Create a new graph instance.
-     *
-     * @param {APIv3} [apiV3] - API instance for retrieving data.
-     * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.
-     * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.
-     * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.
-     * @param {FilterCreator} [filterCreator] - Instance for  filter creation.
-     * @param {IGraphConfiguration} [configuration] - Configuration struct.
-     */
-    function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator, filterCreator, configuration) {
-        this._apiV3 = apiV3;
-        this._cachedNodes = {};
-        this._cachedNodeTiles = {};
-        this._cachedSequenceNodes = {};
-        this._cachedSpatialEdges = {};
-        this._cachedTiles = {};
-        this._cachingFill$ = {};
-        this._cachingFull$ = {};
-        this._cachingSequenceNodes$ = {};
-        this._cachingSequences$ = {};
-        this._cachingSpatialArea$ = {};
-        this._cachingTiles$ = {};
-        this._changed$ = new rxjs_1.Subject();
-        this._defaultAlt = 2;
-        this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new Edge_1.EdgeCalculator();
-        this._filterCreator = filterCreator != null ? filterCreator : new Graph_1.FilterCreator();
-        this._filter = this._filterCreator.createFilter(undefined);
-        this._graphCalculator = graphCalculator != null ? graphCalculator : new Graph_1.GraphCalculator();
-        this._configuration = configuration != null ?
-            configuration :
-            {
-                maxSequences: 50,
-                maxUnusedNodes: 100,
-                maxUnusedPreStoredNodes: 30,
-                maxUnusedTiles: 20,
-            };
-        this._nodes = {};
-        this._nodeIndex = nodeIndex != null ? nodeIndex : new Geo_1.GeoRBush(16);
-        this._nodeIndexTiles = {};
-        this._nodeToTile = {};
-        this._preStored = {};
-        this._requiredNodeTiles = {};
-        this._requiredSpatialArea = {};
-        this._sequences = {};
-        this._tilePrecision = 7;
-        this._tileThreshold = 20;
-    }
-    Object.defineProperty(Graph.prototype, "changed$", {
-        /**
-         * Get changed$.
-         *
-         * @returns {Observable<Graph>} Observable emitting
-         * the graph every time it has changed.
-         */
-        get: function () {
-            return this._changed$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Caches the full node data for all images within a bounding
-     * box.
-     *
-     * @description The node assets are not cached.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @returns {Observable<Graph>} Observable emitting the full
-     * nodes in the bounding box.
-     */
-    Graph.prototype.cacheBoundingBox$ = function (sw, ne) {
-        var _this = this;
-        var cacheTiles$ = this._graphCalculator.encodeHsFromBoundingBox(sw, ne)
-            .filter(function (h) {
-            return !(h in _this._cachedTiles);
-        })
-            .map(function (h) {
-            return h in _this._cachingTiles$ ?
-                _this._cachingTiles$[h] :
-                _this._cacheTile$(h);
-        });
-        if (cacheTiles$.length === 0) {
-            cacheTiles$.push(rxjs_1.of(this));
-        }
-        return rxjs_1.from(cacheTiles$).pipe(operators_1.mergeAll(), operators_1.last(), operators_1.mergeMap(function (graph) {
-            var nodes = _this._nodeIndex
-                .search({
-                maxX: ne.lat,
-                maxY: ne.lon,
-                minX: sw.lat,
-                minY: sw.lon,
-            })
-                .map(function (item) {
-                return item.node;
-            });
-            var fullNodes = [];
-            var coreNodes = [];
-            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                var node = nodes_1[_i];
-                if (node.full) {
-                    fullNodes.push(node);
-                }
-                else {
-                    coreNodes.push(node.key);
-                }
-            }
-            var coreNodeBatches = [];
-            var batchSize = 200;
-            while (coreNodes.length > 0) {
-                coreNodeBatches.push(coreNodes.splice(0, batchSize));
-            }
-            var fullNodes$ = rxjs_1.of(fullNodes);
-            var fillNodes$ = coreNodeBatches
-                .map(function (batch) {
-                return _this._apiV3.imageByKeyFill$(batch).pipe(operators_1.map(function (imageByKeyFill) {
-                    var filledNodes = [];
-                    for (var fillKey in imageByKeyFill) {
-                        if (!imageByKeyFill.hasOwnProperty(fillKey)) {
-                            continue;
-                        }
-                        if (_this.hasNode(fillKey)) {
-                            var node = _this.getNode(fillKey);
-                            if (!node.full) {
-                                _this._makeFull(node, imageByKeyFill[fillKey]);
-                            }
-                            filledNodes.push(node);
-                        }
-                    }
-                    return filledNodes;
-                }));
-            });
-            return rxjs_1.merge(fullNodes$, rxjs_1.from(fillNodes$).pipe(operators_1.mergeAll()));
-        }), operators_1.reduce(function (acc, value) {
-            return acc.concat(value);
-        }));
-    };
-    /**
-     * Retrieve and cache node fill properties.
-     *
-     * @param {string} key - Key of node to fill.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the node has been updated.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheFill$ = function (key) {
-        var _this = this;
-        if (key in this._cachingFull$) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node while caching full (" + key + ").");
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node that does not exist in graph (" + key + ").");
-        }
-        if (key in this._cachingFill$) {
-            return this._cachingFill$[key];
-        }
-        var node = this.getNode(key);
-        if (node.full) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node that is already full (" + key + ").");
-        }
-        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key]).pipe(operators_1.tap(function (imageByKeyFill) {
-            if (!node.full) {
-                _this._makeFull(node, imageByKeyFill[key]);
-            }
-            delete _this._cachingFill$[key];
-        }), operators_1.map(function (imageByKeyFill) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (key in _this._cachingFill$) {
-                delete _this._cachingFill$[key];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingFill$[key];
-    };
-    /**
-     * Retrieve and cache full node properties.
-     *
-     * @param {string} key - Key of node to fill.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the node has been updated.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheFull$ = function (key) {
-        var _this = this;
-        if (key in this._cachingFull$) {
-            return this._cachingFull$[key];
-        }
-        if (this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache full node that already exist in graph (" + key + ").");
-        }
-        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key]).pipe(operators_1.tap(function (imageByKeyFull) {
-            var fn = imageByKeyFull[key];
-            if (_this.hasNode(key)) {
-                var node = _this.getNode(key);
-                if (!node.full) {
-                    _this._makeFull(node, fn);
-                }
-            }
-            else {
-                if (fn.sequence_key == null) {
-                    throw new Error_1.GraphMapillaryError("Node has no sequence key (" + key + ").");
-                }
-                var node = new Graph_1.Node(fn);
-                _this._makeFull(node, fn);
-                var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
-                _this._preStore(h, node);
-                _this._setNode(node);
-                delete _this._cachingFull$[key];
-            }
-        }), operators_1.map(function (imageByKeyFull) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (key in _this._cachingFull$) {
-                delete _this._cachingFull$[key];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingFull$[key];
-    };
-    /**
-     * Retrieve and cache a node sequence.
-     *
-     * @param {string} key - Key of node for which to retrieve sequence.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the sequence has been retrieved.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheNodeSequence$ = function (key) {
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache sequence edges of node that does not exist in graph (" + key + ").");
-        }
-        var node = this.getNode(key);
-        if (node.sequenceKey in this._sequences) {
-            throw new Error_1.GraphMapillaryError("Sequence already cached (" + key + "), (" + node.sequenceKey + ").");
-        }
-        return this._cacheSequence$(node.sequenceKey);
-    };
-    /**
-     * Retrieve and cache a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence to cache.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the sequence has been retrieved.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSequence$ = function (sequenceKey) {
-        if (sequenceKey in this._sequences) {
-            throw new Error_1.GraphMapillaryError("Sequence already cached (" + sequenceKey + ")");
-        }
-        return this._cacheSequence$(sequenceKey);
-    };
-    /**
-     * Cache sequence edges for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSequenceEdges = function (key) {
-        var node = this.getNode(key);
-        if (!(node.sequenceKey in this._sequences)) {
-            throw new Error_1.GraphMapillaryError("Sequence is not cached (" + key + "), (" + node.sequenceKey + ")");
-        }
-        var sequence = this._sequences[node.sequenceKey].sequence;
-        var edges = this._edgeCalculator.computeSequenceEdges(node, sequence);
-        node.cacheSequenceEdges(edges);
-    };
-    /**
-     * Retrieve and cache full nodes for all keys in a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @param {string} referenceNodeKey - Key of node to use as reference
-     * for optimized caching.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the nodes of the sequence has been cached.
-     */
-    Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
-        var _this = this;
-        if (!this.hasSequence(sequenceKey)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ").");
-        }
-        if (this.hasSequenceNodes(sequenceKey)) {
-            throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ").");
-        }
-        var sequence = this.getSequence(sequenceKey);
-        if (sequence.key in this._cachingSequenceNodes$) {
-            return this._cachingSequenceNodes$[sequence.key];
-        }
-        var batches = [];
-        var keys = sequence.keys.slice();
-        var referenceBatchSize = 50;
-        if (!!referenceNodeKey && keys.length > referenceBatchSize) {
-            var referenceIndex = keys.indexOf(referenceNodeKey);
-            var startIndex = Math.max(0, Math.min(referenceIndex - referenceBatchSize / 2, keys.length - referenceBatchSize));
-            batches.push(keys.splice(startIndex, referenceBatchSize));
-        }
-        var batchSize = 200;
-        while (keys.length > 0) {
-            batches.push(keys.splice(0, batchSize));
-        }
-        var batchesToCache = batches.length;
-        var sequenceNodes$ = rxjs_1.from(batches).pipe(operators_1.mergeMap(function (batch) {
-            return _this._apiV3.imageByKeyFull$(batch).pipe(operators_1.tap(function (imageByKeyFull) {
-                for (var fullKey in imageByKeyFull) {
-                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {
-                        continue;
-                    }
-                    var fn = imageByKeyFull[fullKey];
-                    if (_this.hasNode(fullKey)) {
-                        var node = _this.getNode(fn.key);
-                        if (!node.full) {
-                            _this._makeFull(node, fn);
-                        }
-                    }
-                    else {
-                        if (fn.sequence_key == null) {
-                            console.warn("Sequence missing, discarding node (" + fn.key + ")");
-                        }
-                        var node = new Graph_1.Node(fn);
-                        _this._makeFull(node, fn);
-                        var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
-                        _this._preStore(h, node);
-                        _this._setNode(node);
-                    }
-                }
-                batchesToCache--;
-            }), operators_1.map(function (imageByKeyFull) {
-                return _this;
-            }));
-        }, 6), operators_1.last(), operators_1.finalize(function () {
-            delete _this._cachingSequenceNodes$[sequence.key];
-            if (batchesToCache === 0) {
-                _this._cachedSequenceNodes[sequence.key] = true;
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;
-        return sequenceNodes$;
-    };
-    /**
-     * Retrieve and cache full nodes for a node spatial area.
-     *
-     * @param {string} key - Key of node for which to retrieve sequence.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the nodes in the spatial area has been made full.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSpatialArea$ = function (key) {
-        var _this = this;
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache spatial area of node that does not exist in graph (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Node already spatially cached (" + key + ").");
-        }
-        if (!(key in this._requiredSpatialArea)) {
-            throw new Error_1.GraphMapillaryError("Spatial area not determined (" + key + ").");
-        }
-        var spatialArea = this._requiredSpatialArea[key];
-        if (Object.keys(spatialArea.cacheNodes).length === 0) {
-            throw new Error_1.GraphMapillaryError("Spatial nodes already cached (" + key + ").");
-        }
-        if (key in this._cachingSpatialArea$) {
-            return this._cachingSpatialArea$[key];
-        }
-        var batches = [];
-        while (spatialArea.cacheKeys.length > 0) {
-            batches.push(spatialArea.cacheKeys.splice(0, 200));
-        }
-        var batchesToCache = batches.length;
-        var spatialNodes$ = [];
-        var _loop_1 = function (batch) {
-            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch).pipe(operators_1.tap(function (imageByKeyFill) {
-                for (var fillKey in imageByKeyFill) {
-                    if (!imageByKeyFill.hasOwnProperty(fillKey)) {
-                        continue;
-                    }
-                    var spatialNode = spatialArea.cacheNodes[fillKey];
-                    if (spatialNode.full) {
-                        delete spatialArea.cacheNodes[fillKey];
-                        continue;
-                    }
-                    var fillNode = imageByKeyFill[fillKey];
-                    _this._makeFull(spatialNode, fillNode);
-                    delete spatialArea.cacheNodes[fillKey];
-                }
-                if (--batchesToCache === 0) {
-                    delete _this._cachingSpatialArea$[key];
-                }
-            }), operators_1.map(function (imageByKeyFill) {
-                return _this;
-            }), operators_1.catchError(function (error) {
-                for (var _i = 0, batch_1 = batch; _i < batch_1.length; _i++) {
-                    var batchKey = batch_1[_i];
-                    if (batchKey in spatialArea.all) {
-                        delete spatialArea.all[batchKey];
-                    }
-                    if (batchKey in spatialArea.cacheNodes) {
-                        delete spatialArea.cacheNodes[batchKey];
-                    }
-                }
-                if (--batchesToCache === 0) {
-                    delete _this._cachingSpatialArea$[key];
-                }
-                throw error;
-            }), operators_1.finalize(function () {
-                if (Object.keys(spatialArea.cacheNodes).length === 0) {
-                    _this._changed$.next(_this);
-                }
-            }), operators_1.publish(), operators_1.refCount());
-            spatialNodes$.push(spatialNodeBatch$);
-        };
-        var this_1 = this;
-        for (var _i = 0, batches_1 = batches; _i < batches_1.length; _i++) {
-            var batch = batches_1[_i];
-            _loop_1(batch);
-        }
-        this._cachingSpatialArea$[key] = spatialNodes$;
-        return spatialNodes$;
-    };
-    /**
-     * Cache spatial edges for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSpatialEdges = function (key) {
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Spatial edges already cached (" + key + ").");
-        }
-        var node = this.getNode(key);
-        var sequence = this._sequences[node.sequenceKey].sequence;
-        var fallbackKeys = [];
-        var prevKey = sequence.findPrevKey(node.key);
-        if (prevKey != null) {
-            fallbackKeys.push(prevKey);
-        }
-        var nextKey = sequence.findNextKey(node.key);
-        if (nextKey != null) {
-            fallbackKeys.push(nextKey);
-        }
-        var allSpatialNodes = this._requiredSpatialArea[key].all;
-        var potentialNodes = [];
-        var filter = this._filter;
-        for (var spatialNodeKey in allSpatialNodes) {
-            if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) {
-                continue;
-            }
-            var spatialNode = allSpatialNodes[spatialNodeKey];
-            if (filter(spatialNode)) {
-                potentialNodes.push(spatialNode);
-            }
-        }
-        var potentialEdges = this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys);
-        var edges = this._edgeCalculator.computeStepEdges(node, potentialEdges, prevKey, nextKey);
-        edges = edges.concat(this._edgeCalculator.computeTurnEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computePanoEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computePerspectiveToPanoEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computeSimilarEdges(node, potentialEdges));
-        node.cacheSpatialEdges(edges);
-        this._cachedSpatialEdges[key] = node;
-        delete this._requiredSpatialArea[key];
-        delete this._cachedNodeTiles[key];
-    };
-    /**
-     * Retrieve and cache geohash tiles for a node.
-     *
-     * @param {string} key - Key of node for which to retrieve tiles.
-     * @returns {Array<Observable<Graph>>} Array of observables emitting
-     * the graph for each tile required for the node has been cached.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheTiles$ = function (key) {
-        var _this = this;
-        if (key in this._cachedNodeTiles) {
-            throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Spatial edges already cached so tiles considered cached (" + key + ").");
-        }
-        if (!(key in this._requiredNodeTiles)) {
-            throw new Error_1.GraphMapillaryError("Tiles have not been determined (" + key + ").");
-        }
-        var nodeTiles = this._requiredNodeTiles[key];
-        if (nodeTiles.cache.length === 0 &&
-            nodeTiles.caching.length === 0) {
-            throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ").");
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache tiles of node that does not exist in graph (" + key + ").");
-        }
-        var hs = nodeTiles.cache.slice();
-        nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs);
-        nodeTiles.cache = [];
-        var cacheTiles$ = [];
-        var _loop_2 = function (h) {
-            var cacheTile$ = h in this_2._cachingTiles$ ?
-                this_2._cachingTiles$[h] :
-                this_2._cacheTile$(h);
-            cacheTiles$.push(cacheTile$.pipe(operators_1.tap(function (graph) {
-                var index = nodeTiles.caching.indexOf(h);
-                if (index > -1) {
-                    nodeTiles.caching.splice(index, 1);
-                }
-                if (nodeTiles.caching.length === 0 &&
-                    nodeTiles.cache.length === 0) {
-                    delete _this._requiredNodeTiles[key];
-                    _this._cachedNodeTiles[key] = true;
-                }
-            }), operators_1.catchError(function (error) {
-                var index = nodeTiles.caching.indexOf(h);
-                if (index > -1) {
-                    nodeTiles.caching.splice(index, 1);
-                }
-                if (nodeTiles.caching.length === 0 &&
-                    nodeTiles.cache.length === 0) {
-                    delete _this._requiredNodeTiles[key];
-                    _this._cachedNodeTiles[key] = true;
-                }
-                throw error;
-            }), operators_1.finalize(function () {
-                _this._changed$.next(_this);
-            }), operators_1.publish(), operators_1.refCount()));
-        };
-        var this_2 = this;
-        for (var _i = 0, _a = nodeTiles.caching; _i < _a.length; _i++) {
-            var h = _a[_i];
-            _loop_2(h);
-        }
-        return cacheTiles$;
-    };
-    /**
-     * Initialize the cache for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.initializeCache = function (key) {
-        if (key in this._cachedNodes) {
-            throw new Error_1.GraphMapillaryError("Node already in cache (" + key + ").");
-        }
-        var node = this.getNode(key);
-        node.initializeCache(new Graph_1.NodeCache());
-        var accessed = new Date().getTime();
-        this._cachedNodes[key] = { accessed: accessed, node: node };
-        this._updateCachedTileAccess(key, accessed);
-    };
-    /**
-     * Get a value indicating if the graph is fill caching a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the node is being fill cached.
-     */
-    Graph.prototype.isCachingFill = function (key) {
-        return key in this._cachingFill$;
-    };
-    /**
-     * Get a value indicating if the graph is fully caching a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the node is being fully cached.
-     */
-    Graph.prototype.isCachingFull = function (key) {
-        return key in this._cachingFull$;
-    };
-    /**
-     * Get a value indicating if the graph is caching a sequence of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the sequence of a node is
-     * being cached.
-     */
-    Graph.prototype.isCachingNodeSequence = function (key) {
-        var node = this.getNode(key);
-        return node.sequenceKey in this._cachingSequences$;
-    };
-    /**
-     * Get a value indicating if the graph is caching a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if the sequence is
-     * being cached.
-     */
-    Graph.prototype.isCachingSequence = function (sequenceKey) {
-        return sequenceKey in this._cachingSequences$;
-    };
-    /**
-     * Get a value indicating if the graph is caching sequence nodes.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if the sequence nodes are
-     * being cached.
-     */
-    Graph.prototype.isCachingSequenceNodes = function (sequenceKey) {
-        return sequenceKey in this._cachingSequenceNodes$;
-    };
-    /**
-     * Get a value indicating if the graph is caching the tiles
-     * required for calculating spatial edges of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the tiles of
-     * a node are being cached.
-     */
-    Graph.prototype.isCachingTiles = function (key) {
-        return key in this._requiredNodeTiles &&
-            this._requiredNodeTiles[key].cache.length === 0 &&
-            this._requiredNodeTiles[key].caching.length > 0;
-    };
-    /**
-     * Get a value indicating if the cache has been initialized
-     * for a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the cache has been
-     * initialized for a node.
-     */
-    Graph.prototype.hasInitializedCache = function (key) {
-        return key in this._cachedNodes;
-    };
-    /**
-     * Get a value indicating if a node exist in the graph.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if a node exist in the graph.
-     */
-    Graph.prototype.hasNode = function (key) {
-        var accessed = new Date().getTime();
-        this._updateCachedNodeAccess(key, accessed);
-        this._updateCachedTileAccess(key, accessed);
-        return key in this._nodes;
-    };
-    /**
-     * Get a value indicating if a node sequence exist in the graph.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if a node sequence exist
-     * in the graph.
-     */
-    Graph.prototype.hasNodeSequence = function (key) {
-        var node = this.getNode(key);
-        var sequenceKey = node.sequenceKey;
-        var hasNodeSequence = sequenceKey in this._sequences;
-        if (hasNodeSequence) {
-            this._sequences[sequenceKey].accessed = new Date().getTime();
-        }
-        return hasNodeSequence;
-    };
-    /**
-     * Get a value indicating if a sequence exist in the graph.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if a sequence exist
-     * in the graph.
-     */
-    Graph.prototype.hasSequence = function (sequenceKey) {
-        var hasSequence = sequenceKey in this._sequences;
-        if (hasSequence) {
-            this._sequences[sequenceKey].accessed = new Date().getTime();
-        }
-        return hasSequence;
-    };
-    /**
-     * Get a value indicating if sequence nodes has been cached in the graph.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if a sequence nodes has been
-     * cached in the graph.
-     */
-    Graph.prototype.hasSequenceNodes = function (sequenceKey) {
-        return sequenceKey in this._cachedSequenceNodes;
-    };
-    /**
-     * Get a value indicating if the graph has fully cached
-     * all nodes in the spatial area of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the spatial area
-     * of a node has been cached.
-     */
-    Graph.prototype.hasSpatialArea = function (key) {
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Spatial area nodes cannot be determined if node not in graph (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            return true;
-        }
-        if (key in this._requiredSpatialArea) {
-            return Object.keys(this._requiredSpatialArea[key].cacheNodes).length === 0;
-        }
-        var node = this.getNode(key);
-        var bbox = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold);
-        var spatialItems = this._nodeIndex.search({
-            maxX: bbox[1].lat,
-            maxY: bbox[1].lon,
-            minX: bbox[0].lat,
-            minY: bbox[0].lon,
-        });
-        var spatialNodes = {
-            all: {},
-            cacheKeys: [],
-            cacheNodes: {},
-        };
-        for (var _i = 0, spatialItems_1 = spatialItems; _i < spatialItems_1.length; _i++) {
-            var spatialItem = spatialItems_1[_i];
-            spatialNodes.all[spatialItem.node.key] = spatialItem.node;
-            if (!spatialItem.node.full) {
-                spatialNodes.cacheKeys.push(spatialItem.node.key);
-                spatialNodes.cacheNodes[spatialItem.node.key] = spatialItem.node;
-            }
-        }
-        this._requiredSpatialArea[key] = spatialNodes;
-        return spatialNodes.cacheKeys.length === 0;
-    };
-    /**
-     * Get a value indicating if the graph has a tiles required
-     * for a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the the tiles required
-     * by a node has been cached.
-     */
-    Graph.prototype.hasTiles = function (key) {
-        var _this = this;
-        if (key in this._cachedNodeTiles) {
-            return true;
-        }
-        if (key in this._cachedSpatialEdges) {
-            return true;
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Node does not exist in graph (" + key + ").");
-        }
-        var nodeTiles = { cache: [], caching: [] };
-        if (!(key in this._requiredNodeTiles)) {
-            var node = this.getNode(key);
-            nodeTiles.cache = this._graphCalculator
-                .encodeHs(node.latLon, this._tilePrecision, this._tileThreshold)
-                .filter(function (h) {
-                return !(h in _this._cachedTiles);
-            });
-            if (nodeTiles.cache.length > 0) {
-                this._requiredNodeTiles[key] = nodeTiles;
-            }
-        }
-        else {
-            nodeTiles = this._requiredNodeTiles[key];
-        }
-        return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0;
-    };
-    /**
-     * Get a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {Node} Retrieved node.
-     */
-    Graph.prototype.getNode = function (key) {
-        var accessed = new Date().getTime();
-        this._updateCachedNodeAccess(key, accessed);
-        this._updateCachedTileAccess(key, accessed);
-        return this._nodes[key];
-    };
-    /**
-     * Get a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {Node} Retrieved sequence.
-     */
-    Graph.prototype.getSequence = function (sequenceKey) {
-        var sequenceAccess = this._sequences[sequenceKey];
-        sequenceAccess.accessed = new Date().getTime();
-        return sequenceAccess.sequence;
-    };
-    /**
-     * Reset all spatial edges of the graph nodes.
-     */
-    Graph.prototype.resetSpatialEdges = function () {
-        var cachedKeys = Object.keys(this._cachedSpatialEdges);
-        for (var _i = 0, cachedKeys_1 = cachedKeys; _i < cachedKeys_1.length; _i++) {
-            var cachedKey = cachedKeys_1[_i];
-            var node = this._cachedSpatialEdges[cachedKey];
-            node.resetSpatialEdges();
-            delete this._cachedSpatialEdges[cachedKey];
-        }
-    };
-    /**
-     * Reset the complete graph but keep the nodes corresponding
-     * to the supplied keys. All other nodes will be disposed.
-     *
-     * @param {Array<string>} keepKeys - Keys for nodes to keep
-     * in graph after reset.
-     */
-    Graph.prototype.reset = function (keepKeys) {
-        var nodes = [];
-        for (var _i = 0, keepKeys_1 = keepKeys; _i < keepKeys_1.length; _i++) {
-            var key = keepKeys_1[_i];
-            if (!this.hasNode(key)) {
-                throw new Error("Node does not exist " + key);
-            }
-            var node = this.getNode(key);
-            node.resetSequenceEdges();
-            node.resetSpatialEdges();
-            nodes.push(node);
-        }
-        for (var _a = 0, _b = Object.keys(this._cachedNodes); _a < _b.length; _a++) {
-            var cachedKey = _b[_a];
-            if (keepKeys.indexOf(cachedKey) !== -1) {
-                continue;
-            }
-            this._cachedNodes[cachedKey].node.dispose();
-            delete this._cachedNodes[cachedKey];
-        }
-        this._cachedNodeTiles = {};
-        this._cachedSpatialEdges = {};
-        this._cachedTiles = {};
-        this._cachingFill$ = {};
-        this._cachingFull$ = {};
-        this._cachingSequences$ = {};
-        this._cachingSpatialArea$ = {};
-        this._cachingTiles$ = {};
-        this._nodes = {};
-        this._nodeToTile = {};
-        this._preStored = {};
-        for (var _c = 0, nodes_2 = nodes; _c < nodes_2.length; _c++) {
-            var node = nodes_2[_c];
-            this._nodes[node.key] = node;
-            var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);
-            this._preStore(h, node);
-        }
-        this._requiredNodeTiles = {};
-        this._requiredSpatialArea = {};
-        this._sequences = {};
-        this._nodeIndexTiles = {};
-        this._nodeIndex.clear();
-    };
-    /**
-     * Set the spatial node filter.
-     *
-     * @param {FilterExpression} filter - Filter expression to be applied
-     * when calculating spatial edges.
-     */
-    Graph.prototype.setFilter = function (filter) {
-        this._filter = this._filterCreator.createFilter(filter);
-    };
-    /**
-     * Uncache the graph according to the graph configuration.
-     *
-     * @description Uncaches unused tiles, unused nodes and
-     * sequences according to the numbers specified in the
-     * graph configuration. Sequences does not have a direct
-     * reference to either tiles or nodes and may be uncached
-     * even if they are related to the nodes that should be kept.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in
-     * graph unrelated to last access. Tiles related to those keys
-     * will also be kept in graph.
-     * @param {string} keepSequenceKey - Optional key of sequence
-     * for which the belonging nodes should not be disposed or
-     * removed from the graph. These nodes may still be uncached if
-     * not specified in keep keys param.
-     */
-    Graph.prototype.uncache = function (keepKeys, keepSequenceKey) {
-        var keysInUse = {};
-        this._addNewKeys(keysInUse, this._cachingFull$);
-        this._addNewKeys(keysInUse, this._cachingFill$);
-        this._addNewKeys(keysInUse, this._cachingSpatialArea$);
-        this._addNewKeys(keysInUse, this._requiredNodeTiles);
-        this._addNewKeys(keysInUse, this._requiredSpatialArea);
-        for (var _i = 0, keepKeys_2 = keepKeys; _i < keepKeys_2.length; _i++) {
-            var key = keepKeys_2[_i];
-            if (key in keysInUse) {
-                continue;
-            }
-            keysInUse[key] = true;
-        }
-        var keepHs = {};
-        for (var key in keysInUse) {
-            if (!keysInUse.hasOwnProperty(key)) {
-                continue;
-            }
-            var node = this._nodes[key];
-            var nodeHs = this._graphCalculator.encodeHs(node.latLon);
-            for (var _a = 0, nodeHs_1 = nodeHs; _a < nodeHs_1.length; _a++) {
-                var nodeH = nodeHs_1[_a];
-                if (!(nodeH in keepHs)) {
-                    keepHs[nodeH] = true;
-                }
-            }
-        }
-        var potentialHs = [];
-        for (var h in this._cachedTiles) {
-            if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) {
-                continue;
-            }
-            potentialHs.push([h, this._cachedTiles[h]]);
-        }
-        var uncacheHs = potentialHs
-            .sort(function (h1, h2) {
-            return h2[1].accessed - h1[1].accessed;
-        })
-            .slice(this._configuration.maxUnusedTiles)
-            .map(function (h) {
-            return h[0];
-        });
-        for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) {
-            var uncacheH = uncacheHs_1[_b];
-            this._uncacheTile(uncacheH, keepSequenceKey);
-        }
-        var potentialPreStored = [];
-        var nonCachedPreStored = [];
-        for (var h in this._preStored) {
-            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {
-                continue;
-            }
-            var prestoredNodes = this._preStored[h];
-            for (var key in prestoredNodes) {
-                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {
-                    continue;
-                }
-                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {
-                    continue;
-                }
-                if (key in this._cachedNodes) {
-                    potentialPreStored.push([this._cachedNodes[key], h]);
-                }
-                else {
-                    nonCachedPreStored.push([key, h]);
-                }
-            }
-        }
-        var uncachePreStored = potentialPreStored
-            .sort(function (_a, _b) {
-            var na1 = _a[0], h1 = _a[1];
-            var na2 = _b[0], h2 = _b[1];
-            return na2.accessed - na1.accessed;
-        })
-            .slice(this._configuration.maxUnusedPreStoredNodes)
-            .map(function (_a) {
-            var na = _a[0], h = _a[1];
-            return [na.node.key, h];
-        });
-        this._uncachePreStored(nonCachedPreStored);
-        this._uncachePreStored(uncachePreStored);
-        var potentialNodes = [];
-        for (var key in this._cachedNodes) {
-            if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {
-                continue;
-            }
-            potentialNodes.push(this._cachedNodes[key]);
-        }
-        var uncacheNodes = potentialNodes
-            .sort(function (n1, n2) {
-            return n2.accessed - n1.accessed;
-        })
-            .slice(this._configuration.maxUnusedNodes);
-        for (var _c = 0, uncacheNodes_1 = uncacheNodes; _c < uncacheNodes_1.length; _c++) {
-            var nodeAccess = uncacheNodes_1[_c];
-            nodeAccess.node.uncache();
-            var key = nodeAccess.node.key;
-            delete this._cachedNodes[key];
-            if (key in this._cachedNodeTiles) {
-                delete this._cachedNodeTiles[key];
-            }
-            if (key in this._cachedSpatialEdges) {
-                delete this._cachedSpatialEdges[key];
-            }
-        }
-        var potentialSequences = [];
-        for (var sequenceKey in this._sequences) {
-            if (!this._sequences.hasOwnProperty(sequenceKey) ||
-                sequenceKey in this._cachingSequences$ ||
-                sequenceKey === keepSequenceKey) {
-                continue;
-            }
-            potentialSequences.push(this._sequences[sequenceKey]);
-        }
-        var uncacheSequences = potentialSequences
-            .sort(function (s1, s2) {
-            return s2.accessed - s1.accessed;
-        })
-            .slice(this._configuration.maxSequences);
-        for (var _d = 0, uncacheSequences_1 = uncacheSequences; _d < uncacheSequences_1.length; _d++) {
-            var sequenceAccess = uncacheSequences_1[_d];
-            var sequenceKey = sequenceAccess.sequence.key;
-            delete this._sequences[sequenceKey];
-            if (sequenceKey in this._cachedSequenceNodes) {
-                delete this._cachedSequenceNodes[sequenceKey];
-            }
-            sequenceAccess.sequence.dispose();
-        }
-    };
-    Graph.prototype._addNewKeys = function (keys, dict) {
-        for (var key in dict) {
-            if (!dict.hasOwnProperty(key) || !this.hasNode(key)) {
-                continue;
-            }
-            if (!(key in keys)) {
-                keys[key] = true;
-            }
-        }
-    };
-    Graph.prototype._cacheSequence$ = function (sequenceKey) {
-        var _this = this;
-        if (sequenceKey in this._cachingSequences$) {
-            return this._cachingSequences$[sequenceKey];
-        }
-        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey]).pipe(operators_1.tap(function (sequenceByKey) {
-            if (!(sequenceKey in _this._sequences)) {
-                _this._sequences[sequenceKey] = {
-                    accessed: new Date().getTime(),
-                    sequence: new Graph_1.Sequence(sequenceByKey[sequenceKey]),
-                };
-            }
-            delete _this._cachingSequences$[sequenceKey];
-        }), operators_1.map(function (sequenceByKey) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (sequenceKey in _this._cachingSequences$) {
-                delete _this._cachingSequences$[sequenceKey];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingSequences$[sequenceKey];
-    };
-    Graph.prototype._cacheTile$ = function (h) {
-        var _this = this;
-        this._cachingTiles$[h] = this._apiV3.imagesByH$([h]).pipe(operators_1.tap(function (imagesByH) {
-            var coreNodes = imagesByH[h];
-            if (h in _this._cachedTiles) {
-                return;
-            }
-            _this._nodeIndexTiles[h] = [];
-            _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };
-            var hCache = _this._cachedTiles[h].nodes;
-            var preStored = _this._removeFromPreStore(h);
-            for (var index in coreNodes) {
-                if (!coreNodes.hasOwnProperty(index)) {
-                    continue;
-                }
-                var coreNode = coreNodes[index];
-                if (coreNode == null) {
-                    break;
-                }
-                if (coreNode.sequence_key == null) {
-                    console.warn("Sequence missing, discarding node (" + coreNode.key + ")");
-                    continue;
-                }
-                if (preStored != null && coreNode.key in preStored) {
-                    var preStoredNode = preStored[coreNode.key];
-                    delete preStored[coreNode.key];
-                    hCache.push(preStoredNode);
-                    var preStoredNodeIndexItem = {
-                        lat: preStoredNode.latLon.lat,
-                        lon: preStoredNode.latLon.lon,
-                        node: preStoredNode,
-                    };
-                    _this._nodeIndex.insert(preStoredNodeIndexItem);
-                    _this._nodeIndexTiles[h].push(preStoredNodeIndexItem);
-                    _this._nodeToTile[preStoredNode.key] = h;
-                    continue;
-                }
-                var node = new Graph_1.Node(coreNode);
-                hCache.push(node);
-                var nodeIndexItem = {
-                    lat: node.latLon.lat,
-                    lon: node.latLon.lon,
-                    node: node,
-                };
-                _this._nodeIndex.insert(nodeIndexItem);
-                _this._nodeIndexTiles[h].push(nodeIndexItem);
-                _this._nodeToTile[node.key] = h;
-                _this._setNode(node);
-            }
-            delete _this._cachingTiles$[h];
-        }), operators_1.map(function (imagesByH) {
-            return _this;
-        }), operators_1.catchError(function (error) {
-            delete _this._cachingTiles$[h];
-            throw error;
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingTiles$[h];
-    };
-    Graph.prototype._makeFull = function (node, fillNode) {
-        if (fillNode.calt == null) {
-            fillNode.calt = this._defaultAlt;
-        }
-        if (fillNode.c_rotation == null) {
-            fillNode.c_rotation = this._graphCalculator.rotationFromCompass(fillNode.ca, fillNode.orientation);
-        }
-        node.makeFull(fillNode);
-    };
-    Graph.prototype._preStore = function (h, node) {
-        if (!(h in this._preStored)) {
-            this._preStored[h] = {};
-        }
-        this._preStored[h][node.key] = node;
-    };
-    Graph.prototype._removeFromPreStore = function (h) {
-        var preStored = null;
-        if (h in this._preStored) {
-            preStored = this._preStored[h];
-            delete this._preStored[h];
-        }
-        return preStored;
-    };
-    Graph.prototype._setNode = function (node) {
-        var key = node.key;
-        if (this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Node already exist (" + key + ").");
-        }
-        this._nodes[key] = node;
-    };
-    Graph.prototype._uncacheTile = function (h, keepSequenceKey) {
-        for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
-            var node = _a[_i];
-            var key = node.key;
-            delete this._nodeToTile[key];
-            if (key in this._cachedNodes) {
-                delete this._cachedNodes[key];
-            }
-            if (key in this._cachedNodeTiles) {
-                delete this._cachedNodeTiles[key];
-            }
-            if (key in this._cachedSpatialEdges) {
-                delete this._cachedSpatialEdges[key];
-            }
-            if (node.sequenceKey === keepSequenceKey) {
-                this._preStore(h, node);
-                node.uncache();
-            }
-            else {
-                delete this._nodes[key];
-                if (node.sequenceKey in this._cachedSequenceNodes) {
-                    delete this._cachedSequenceNodes[node.sequenceKey];
-                }
-                node.dispose();
-            }
-        }
-        for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) {
-            var nodeIndexItem = _c[_b];
-            this._nodeIndex.remove(nodeIndexItem);
-        }
-        delete this._nodeIndexTiles[h];
-        delete this._cachedTiles[h];
-    };
-    Graph.prototype._uncachePreStored = function (preStored) {
-        var hs = {};
-        for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) {
-            var _a = preStored_1[_i], key = _a[0], h = _a[1];
-            if (key in this._nodes) {
-                delete this._nodes[key];
-            }
-            if (key in this._cachedNodes) {
-                delete this._cachedNodes[key];
-            }
-            var node = this._preStored[h][key];
-            if (node.sequenceKey in this._cachedSequenceNodes) {
-                delete this._cachedSequenceNodes[node.sequenceKey];
-            }
-            delete this._preStored[h][key];
-            node.dispose();
-            hs[h] = true;
-        }
-        for (var h in hs) {
-            if (!hs.hasOwnProperty(h)) {
-                continue;
-            }
-            if (Object.keys(this._preStored[h]).length === 0) {
-                delete this._preStored[h];
-            }
-        }
-    };
-    Graph.prototype._updateCachedTileAccess = function (key, accessed) {
-        if (key in this._nodeToTile) {
-            this._cachedTiles[this._nodeToTile[key]].accessed = accessed;
-        }
-    };
-    Graph.prototype._updateCachedNodeAccess = function (key, accessed) {
-        if (key in this._cachedNodes) {
-            this._cachedNodes[key].accessed = accessed;
-        }
-    };
-    return Graph;
-}());
-exports.Graph = Graph;
-exports.default = Graph;
-
-},{"../Edge":292,"../Error":293,"../Geo":294,"../Graph":295,"rxjs":43,"rxjs/operators":241}],425:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GraphCalculator = void 0;
-var geohash = require("latlon-geohash");
-var THREE = require("three");
-var Error_1 = require("../Error");
-var Geo_1 = require("../Geo");
-/**
- * @class GraphCalculator
- *
- * @classdesc Represents a calculator for graph entities.
- */
-var GraphCalculator = /** @class */ (function () {
-    /**
-     * Create a new graph calculator instance.
-     *
-     * @param {GeoCoords} geoCoords - Geo coords instance.
-     */
-    function GraphCalculator(geoCoords) {
-        this._geoCoords = geoCoords != null ? geoCoords : new Geo_1.GeoCoords();
-    }
-    /**
-     * Encode the geohash tile for geodetic coordinates.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} precision - Precision of the encoding.
-     *
-     * @returns {string} The geohash tile for the lat, lon and precision.
-     */
-    GraphCalculator.prototype.encodeH = function (latLon, precision) {
-        if (precision === void 0) { precision = 7; }
-        return geohash.encode(latLon.lat, latLon.lon, precision);
-    };
-    /**
-     * Encode the geohash tiles within a threshold from a position
-     * using Manhattan distance.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} precision - Precision of the encoding.
-     * @param {number} threshold - Threshold of the encoding in meters.
-     *
-     * @returns {string} The geohash tiles reachable within the threshold.
-     */
-    GraphCalculator.prototype.encodeHs = function (latLon, precision, threshold) {
-        if (precision === void 0) { precision = 7; }
-        if (threshold === void 0) { threshold = 20; }
-        var h = geohash.encode(latLon.lat, latLon.lon, precision);
-        var bounds = geohash.bounds(h);
-        var ne = bounds.ne;
-        var sw = bounds.sw;
-        var neighbours = geohash.neighbours(h);
-        var bl = [0, 0, 0];
-        var tr = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, sw.lat, sw.lon, 0);
-        var position = this._geoCoords.geodeticToEnu(latLon.lat, latLon.lon, 0, sw.lat, sw.lon, 0);
-        var left = position[0] - bl[0];
-        var right = tr[0] - position[0];
-        var bottom = position[1] - bl[1];
-        var top = tr[1] - position[1];
-        var l = left < threshold;
-        var r = right < threshold;
-        var b = bottom < threshold;
-        var t = top < threshold;
-        var hs = [h];
-        if (t) {
-            hs.push(neighbours.n);
-        }
-        if (t && l) {
-            hs.push(neighbours.nw);
-        }
-        if (l) {
-            hs.push(neighbours.w);
-        }
-        if (l && b) {
-            hs.push(neighbours.sw);
-        }
-        if (b) {
-            hs.push(neighbours.s);
-        }
-        if (b && r) {
-            hs.push(neighbours.se);
-        }
-        if (r) {
-            hs.push(neighbours.e);
-        }
-        if (r && t) {
-            hs.push(neighbours.ne);
-        }
-        return hs;
-    };
-    /**
-     * Encode the minimum set of geohash tiles containing a bounding box.
-     *
-     * @description The current algorithm does expect the bounding box
-     * to be sufficiently small to be contained in an area with the size
-     * of maximally four tiles. Up to nine adjacent tiles may be returned.
-     * The method currently uses the largest side as the threshold leading to
-     * more tiles being returned than needed in edge cases.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @param {number} precision - Precision of the encoding.
-     *
-     * @returns {string} The geohash tiles containing the bounding box.
-     */
-    GraphCalculator.prototype.encodeHsFromBoundingBox = function (sw, ne, precision) {
-        if (precision === void 0) { precision = 7; }
-        if (ne.lat <= sw.lat || ne.lon <= sw.lon) {
-            throw new Error_1.GraphMapillaryError("North east needs to be top right of south west");
-        }
-        var centerLat = (sw.lat + ne.lat) / 2;
-        var centerLon = (sw.lon + ne.lon) / 2;
-        var enu = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, centerLat, centerLon, 0);
-        var threshold = Math.max(enu[0], enu[1]);
-        return this.encodeHs({ lat: centerLat, lon: centerLon }, precision, threshold);
-    };
-    /**
-     * Get the bounding box corners for a circle with radius of a threshold
-     * with center in a geodetic position.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} threshold - Threshold distance from the position in meters.
-     *
-     * @returns {Array<ILatLon>} The south west and north east corners of the
-     * bounding box.
-     */
-    GraphCalculator.prototype.boundingBoxCorners = function (latLon, threshold) {
-        var bl = this._geoCoords.enuToGeodetic(-threshold, -threshold, 0, latLon.lat, latLon.lon, 0);
-        var tr = this._geoCoords.enuToGeodetic(threshold, threshold, 0, latLon.lat, latLon.lon, 0);
-        return [
-            { lat: bl[0], lon: bl[1] },
-            { lat: tr[0], lon: tr[1] },
-        ];
-    };
-    /**
-     * Convert a compass angle to an angle axis rotation vector.
-     *
-     * @param {number} compassAngle - The compass angle in degrees.
-     * @param {number} orientation - The orientation of the original image.
-     *
-     * @returns {Array<number>} Angle axis rotation vector.
-     */
-    GraphCalculator.prototype.rotationFromCompass = function (compassAngle, orientation) {
-        var x = 0;
-        var y = 0;
-        var z = 0;
-        switch (orientation) {
-            case 1:
-                x = Math.PI / 2;
-                break;
-            case 3:
-                x = -Math.PI / 2;
-                z = Math.PI;
-                break;
-            case 6:
-                y = -Math.PI / 2;
-                z = -Math.PI / 2;
-                break;
-            case 8:
-                y = Math.PI / 2;
-                z = Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        var rz = new THREE.Matrix4().makeRotationZ(z);
-        var euler = new THREE.Euler(x, y, compassAngle * Math.PI / 180, "XYZ");
-        var re = new THREE.Matrix4().makeRotationFromEuler(euler);
-        var rotation = new THREE.Vector4().setAxisAngleFromRotationMatrix(re.multiply(rz));
-        return rotation.multiplyScalar(rotation.w).toArray().slice(0, 3);
-    };
-    return GraphCalculator;
-}());
-exports.GraphCalculator = GraphCalculator;
-exports.default = GraphCalculator;
-
-},{"../Error":293,"../Geo":294,"latlon-geohash":21,"three":242}],426:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GraphMode = void 0;
-/**
- * Enumeration for graph modes.
- * @enum {number}
- * @readonly
- * @description Modes for the retrieval and caching performed
- * by the graph service on the graph.
- */
-var GraphMode;
-(function (GraphMode) {
-    /**
-     * Caching is performed on sequences only and sequence edges are
-     * calculated. Spatial tiles
-     * are not retrieved and spatial edges are not calculated when
-     * caching nodes. Complete sequences are being cached for requested
-     * nodes within the graph.
-     */
-    GraphMode[GraphMode["Sequence"] = 0] = "Sequence";
-    /**
-     * Caching is performed with emphasis on spatial data. Sequence edges
-     * as well as spatial edges are cached. Sequence data
-     * is still requested but complete sequences are not being cached
-     * for requested nodes.
-     *
-     * This is the initial mode of the graph service.
-     */
-    GraphMode[GraphMode["Spatial"] = 1] = "Spatial";
-})(GraphMode = exports.GraphMode || (exports.GraphMode = {}));
-exports.default = GraphMode;
-
-},{}],427:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GraphService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-/**
- * @class GraphService
- *
- * @classdesc Represents a service for graph operations.
- */
-var GraphService = /** @class */ (function () {
-    /**
-     * Create a new graph service instance.
-     *
-     * @param {Graph} graph - Graph instance to be operated on.
-     */
-    function GraphService(graph, imageLoadingService) {
-        this._graph$ = rxjs_1.concat(rxjs_1.of(graph), graph.changed$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._graph$.subscribe(function () { });
-        this._graphMode = Graph_1.GraphMode.Spatial;
-        this._graphModeSubject$ = new rxjs_1.Subject();
-        this._graphMode$ = this._graphModeSubject$.pipe(operators_1.startWith(this._graphMode), operators_1.publishReplay(1), operators_1.refCount());
-        this._graphMode$.subscribe(function () { });
-        this._imageLoadingService = imageLoadingService;
-        this._firstGraphSubjects$ = [];
-        this._initializeCacheSubscriptions = [];
-        this._sequenceSubscriptions = [];
-        this._spatialSubscriptions = [];
-    }
-    Object.defineProperty(GraphService.prototype, "graphMode$", {
-        /**
-         * Get graph mode observable.
-         *
-         * @description Emits the current graph mode.
-         *
-         * @returns {Observable<GraphMode>} Observable
-         * emitting the current graph mode when it changes.
-         */
-        get: function () {
-            return this._graphMode$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Cache full nodes in a bounding box.
-     *
-     * @description When called, the full properties of
-     * the node are retrieved. The node cache is not initialized
-     * for any new nodes retrieved and the node assets are not
-     * retrieved, {@link cacheNode$} needs to be called for caching
-     * assets.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @return {Observable<Array<Node>>} Observable emitting a single item,
-     * the nodes of the bounding box, when they have all been retrieved.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheBoundingBox$ = function (sw, ne) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            return graph.cacheBoundingBox$(sw, ne);
-        }));
-    };
-    /**
-     * Cache a node in the graph and retrieve it.
-     *
-     * @description When called, the full properties of
-     * the node are retrieved and the node cache is initialized.
-     * After that the node assets are cached and the node
-     * is emitted to the observable when.
-     * In parallel to caching the node assets, the sequence and
-     * spatial edges of the node are cached. For this, the sequence
-     * of the node and the required tiles and spatial nodes are
-     * retrieved. The sequence and spatial edges may be set before
-     * or after the node is returned.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @return {Observable<Node>} Observable emitting a single item,
-     * the node, when it has been retrieved and its assets are cached.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheNode$ = function (key) {
-        var _this = this;
-        var firstGraphSubject$ = new rxjs_1.Subject();
-        this._firstGraphSubjects$.push(firstGraphSubject$);
-        var firstGraph$ = firstGraphSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        var node$ = firstGraph$.pipe(operators_1.map(function (graph) {
-            return graph.getNode(key);
-        }), operators_1.mergeMap(function (node) {
-            return node.assetsCached ?
-                rxjs_1.of(node) :
-                node.cacheAssets$();
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        node$.subscribe(function (node) {
-            _this._imageLoadingService.loadnode$.next(node);
-        }, function (error) {
-            console.error("Failed to cache node (" + key + ")", error);
-        });
-        var initializeCacheSubscription = this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingFull(key) || !graph.hasNode(key)) {
-                return graph.cacheFull$(key);
-            }
-            if (graph.isCachingFill(key) || !graph.getNode(key).full) {
-                return graph.cacheFill$(key);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.tap(function (graph) {
-            if (!graph.hasInitializedCache(key)) {
-                graph.initializeCache(key);
-            }
-        }), operators_1.finalize(function () {
-            if (initializeCacheSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(initializeCacheSubscription, _this._initializeCacheSubscriptions);
-            _this._removeFromArray(firstGraphSubject$, _this._firstGraphSubjects$);
-        }))
-            .subscribe(function (graph) {
-            firstGraphSubject$.next(graph);
-            firstGraphSubject$.complete();
-        }, function (error) {
-            firstGraphSubject$.error(error);
-        });
-        if (!initializeCacheSubscription.closed) {
-            this._initializeCacheSubscriptions.push(initializeCacheSubscription);
-        }
-        var graphSequence$ = firstGraph$.pipe(operators_1.mergeMap(function (graph) {
-            if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
-                return graph.cacheNodeSequence$(key);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequenceSubscription = graphSequence$.pipe(operators_1.tap(function (graph) {
-            if (!graph.getNode(key).sequenceEdges.cached) {
-                graph.cacheSequenceEdges(key);
-            }
-        }), operators_1.finalize(function () {
-            if (sequenceSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(sequenceSubscription, _this._sequenceSubscriptions);
-        }))
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache sequence edges (" + key + ").", error);
-        });
-        if (!sequenceSubscription.closed) {
-            this._sequenceSubscriptions.push(sequenceSubscription);
-        }
-        if (this._graphMode === Graph_1.GraphMode.Spatial) {
-            var spatialSubscription_1 = firstGraph$.pipe(operators_1.expand(function (graph) {
-                if (graph.hasTiles(key)) {
-                    return rxjs_1.empty();
-                }
-                return rxjs_1.from(graph.cacheTiles$(key)).pipe(operators_1.mergeMap(function (graph$) {
-                    return graph$.pipe(operators_1.mergeMap(function (g) {
-                        if (g.isCachingTiles(key)) {
-                            return rxjs_1.empty();
-                        }
-                        return rxjs_1.of(g);
-                    }), operators_1.catchError(function (error, caught$) {
-                        console.error("Failed to cache tile data (" + key + ").", error);
-                        return rxjs_1.empty();
-                    }));
-                }));
-            }), operators_1.last(), operators_1.mergeMap(function (graph) {
-                if (graph.hasSpatialArea(key)) {
-                    return rxjs_1.of(graph);
-                }
-                return rxjs_1.from(graph.cacheSpatialArea$(key)).pipe(operators_1.mergeMap(function (graph$) {
-                    return graph$.pipe(operators_1.catchError(function (error, caught$) {
-                        console.error("Failed to cache spatial nodes (" + key + ").", error);
-                        return rxjs_1.empty();
-                    }));
-                }));
-            }), operators_1.last(), operators_1.mergeMap(function (graph) {
-                return graph.hasNodeSequence(key) ?
-                    rxjs_1.of(graph) :
-                    graph.cacheNodeSequence$(key);
-            }), operators_1.tap(function (graph) {
-                if (!graph.getNode(key).spatialEdges.cached) {
-                    graph.cacheSpatialEdges(key);
-                }
-            }), operators_1.finalize(function () {
-                if (spatialSubscription_1 == null) {
-                    return;
-                }
-                _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions);
-            }))
-                .subscribe(function (graph) { return; }, function (error) {
-                console.error("Failed to cache spatial edges (" + key + ").", error);
-            });
-            if (!spatialSubscription_1.closed) {
-                this._spatialSubscriptions.push(spatialSubscription_1);
-            }
-        }
-        return node$.pipe(operators_1.first(function (node) {
-            return node.assetsCached;
-        }));
-    };
-    /**
-     * Cache a sequence in the graph and retrieve it.
-     *
-     * @param {string} sequenceKey - Sequence key.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the sequence, when it has been retrieved and its assets are cached.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheSequence$ = function (sequenceKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.map(function (graph) {
-            return graph.getSequence(sequenceKey);
-        }));
-    };
-    /**
-     * Cache a sequence and its nodes in the graph and retrieve the sequence.
-     *
-     * @description Caches a sequence and its assets are cached and
-     * retrieves all nodes belonging to the sequence. The node assets
-     * or edges will not be cached.
-     *
-     * @param {string} sequenceKey - Sequence key.
-     * @param {string} referenceNodeKey - Key of node to use as reference
-     * for optimized caching.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the sequence, when it has been retrieved, its assets are cached and
-     * all nodes belonging to the sequence has been retrieved.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {
-                return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.map(function (graph) {
-            return graph.getSequence(sequenceKey);
-        }));
-    };
-    /**
-     * Set a spatial edge filter on the graph.
-     *
-     * @description Resets the spatial edges of all cached nodes.
-     *
-     * @param {FilterExpression} filter - Filter expression to be applied.
-     * @return {Observable<Graph>} Observable emitting a single item,
-     * the graph, when the spatial edges have been reset.
-     */
-    GraphService.prototype.setFilter$ = function (filter) {
-        this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.resetSpatialEdges();
-            graph.setFilter(filter);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    /**
-     * Set the graph mode.
-     *
-     * @description If graph mode is set to spatial, caching
-     * is performed with emphasis on spatial edges. If graph
-     * mode is set to sequence no tile data is requested and
-     * no spatial edges are computed.
-     *
-     * When setting graph mode to sequence all spatial
-     * subscriptions are aborted.
-     *
-     * @param {GraphMode} mode - Graph mode to set.
-     */
-    GraphService.prototype.setGraphMode = function (mode) {
-        if (this._graphMode === mode) {
-            return;
-        }
-        if (mode === Graph_1.GraphMode.Sequence) {
-            this._resetSubscriptions(this._spatialSubscriptions);
-        }
-        this._graphMode = mode;
-        this._graphModeSubject$.next(this._graphMode);
-    };
-    /**
-     * Reset the graph.
-     *
-     * @description Resets the graph but keeps the nodes of the
-     * supplied keys.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
-     * @return {Observable<Node>} Observable emitting a single item,
-     * the graph, when it has been reset.
-     */
-    GraphService.prototype.reset$ = function (keepKeys) {
-        this._abortSubjects(this._firstGraphSubjects$);
-        this._resetSubscriptions(this._initializeCacheSubscriptions);
-        this._resetSubscriptions(this._sequenceSubscriptions);
-        this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.reset(keepKeys);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    /**
-     * Uncache the graph.
-     *
-     * @description Uncaches the graph by removing tiles, nodes and
-     * sequences. Keeps the nodes of the supplied keys and the tiles
-     * related to those nodes.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
-     * @param {string} keepSequenceKey - Optional key of sequence
-     * for which the belonging nodes should not be disposed or
-     * removed from the graph. These nodes may still be uncached if
-     * not specified in keep keys param.
-     * @return {Observable<Graph>} Observable emitting a single item,
-     * the graph, when the graph has been uncached.
-     */
-    GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.uncache(keepKeys, keepSequenceKey);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    GraphService.prototype._abortSubjects = function (subjects) {
-        for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) {
-            var subject = _a[_i];
-            this._removeFromArray(subject, subjects);
-            subject.error(new Error("Cache node request was aborted."));
-        }
-    };
-    GraphService.prototype._removeFromArray = function (object, objects) {
-        var index = objects.indexOf(object);
-        if (index !== -1) {
-            objects.splice(index, 1);
-        }
-    };
-    GraphService.prototype._resetSubscriptions = function (subscriptions) {
-        for (var _i = 0, _a = subscriptions.slice(); _i < _a.length; _i++) {
-            var subscription = _a[_i];
-            this._removeFromArray(subscription, subscriptions);
-            if (!subscription.closed) {
-                subscription.unsubscribe();
-            }
-        }
-    };
-    return GraphService;
-}());
-exports.GraphService = GraphService;
-exports.default = GraphService;
-
-},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],428:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageLoadingService = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var ImageLoadingService = /** @class */ (function () {
-    function ImageLoadingService() {
-        this._loadnode$ = new rxjs_1.Subject();
-        this._loadstatus$ = this._loadnode$.pipe(operators_1.scan(function (_a, node) {
-            var nodes = _a[0];
-            var changed = false;
-            if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {
-                if (node.key in nodes) {
-                    delete nodes[node.key];
-                    changed = true;
-                }
-            }
-            else {
-                nodes[node.key] = node.loadStatus;
-                changed = true;
-            }
-            return [nodes, changed];
-        }, [{}, false]), operators_1.filter(function (_a) {
-            var nodes = _a[0], changed = _a[1];
-            return changed;
-        }), operators_1.map(function (_a) {
-            var nodes = _a[0];
-            return nodes;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._loadstatus$.subscribe(function () { });
-    }
-    Object.defineProperty(ImageLoadingService.prototype, "loadnode$", {
-        get: function () {
-            return this._loadnode$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(ImageLoadingService.prototype, "loadstatus$", {
-        get: function () {
-            return this._loadstatus$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return ImageLoadingService;
-}());
-exports.ImageLoadingService = ImageLoadingService;
-
-},{"rxjs":43,"rxjs/operators":241}],429:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MeshReader = void 0;
-var Pbf = require("pbf");
-var MeshReader = /** @class */ (function () {
-    function MeshReader() {
-    }
-    MeshReader.read = function (buffer) {
-        var pbf = new Pbf(buffer);
-        return pbf.readFields(MeshReader._readMeshField, { faces: [], vertices: [] });
-    };
-    MeshReader._readMeshField = function (tag, mesh, pbf) {
-        if (tag === 1) {
-            mesh.vertices.push(pbf.readFloat());
-        }
-        else if (tag === 2) {
-            mesh.faces.push(pbf.readVarint());
-        }
-    };
-    return MeshReader;
-}());
-exports.MeshReader = MeshReader;
-
-},{"pbf":40}],430:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Node = void 0;
-var operators_1 = require("rxjs/operators");
-/**
- * @class Node
- *
- * @classdesc Represents a node in the navigation graph.
- *
- * Explanation of position and bearing properties:
- *
- * When images are uploaded they will have GPS information in the EXIF, this is what
- * is called `originalLatLon` {@link Node.originalLatLon}.
- *
- * When Structure from Motions has been run for a node a `computedLatLon` that
- * differs from the `originalLatLon` will be created. It is different because
- * GPS positions are not very exact and SfM aligns the camera positions according
- * to the 3D reconstruction {@link Node.computedLatLon}.
- *
- * At last there exist a `latLon` property which evaluates to
- * the `computedLatLon` from SfM if it exists but falls back
- * to the `originalLatLon` from the EXIF GPS otherwise {@link Node.latLon}.
- *
- * Everything that is done in in the Viewer is based on the SfM positions,
- * i.e. `computedLatLon`. That is why the smooth transitions go in the right
- * direction (nd not in strange directions because of bad GPS).
- *
- * E.g. when placing a marker in the Viewer it is relative to the SfM
- * position i.e. the `computedLatLon`.
- *
- * The same concept as above also applies to the compass angle (or bearing) properties
- * `originalCa`, `computedCa` and `ca`.
- */
-var Node = /** @class */ (function () {
-    /**
-     * Create a new node instance.
-     *
-     * @description Nodes are always created internally by the library.
-     * Nodes can not be added to the library through any API method.
-     *
-     * @param {ICoreNode} coreNode - Raw core node data.
-     * @ignore
-     */
-    function Node(core) {
-        this._cache = null;
-        this._core = core;
-        this._fill = null;
-    }
-    Object.defineProperty(Node.prototype, "assetsCached", {
-        /**
-         * Get assets cached.
-         *
-         * @description The assets that need to be cached for this property
-         * to report true are the following: fill properties, image and mesh.
-         * The library ensures that the current node will always have the
-         * assets cached.
-         *
-         * @returns {boolean} Value indicating whether all assets have been
-         * cached.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._core != null &&
-                this._fill != null &&
-                this._cache != null &&
-                this._cache.image != null &&
-                this._cache.mesh != null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "alt", {
-        /**
-         * Get alt.
-         *
-         * @description If SfM has not been run the computed altitude is
-         * set to a default value of two meters.
-         *
-         * @returns {number} Altitude, in meters.
-         */
-        get: function () {
-            return this._fill.calt;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ca", {
-        /**
-         * Get ca.
-         *
-         * @description If the SfM computed compass angle exists it will
-         * be returned, otherwise the original EXIF compass angle.
-         *
-         * @returns {number} Compass angle, measured in degrees
-         * clockwise with respect to north.
-         */
-        get: function () {
-            return this._fill.cca != null ? this._fill.cca : this._fill.ca;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "cameraProjection", {
-        /**
-         * Get cameraProjection.
-         *
-         * @description Will be undefined if SfM has not been run.
-         *
-         * @returns {number} The camera projection of the image.
-         */
-        get: function () {
-            return this._fill.camera_projection_type;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "capturedAt", {
-        /**
-         * Get capturedAt.
-         *
-         * @returns {number} Timestamp when the image was captured.
-         */
-        get: function () {
-            return this._fill.captured_at;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "cameraUuid", {
-        /**
-         * Get camera uuid.
-         *
-         * @description Will be undefined if the camera uuid was not
-         * recorded in the image exif information.
-         *
-         * @returns {string} Universally unique id for camera used
-         * when capturing image.
-         */
-        get: function () {
-            return this._fill.captured_with_camera_uuid;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "clusterKey", {
-        /**
-         * Get clusterKey.
-         *
-         * @returns {string} Unique key of the SfM cluster to which
-         * the node belongs.
-         */
-        get: function () {
-            return this._fill.cluster_key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ck1", {
-        /**
-         * Get ck1.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed radial distortion parameter
-         * k1.
-         */
-        get: function () {
-            return this._fill.ck1;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ck2", {
-        /**
-         * Get ck2.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed radial distortion parameter
-         * k2.
-         */
-        get: function () {
-            return this._fill.ck2;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "computedCA", {
-        /**
-         * Get computedCA.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed compass angle, measured
-         * in degrees clockwise with respect to north.
-         */
-        get: function () {
-            return this._fill.cca;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "computedLatLon", {
-        /**
-         * Get computedLatLon.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {ILatLon} SfM computed latitude longitude in WGS84 datum,
-         * measured in degrees.
-         */
-        get: function () {
-            return this._core.cl;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "focal", {
-        /**
-         * Get focal.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed focal length.
-         */
-        get: function () {
-            return this._fill.cfocal;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "full", {
-        /**
-         * Get full.
-         *
-         * @description The library ensures that the current node will
-         * always be full.
-         *
-         * @returns {boolean} Value indicating whether the node has all
-         * properties filled.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._fill != null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "fullPano", {
-        /**
-         * Get fullPano.
-         *
-         * @returns {boolean} Value indicating whether the node is a complete
-         * 360 panorama.
-         */
-        get: function () {
-            return this._fill.gpano != null &&
-                this._fill.gpano.CroppedAreaLeftPixels === 0 &&
-                this._fill.gpano.CroppedAreaTopPixels === 0 &&
-                this._fill.gpano.CroppedAreaImageWidthPixels === this._fill.gpano.FullPanoWidthPixels &&
-                this._fill.gpano.CroppedAreaImageHeightPixels === this._fill.gpano.FullPanoHeightPixels;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "gpano", {
-        /**
-         * Get gpano.
-         *
-         * @description Will not be set for non panoramic images.
-         *
-         * @returns {IGPano} Panorama information for panorama images.
-         */
-        get: function () {
-            return this._fill.gpano;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "height", {
-        /**
-         * Get height.
-         *
-         * @returns {number} Height of original image, not adjusted
-         * for orientation.
-         */
-        get: function () {
-            return this._fill.height;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "image", {
-        /**
-         * Get image.
-         *
-         * @description The image will always be set on the current node.
-         *
-         * @returns {HTMLImageElement} Cached image element of the node.
-         */
-        get: function () {
-            return this._cache.image;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "image$", {
-        /**
-         * Get image$.
-         *
-         * @returns {Observable<HTMLImageElement>} Observable emitting
-         * the cached image when it is updated.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.image$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {string} Unique key of the node.
-         */
-        get: function () {
-            return this._core.key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "latLon", {
-        /**
-         * Get latLon.
-         *
-         * @description If the SfM computed latitude longitude exist
-         * it will be returned, otherwise the original EXIF latitude
-         * longitude.
-         *
-         * @returns {ILatLon} Latitude longitude in WGS84 datum,
-         * measured in degrees.
-         */
-        get: function () {
-            return this._core.cl != null ? this._core.cl : this._core.l;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "loadStatus", {
-        /**
-         * Get loadStatus.
-         *
-         * @returns {ILoadStatus} Value indicating the load status
-         * of the mesh and image.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.loadStatus;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "merged", {
-        /**
-         * Get merged.
-         *
-         * @returns {boolean} Value indicating whether SfM has been
-         * run on the node and the node has been merged into a
-         * connected component.
-         */
-        get: function () {
-            return this._fill != null &&
-                this._fill.merge_version != null &&
-                this._fill.merge_version > 0;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mergeCC", {
-        /**
-         * Get mergeCC.
-         *
-         * @description Will not be set if SfM has not yet been run on
-         * node.
-         *
-         * @returns {number} SfM connected component key to which
-         * image belongs.
-         */
-        get: function () {
-            return this._fill.merge_cc;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mergeVersion", {
-        /**
-         * Get mergeVersion.
-         *
-         * @returns {number} Version for which SfM was run and image was merged.
-         */
-        get: function () {
-            return this._fill.merge_version;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mesh", {
-        /**
-         * Get mesh.
-         *
-         * @description The mesh will always be set on the current node.
-         *
-         * @returns {IMesh} SfM triangulated mesh of reconstructed
-         * atomic 3D points.
-         */
-        get: function () {
-            return this._cache.mesh;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "organizationKey", {
-        /**
-         * Get organizationKey.
-         *
-         * @returns {string} Unique key of the organization to which
-         * the node belongs. If the node does not belong to an
-         * organization the organization key will be undefined.
-         */
-        get: function () {
-            return this._fill.organization_key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "orientation", {
-        /**
-         * Get orientation.
-         *
-         * @returns {number} EXIF orientation of original image.
-         */
-        get: function () {
-            return this._fill.orientation;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "originalCA", {
-        /**
-         * Get originalCA.
-         *
-         * @returns {number} Original EXIF compass angle, measured in
-         * degrees.
-         */
-        get: function () {
-            return this._fill.ca;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "originalLatLon", {
-        /**
-         * Get originalLatLon.
-         *
-         * @returns {ILatLon} Original EXIF latitude longitude in
-         * WGS84 datum, measured in degrees.
-         */
-        get: function () {
-            return this._core.l;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "pano", {
-        /**
-         * Get pano.
-         *
-         * @returns {boolean} Value indicating whether the node is a panorama.
-         * It could be a cropped or full panorama.
-         */
-        get: function () {
-            return this._fill.gpano != null &&
-                this._fill.gpano.FullPanoWidthPixels != null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "private", {
-        /**
-         * Get private.
-         *
-         * @returns {boolean} Value specifying if image is accessible to
-         * organization members only or to everyone.
-         */
-        get: function () {
-            return this._fill.private;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "projectKey", {
-        /**
-         * Get projectKey.
-         *
-         * @returns {string} Unique key of the project to which
-         * the node belongs. If the node does not belong to a
-         * project the project key will be undefined.
-         *
-         * @deprecated This property will be deprecated in favor
-         * of the organization key and private properties.
-         */
-        get: function () {
-            return this._fill.project != null ?
-                this._fill.project.key :
-                null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "rotation", {
-        /**
-         * Get rotation.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {Array<number>} Rotation vector in angle axis representation.
-         */
-        get: function () {
-            return this._fill.c_rotation;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "scale", {
-        /**
-         * Get scale.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} Scale of atomic reconstruction.
-         */
-        get: function () {
-            return this._fill.atomic_scale;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceKey", {
-        /**
-         * Get sequenceKey.
-         *
-         * @returns {string} Unique key of the sequence to which
-         * the node belongs.
-         */
-        get: function () {
-            return this._core.sequence_key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges", {
-        /**
-         * Get sequenceEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * sequence edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.sequenceEdges;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges$", {
-        /**
-         * Get sequenceEdges$.
-         *
-         * @description Internal observable, should not be used as an API.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the sequence edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.sequenceEdges$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges", {
-        /**
-         * Get spatialEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * spatial edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.spatialEdges;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges$", {
-        /**
-         * Get spatialEdges$.
-         *
-         * @description Internal observable, should not be used as an API.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the spatial edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.spatialEdges$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "userKey", {
-        /**
-         * Get userKey.
-         *
-         * @returns {string} Unique key of the user who uploaded
-         * the image.
-         */
-        get: function () {
-            return this._fill.user.key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "username", {
-        /**
-         * Get username.
-         *
-         * @returns {string} Username of the user who uploaded
-         * the image.
-         */
-        get: function () {
-            return this._fill.user.username;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "width", {
-        /**
-         * Get width.
-         *
-         * @returns {number} Width of original image, not
-         * adjusted for orientation.
-         */
-        get: function () {
-            return this._fill.width;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Cache the image and mesh assets.
-     *
-     * @description The assets are always cached internally by the
-     * library prior to setting a node as the current node.
-     *
-     * @returns {Observable<Node>} Observable emitting this node whenever the
-     * load status has changed and when the mesh or image has been fully loaded.
-     *
-     * @ignore
-     */
-    Node.prototype.cacheAssets$ = function () {
-        var _this = this;
-        return this._cache.cacheAssets$(this.key, this.pano, this.merged).pipe(operators_1.map(function () {
-            return _this;
-        }));
-    };
-    /**
-     * Cache the image asset.
-     *
-     * @description Use for caching a differently sized image than
-     * the one currently held by the node.
-     *
-     * @returns {Observable<Node>} Observable emitting this node whenever the
-     * load status has changed and when the mesh or image has been fully loaded.
-     *
-     * @ignore
-     */
-    Node.prototype.cacheImage$ = function (imageSize) {
-        var _this = this;
-        return this._cache.cacheImage$(this.key, imageSize).pipe(operators_1.map(function () {
-            return _this;
-        }));
-    };
-    /**
-     * Cache the sequence edges.
-     *
-     * @description The sequence edges are cached asynchronously
-     * internally by the library.
-     *
-     * @param {Array<IEdge>} edges - Sequence edges to cache.
-     * @ignore
-     */
-    Node.prototype.cacheSequenceEdges = function (edges) {
-        this._cache.cacheSequenceEdges(edges);
-    };
-    /**
-     * Cache the spatial edges.
-     *
-     * @description The spatial edges are cached asynchronously
-     * internally by the library.
-     *
-     * @param {Array<IEdge>} edges - Spatial edges to cache.
-     * @ignore
-     */
-    Node.prototype.cacheSpatialEdges = function (edges) {
-        this._cache.cacheSpatialEdges(edges);
-    };
-    /**
-     * Dispose the node.
-     *
-     * @description Disposes all cached assets.
-     * @ignore
-     */
-    Node.prototype.dispose = function () {
-        if (this._cache != null) {
-            this._cache.dispose();
-            this._cache = null;
-        }
-        this._core = null;
-        this._fill = null;
-    };
-    /**
-     * Initialize the node cache.
-     *
-     * @description The node cache is initialized internally by
-     * the library.
-     *
-     * @param {NodeCache} cache - The node cache to set as cache.
-     * @ignore
-     */
-    Node.prototype.initializeCache = function (cache) {
-        if (this._cache != null) {
-            throw new Error("Node cache already initialized (" + this.key + ").");
-        }
-        this._cache = cache;
-    };
-    /**
-     * Fill the node with all properties.
-     *
-     * @description The node is filled internally by
-     * the library.
-     *
-     * @param {IFillNode} fill - The fill node struct.
-     * @ignore
-     */
-    Node.prototype.makeFull = function (fill) {
-        if (fill == null) {
-            throw new Error("Fill can not be null.");
-        }
-        this._fill = fill;
-    };
-    /**
-     * Reset the sequence edges.
-     *
-     * @ignore
-     */
-    Node.prototype.resetSequenceEdges = function () {
-        this._cache.resetSequenceEdges();
-    };
-    /**
-     * Reset the spatial edges.
-     *
-     * @ignore
-     */
-    Node.prototype.resetSpatialEdges = function () {
-        this._cache.resetSpatialEdges();
-    };
-    /**
-     * Clears the image and mesh assets, aborts
-     * any outstanding requests and resets edges.
-     *
-     * @ignore
-     */
-    Node.prototype.uncache = function () {
-        if (this._cache == null) {
-            return;
-        }
-        this._cache.dispose();
-        this._cache = null;
-    };
-    return Node;
-}());
-exports.Node = Node;
-exports.default = Node;
-
-},{"rxjs/operators":241}],431:[function(require,module,exports){
-(function (Buffer){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.NodeCache = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-var Utils_1 = require("../Utils");
-/**
- * @class NodeCache
- *
- * @classdesc Represents the cached properties of a node.
- */
-var NodeCache = /** @class */ (function () {
-    /**
-     * Create a new node cache instance.
-     */
-    function NodeCache() {
-        this._disposed = false;
-        this._image = null;
-        this._loadStatus = { loaded: 0, total: 0 };
-        this._mesh = null;
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._spatialEdges = { cached: false, edges: [] };
-        this._imageChanged$ = new rxjs_1.Subject();
-        this._image$ = this._imageChanged$.pipe(operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
-        this._iamgeSubscription = this._image$.subscribe();
-        this._sequenceEdgesChanged$ = new rxjs_1.Subject();
-        this._sequenceEdges$ = this._sequenceEdgesChanged$.pipe(operators_1.startWith(this._sequenceEdges), operators_1.publishReplay(1), operators_1.refCount());
-        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { });
-        this._spatialEdgesChanged$ = new rxjs_1.Subject();
-        this._spatialEdges$ = this._spatialEdgesChanged$.pipe(operators_1.startWith(this._spatialEdges), operators_1.publishReplay(1), operators_1.refCount());
-        this._spatialEdgesSubscription = this._spatialEdges$.subscribe(function () { });
-        this._cachingAssets$ = null;
-    }
-    Object.defineProperty(NodeCache.prototype, "image", {
-        /**
-         * Get image.
-         *
-         * @description Will not be set when assets have not been cached
-         * or when the object has been disposed.
-         *
-         * @returns {HTMLImageElement} Cached image element of the node.
-         */
-        get: function () {
-            return this._image;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "image$", {
-        /**
-         * Get image$.
-         *
-         * @returns {Observable<HTMLImageElement>} Observable emitting
-         * the cached image when it is updated.
-         */
-        get: function () {
-            return this._image$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "loadStatus", {
-        /**
-         * Get loadStatus.
-         *
-         * @returns {ILoadStatus} Value indicating the load status
-         * of the mesh and image.
-         */
-        get: function () {
-            return this._loadStatus;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "mesh", {
-        /**
-         * Get mesh.
-         *
-         * @description Will not be set when assets have not been cached
-         * or when the object has been disposed.
-         *
-         * @returns {IMesh} SfM triangulated mesh of reconstructed
-         * atomic 3D points.
-         */
-        get: function () {
-            return this._mesh;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "sequenceEdges", {
-        /**
-         * Get sequenceEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * sequence edges.
-         */
-        get: function () {
-            return this._sequenceEdges;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "sequenceEdges$", {
-        /**
-         * Get sequenceEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the sequence edges.
-         */
-        get: function () {
-            return this._sequenceEdges$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "spatialEdges", {
-        /**
-         * Get spatialEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * spatial edges.
-         */
-        get: function () {
-            return this._spatialEdges;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "spatialEdges$", {
-        /**
-         * Get spatialEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the spatial edges.
-         */
-        get: function () {
-            return this._spatialEdges$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Cache the image and mesh assets.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} pano - Value indicating whether node is a panorama.
-     * @param {boolean} merged - Value indicating whether node is merged.
-     * @returns {Observable<NodeCache>} Observable emitting this node
-     * cache whenever the load status has changed and when the mesh or image
-     * has been fully loaded.
-     */
-    NodeCache.prototype.cacheAssets$ = function (key, pano, merged) {
-        var _this = this;
-        if (this._cachingAssets$ != null) {
-            return this._cachingAssets$;
-        }
-        var imageSize = pano ?
-            Utils_1.Settings.basePanoramaSize :
-            Utils_1.Settings.baseImageSize;
-        this._cachingAssets$ = rxjs_1.combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged)).pipe(operators_1.map(function (_a) {
-            var imageStatus = _a[0], meshStatus = _a[1];
-            _this._loadStatus.loaded = 0;
-            _this._loadStatus.total = 0;
-            if (meshStatus) {
-                _this._mesh = meshStatus.object;
-                _this._loadStatus.loaded += meshStatus.loaded.loaded;
-                _this._loadStatus.total += meshStatus.loaded.total;
-            }
-            if (imageStatus) {
-                _this._image = imageStatus.object;
-                _this._loadStatus.loaded += imageStatus.loaded.loaded;
-                _this._loadStatus.total += imageStatus.loaded.total;
-            }
-            return _this;
-        }), operators_1.finalize(function () {
-            _this._cachingAssets$ = null;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._cachingAssets$.pipe(operators_1.first(function (nodeCache) {
-            return !!nodeCache._image;
-        }))
-            .subscribe(function (nodeCache) {
-            _this._imageChanged$.next(_this._image);
-        }, function (error) { });
-        return this._cachingAssets$;
-    };
-    /**
-     * Cache an image with a higher resolution than the current one.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {ImageSize} imageSize - The size to cache.
-     * @returns {Observable<NodeCache>} Observable emitting a single item,
-     * the node cache, when the image has been cached. If supplied image
-     * size is not larger than the current image size the node cache is
-     * returned immediately.
-     */
-    NodeCache.prototype.cacheImage$ = function (key, imageSize) {
-        var _this = this;
-        if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) {
-            return rxjs_1.of(this);
-        }
-        var cacheImage$ = this._cacheImage$(key, imageSize).pipe(operators_1.first(function (status) {
-            return status.object != null;
-        }), operators_1.tap(function (status) {
-            _this._disposeImage();
-            _this._image = status.object;
-        }), operators_1.map(function (imageStatus) {
-            return _this;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        cacheImage$
-            .subscribe(function (nodeCache) {
-            _this._imageChanged$.next(_this._image);
-        }, function (error) { });
-        return cacheImage$;
-    };
-    /**
-     * Cache the sequence edges.
-     *
-     * @param {Array<IEdge>} edges - Sequence edges to cache.
-     */
-    NodeCache.prototype.cacheSequenceEdges = function (edges) {
-        this._sequenceEdges = { cached: true, edges: edges };
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-    };
-    /**
-     * Cache the spatial edges.
-     *
-     * @param {Array<IEdge>} edges - Spatial edges to cache.
-     */
-    NodeCache.prototype.cacheSpatialEdges = function (edges) {
-        this._spatialEdges = { cached: true, edges: edges };
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-    };
-    /**
-     * Dispose the node cache.
-     *
-     * @description Disposes all cached assets and unsubscribes to
-     * all streams.
-     */
-    NodeCache.prototype.dispose = function () {
-        this._iamgeSubscription.unsubscribe();
-        this._sequenceEdgesSubscription.unsubscribe();
-        this._spatialEdgesSubscription.unsubscribe();
-        this._disposeImage();
-        this._mesh = null;
-        this._loadStatus.loaded = 0;
-        this._loadStatus.total = 0;
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._spatialEdges = { cached: false, edges: [] };
-        this._imageChanged$.next(null);
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-        this._disposed = true;
-        if (this._imageRequest != null) {
-            this._imageRequest.abort();
-        }
-        if (this._meshRequest != null) {
-            this._meshRequest.abort();
-        }
-    };
-    /**
-     * Reset the sequence edges.
-     */
-    NodeCache.prototype.resetSequenceEdges = function () {
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-    };
-    /**
-     * Reset the spatial edges.
-     */
-    NodeCache.prototype.resetSpatialEdges = function () {
-        this._spatialEdges = { cached: false, edges: [] };
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-    };
-    /**
-     * Cache the image.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} pano - Value indicating whether node is a panorama.
-     * @returns {Observable<ILoadStatusObject<HTMLImageElement>>} Observable
-     * emitting a load status object every time the load status changes
-     * and completes when the image is fully loaded.
-     */
-    NodeCache.prototype._cacheImage$ = function (key, imageSize) {
-        var _this = this;
-        return rxjs_1.Observable.create(function (subscriber) {
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true);
-            xmlHTTP.responseType = "arraybuffer";
-            xmlHTTP.timeout = 15000;
-            xmlHTTP.onload = function (pe) {
-                if (xmlHTTP.status !== 200) {
-                    _this._imageRequest = null;
-                    subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText));
-                    return;
-                }
-                var image = new Image();
-                image.crossOrigin = "Anonymous";
-                image.onload = function (e) {
-                    _this._imageRequest = null;
-                    if (_this._disposed) {
-                        window.URL.revokeObjectURL(image.src);
-                        subscriber.error(new Error("Image load was aborted (" + key + ")"));
-                        return;
-                    }
-                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image });
-                    subscriber.complete();
-                };
-                image.onerror = function (error) {
-                    _this._imageRequest = null;
-                    subscriber.error(new Error("Failed to load image (" + key + ")"));
-                };
-                var blob = new Blob([xmlHTTP.response]);
-                image.src = window.URL.createObjectURL(blob);
-            };
-            xmlHTTP.onprogress = function (pe) {
-                if (_this._disposed) {
-                    return;
-                }
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
-            };
-            xmlHTTP.onerror = function (error) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Failed to fetch image (" + key + ")"));
-            };
-            xmlHTTP.ontimeout = function (e) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Image request timed out (" + key + ")"));
-            };
-            xmlHTTP.onabort = function (event) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Image request was aborted (" + key + ")"));
-            };
-            _this._imageRequest = xmlHTTP;
-            xmlHTTP.send(null);
-        });
-    };
-    /**
-     * Cache the mesh.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} merged - Value indicating whether node is merged.
-     * @returns {Observable<ILoadStatusObject<IMesh>>} Observable emitting
-     * a load status object every time the load status changes and completes
-     * when the mesh is fully loaded.
-     */
-    NodeCache.prototype._cacheMesh$ = function (key, merged) {
-        var _this = this;
-        return rxjs_1.Observable.create(function (subscriber) {
-            if (!merged) {
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-                return;
-            }
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.protoMesh(key), true);
-            xmlHTTP.responseType = "arraybuffer";
-            xmlHTTP.timeout = 15000;
-            xmlHTTP.onload = function (pe) {
-                _this._meshRequest = null;
-                if (_this._disposed) {
-                    return;
-                }
-                var mesh = xmlHTTP.status === 200 ?
-                    Graph_1.MeshReader.read(new Buffer(xmlHTTP.response)) :
-                    { faces: [], vertices: [] };
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: mesh });
-                subscriber.complete();
-            };
-            xmlHTTP.onprogress = function (pe) {
-                if (_this._disposed) {
-                    return;
-                }
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
-            };
-            xmlHTTP.onerror = function (e) {
-                _this._meshRequest = null;
-                console.error("Failed to cache mesh (" + key + ")");
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-            };
-            xmlHTTP.ontimeout = function (e) {
-                _this._meshRequest = null;
-                console.error("Mesh request timed out (" + key + ")");
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-            };
-            xmlHTTP.onabort = function (e) {
-                _this._meshRequest = null;
-                subscriber.error(new Error("Mesh request was aborted (" + key + ")"));
-            };
-            _this._meshRequest = xmlHTTP;
-            xmlHTTP.send(null);
-        });
-    };
-    /**
-     * Create a load status object with an empty mesh.
-     *
-     * @returns {ILoadStatusObject<IMesh>} Load status object
-     * with empty mesh.
-     */
-    NodeCache.prototype._createEmptyMeshLoadStatus = function () {
-        return {
-            loaded: { loaded: 0, total: 0 },
-            object: { faces: [], vertices: [] },
-        };
-    };
-    NodeCache.prototype._disposeImage = function () {
-        if (this._image != null) {
-            window.URL.revokeObjectURL(this._image.src);
-        }
-        this._image = null;
-    };
-    return NodeCache;
-}());
-exports.NodeCache = NodeCache;
-exports.default = NodeCache;
-
-}).call(this,require("buffer").Buffer)
-
-},{"../Graph":295,"../Utils":301,"buffer":6,"rxjs":43,"rxjs/operators":241}],432:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Sequence = void 0;
-/**
- * @class Sequence
- *
- * @classdesc Represents a sequence of ordered nodes.
- */
-var Sequence = /** @class */ (function () {
-    /**
-     * Create a new sequene instance.
-     *
-     * @param {ISequence} sequence - Raw sequence data.
-     */
-    function Sequence(sequence) {
-        this._key = sequence.key;
-        this._keys = sequence.keys;
-    }
-    Object.defineProperty(Sequence.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {string} Unique sequence key.
-         */
-        get: function () {
-            return this._key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Sequence.prototype, "keys", {
-        /**
-         * Get keys.
-         *
-         * @returns {Array<string>} Array of ordered node keys in the sequence.
-         */
-        get: function () {
-            return this._keys;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Dispose the sequence.
-     *
-     * @description Disposes all cached assets.
-     */
-    Sequence.prototype.dispose = function () {
-        this._key = null;
-        this._keys = null;
-    };
-    /**
-     * Find the next node key in the sequence with respect to
-     * the provided node key.
-     *
-     * @param {string} key - Reference node key.
-     * @returns {string} Next key in sequence if it exists, null otherwise.
-     */
-    Sequence.prototype.findNextKey = function (key) {
-        var i = this._keys.indexOf(key);
-        if ((i + 1) >= this._keys.length || i === -1) {
-            return null;
-        }
-        else {
-            return this._keys[i + 1];
-        }
-    };
-    /**
-     * Find the previous node key in the sequence with respect to
-     * the provided node key.
-     *
-     * @param {string} key - Reference node key.
-     * @returns {string} Previous key in sequence if it exists, null otherwise.
-     */
-    Sequence.prototype.findPrevKey = function (key) {
-        var i = this._keys.indexOf(key);
-        if (i === 0 || i === -1) {
-            return null;
-        }
-        else {
-            return this._keys[i - 1];
-        }
-    };
-    return Sequence;
-}());
-exports.Sequence = Sequence;
-exports.default = Sequence;
-
-},{}],433:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EdgeCalculator = void 0;
-var THREE = require("three");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-/**
- * @class EdgeCalculator
- *
- * @classdesc Represents a class for calculating node edges.
- */
-var EdgeCalculator = /** @class */ (function () {
-    /**
-     * Create a new edge calculator instance.
-     *
-     * @param {EdgeCalculatorSettings} settings - Settings struct.
-     * @param {EdgeCalculatorDirections} directions - Directions struct.
-     * @param {EdgeCalculatorCoefficients} coefficients - Coefficients struct.
-     */
-    function EdgeCalculator(settings, directions, coefficients) {
-        this._spatial = new Geo_1.Spatial();
-        this._geoCoords = new Geo_1.GeoCoords();
-        this._settings = settings != null ? settings : new Edge_1.EdgeCalculatorSettings();
-        this._directions = directions != null ? directions : new Edge_1.EdgeCalculatorDirections();
-        this._coefficients = coefficients != null ? coefficients : new Edge_1.EdgeCalculatorCoefficients();
-    }
-    /**
-     * Returns the potential edges to destination nodes for a set
-     * of nodes with respect to a source node.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<Node>} nodes - Potential destination nodes.
-     * @param {Array<string>} fallbackKeys - Keys for destination nodes that should
-     * be returned even if they do not meet the criteria for a potential edge.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.getPotentialEdges = function (node, potentialNodes, fallbackKeys) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (!node.merged) {
-            return [];
-        }
-        var currentDirection = this._spatial.viewingDirection(node.rotation);
-        var currentVerticalDirection = this._spatial.angleToPlane(currentDirection.toArray(), [0, 0, 1]);
-        var potentialEdges = [];
-        for (var _i = 0, potentialNodes_1 = potentialNodes; _i < potentialNodes_1.length; _i++) {
-            var potential = potentialNodes_1[_i];
-            if (!potential.merged ||
-                potential.key === node.key) {
-                continue;
-            }
-            var enu = this._geoCoords.geodeticToEnu(potential.latLon.lat, potential.latLon.lon, potential.alt, node.latLon.lat, node.latLon.lon, node.alt);
-            var motion = new THREE.Vector3(enu[0], enu[1], enu[2]);
-            var distance = motion.length();
-            if (distance > this._settings.maxDistance &&
-                fallbackKeys.indexOf(potential.key) < 0) {
-                continue;
-            }
-            var motionChange = this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, motion.x, motion.y);
-            var verticalMotion = this._spatial.angleToPlane(motion.toArray(), [0, 0, 1]);
-            var direction = this._spatial.viewingDirection(potential.rotation);
-            var directionChange = this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
-            var verticalDirection = this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-            var verticalDirectionChange = verticalDirection - currentVerticalDirection;
-            var rotation = this._spatial.relativeRotationAngle(node.rotation, potential.rotation);
-            var worldMotionAzimuth = this._spatial.angleBetweenVector2(1, 0, motion.x, motion.y);
-            var sameSequence = potential.sequenceKey != null &&
-                node.sequenceKey != null &&
-                potential.sequenceKey === node.sequenceKey;
-            var sameMergeCC = (potential.mergeCC == null && node.mergeCC == null) ||
-                potential.mergeCC === node.mergeCC;
-            var sameUser = potential.userKey === node.userKey;
-            var potentialEdge = {
-                capturedAt: potential.capturedAt,
-                croppedPano: potential.pano && !potential.fullPano,
-                directionChange: directionChange,
-                distance: distance,
-                fullPano: potential.fullPano,
-                key: potential.key,
-                motionChange: motionChange,
-                rotation: rotation,
-                sameMergeCC: sameMergeCC,
-                sameSequence: sameSequence,
-                sameUser: sameUser,
-                sequenceKey: potential.sequenceKey,
-                verticalDirectionChange: verticalDirectionChange,
-                verticalMotion: verticalMotion,
-                worldMotionAzimuth: worldMotionAzimuth,
-            };
-            potentialEdges.push(potentialEdge);
-        }
-        return potentialEdges;
-    };
-    /**
-     * Computes the sequence edges for a node.
-     *
-     * @param {Node} node - Source node.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeSequenceEdges = function (node, sequence) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (node.sequenceKey !== sequence.key) {
-            throw new Error_1.ArgumentMapillaryError("Node and sequence does not correspond.");
-        }
-        var edges = [];
-        var nextKey = sequence.findNextKey(node.key);
-        if (nextKey != null) {
-            edges.push({
-                data: {
-                    direction: Edge_1.EdgeDirection.Next,
-                    worldMotionAzimuth: Number.NaN,
-                },
-                from: node.key,
-                to: nextKey,
-            });
-        }
-        var prevKey = sequence.findPrevKey(node.key);
-        if (prevKey != null) {
-            edges.push({
-                data: {
-                    direction: Edge_1.EdgeDirection.Prev,
-                    worldMotionAzimuth: Number.NaN,
-                },
-                from: node.key,
-                to: prevKey,
-            });
-        }
-        return edges;
-    };
-    /**
-     * Computes the similar edges for a node.
-     *
-     * @description Similar edges for perspective images and cropped panoramas
-     * look roughly in the same direction and are positioned closed to the node.
-     * Similar edges for full panoramas only target other full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeSimilarEdges = function (node, potentialEdges) {
-        var _this = this;
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var nodeFullPano = node.fullPano;
-        var sequenceGroups = {};
-        for (var _i = 0, potentialEdges_1 = potentialEdges; _i < potentialEdges_1.length; _i++) {
-            var potentialEdge = potentialEdges_1[_i];
-            if (potentialEdge.sequenceKey == null) {
-                continue;
-            }
-            if (potentialEdge.sameSequence) {
-                continue;
-            }
-            if (nodeFullPano) {
-                if (!potentialEdge.fullPano) {
-                    continue;
-                }
-            }
-            else {
-                if (!potentialEdge.fullPano &&
-                    Math.abs(potentialEdge.directionChange) > this._settings.similarMaxDirectionChange) {
-                    continue;
-                }
-            }
-            if (potentialEdge.distance > this._settings.similarMaxDistance) {
-                continue;
-            }
-            if (potentialEdge.sameUser &&
-                Math.abs(potentialEdge.capturedAt - node.capturedAt) <
-                    this._settings.similarMinTimeDifference) {
-                continue;
-            }
-            if (sequenceGroups[potentialEdge.sequenceKey] == null) {
-                sequenceGroups[potentialEdge.sequenceKey] = [];
-            }
-            sequenceGroups[potentialEdge.sequenceKey].push(potentialEdge);
-        }
-        var similarEdges = [];
-        var calculateScore = node.fullPano ?
-            function (potentialEdge) {
-                return potentialEdge.distance;
-            } :
-            function (potentialEdge) {
-                return _this._coefficients.similarDistance * potentialEdge.distance +
-                    _this._coefficients.similarRotation * potentialEdge.rotation;
-            };
-        for (var sequenceKey in sequenceGroups) {
-            if (!sequenceGroups.hasOwnProperty(sequenceKey)) {
-                continue;
-            }
-            var lowestScore = Number.MAX_VALUE;
-            var similarEdge = null;
-            for (var _a = 0, _b = sequenceGroups[sequenceKey]; _a < _b.length; _a++) {
-                var potentialEdge = _b[_a];
-                var score = calculateScore(potentialEdge);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    similarEdge = potentialEdge;
-                }
-            }
-            if (similarEdge == null) {
-                continue;
-            }
-            similarEdges.push(similarEdge);
-        }
-        return similarEdges
-            .map(function (potentialEdge) {
-            return {
-                data: {
-                    direction: Edge_1.EdgeDirection.Similar,
-                    worldMotionAzimuth: potentialEdge.worldMotionAzimuth,
-                },
-                from: node.key,
-                to: potentialEdge.key,
-            };
-        });
-    };
-    /**
-     * Computes the step edges for a perspective node.
-     *
-     * @description Step edge targets can only be other perspective nodes.
-     * Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @param {string} prevKey - Key of previous node in sequence.
-     * @param {string} prevKey - Key of next node in sequence.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeStepEdges = function (node, potentialEdges, prevKey, nextKey) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var edges = [];
-        if (node.pano) {
-            return edges;
-        }
-        for (var k in this._directions.steps) {
-            if (!this._directions.steps.hasOwnProperty(k)) {
-                continue;
-            }
-            var step = this._directions.steps[k];
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            var fallback = null;
-            for (var _i = 0, potentialEdges_2 = potentialEdges; _i < potentialEdges_2.length; _i++) {
-                var potential = potentialEdges_2[_i];
-                if (potential.croppedPano || potential.fullPano) {
-                    continue;
-                }
-                if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) {
-                    continue;
-                }
-                var motionDifference = this._spatial.angleDifference(step.motionChange, potential.motionChange);
-                var directionMotionDifference = this._spatial.angleDifference(potential.directionChange, motionDifference);
-                var drift = Math.max(Math.abs(motionDifference), Math.abs(directionMotionDifference));
-                if (Math.abs(drift) > this._settings.stepMaxDrift) {
-                    continue;
-                }
-                var potentialKey = potential.key;
-                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {
-                    fallback = potential;
-                }
-                if (potential.distance > this._settings.stepMaxDistance) {
-                    continue;
-                }
-                motionDifference = Math.sqrt(motionDifference * motionDifference +
-                    potential.verticalMotion * potential.verticalMotion);
-                var score = this._coefficients.stepPreferredDistance *
-                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /
-                    this._settings.stepMaxDistance +
-                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +
-                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +
-                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            edge = edge == null ? fallback : edge;
-            if (edge != null) {
-                edges.push({
-                    data: {
-                        direction: step.direction,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-        }
-        return edges;
-    };
-    /**
-     * Computes the turn edges for a perspective node.
-     *
-     * @description Turn edge targets can only be other perspective images.
-     * Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeTurnEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var edges = [];
-        if (node.pano) {
-            return edges;
-        }
-        for (var k in this._directions.turns) {
-            if (!this._directions.turns.hasOwnProperty(k)) {
-                continue;
-            }
-            var turn = this._directions.turns[k];
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) {
-                var potential = potentialEdges_3[_i];
-                if (potential.croppedPano || potential.fullPano) {
-                    continue;
-                }
-                if (potential.distance > this._settings.turnMaxDistance) {
-                    continue;
-                }
-                var rig = turn.direction !== Edge_1.EdgeDirection.TurnU &&
-                    potential.distance < this._settings.turnMaxRigDistance &&
-                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;
-                var directionDifference = this._spatial.angleDifference(turn.directionChange, potential.directionChange);
-                var score = void 0;
-                if (rig &&
-                    potential.directionChange * turn.directionChange > 0 &&
-                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {
-                    score = -Math.PI / 2 + Math.abs(potential.directionChange);
-                }
-                else {
-                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {
-                        continue;
-                    }
-                    var motionDifference = turn.motionChange ?
-                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;
-                    motionDifference = Math.sqrt(motionDifference * motionDifference +
-                        potential.verticalMotion * potential.verticalMotion);
-                    score =
-                        this._coefficients.turnDistance * potential.distance /
-                            this._settings.turnMaxDistance +
-                            this._coefficients.turnMotion * motionDifference / Math.PI +
-                            this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                            this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                }
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            if (edge != null) {
-                edges.push({
-                    data: {
-                        direction: turn.direction,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-        }
-        return edges;
-    };
-    /**
-     * Computes the pano edges for a perspective node.
-     *
-     * @description Perspective to pano edge targets can only be
-     * full pano nodes. Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePerspectiveToPanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (node.pano) {
-            return [];
-        }
-        var lowestScore = Number.MAX_VALUE;
-        var edge = null;
-        for (var _i = 0, potentialEdges_4 = potentialEdges; _i < potentialEdges_4.length; _i++) {
-            var potential = potentialEdges_4[_i];
-            if (!potential.fullPano) {
-                continue;
-            }
-            var score = this._coefficients.panoPreferredDistance *
-                Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                this._settings.panoMaxDistance +
-                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +
-                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-            if (score < lowestScore) {
-                lowestScore = score;
-                edge = potential;
-            }
-        }
-        if (edge == null) {
-            return [];
-        }
-        return [
-            {
-                data: {
-                    direction: Edge_1.EdgeDirection.Pano,
-                    worldMotionAzimuth: edge.worldMotionAzimuth,
-                },
-                from: node.key,
-                to: edge.key,
-            },
-        ];
-    };
-    /**
-     * Computes the full pano and step edges for a full pano node.
-     *
-     * @description Pano to pano edge targets can only be
-     * full pano nodes. Pano to step edge targets can only be perspective
-     * nodes.
-     * Returns an empty array for cropped panoramas and perspective nodes.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (!node.fullPano) {
-            return [];
-        }
-        var panoEdges = [];
-        var potentialPanos = [];
-        var potentialSteps = [];
-        for (var _i = 0, potentialEdges_5 = potentialEdges; _i < potentialEdges_5.length; _i++) {
-            var potential = potentialEdges_5[_i];
-            if (potential.distance > this._settings.panoMaxDistance) {
-                continue;
-            }
-            if (potential.fullPano) {
-                if (potential.distance < this._settings.panoMinDistance) {
-                    continue;
-                }
-                potentialPanos.push(potential);
-            }
-            else {
-                if (potential.croppedPano) {
-                    continue;
-                }
-                for (var k in this._directions.panos) {
-                    if (!this._directions.panos.hasOwnProperty(k)) {
-                        continue;
-                    }
-                    var pano = this._directions.panos[k];
-                    var turn = this._spatial.angleDifference(potential.directionChange, potential.motionChange);
-                    var turnChange = this._spatial.angleDifference(pano.directionChange, turn);
-                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {
-                        continue;
-                    }
-                    potentialSteps.push([pano.direction, potential]);
-                    // break if step direction found
-                    break;
-                }
-            }
-        }
-        var maxRotationDifference = Math.PI / this._settings.panoMaxItems;
-        var occupiedAngles = [];
-        var stepAngles = [];
-        for (var index = 0; index < this._settings.panoMaxItems; index++) {
-            var rotation = index / this._settings.panoMaxItems * 2 * Math.PI;
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _a = 0, potentialPanos_1 = potentialPanos; _a < potentialPanos_1.length; _a++) {
-                var potential = potentialPanos_1[_a];
-                var motionDifference = this._spatial.angleDifference(rotation, potential.motionChange);
-                if (Math.abs(motionDifference) > maxRotationDifference) {
-                    continue;
-                }
-                var occupiedDifference = Number.MAX_VALUE;
-                for (var _b = 0, occupiedAngles_1 = occupiedAngles; _b < occupiedAngles_1.length; _b++) {
-                    var occupiedAngle = occupiedAngles_1[_b];
-                    var difference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));
-                    if (difference < occupiedDifference) {
-                        occupiedDifference = difference;
-                    }
-                }
-                if (occupiedDifference <= maxRotationDifference) {
-                    continue;
-                }
-                var score = this._coefficients.panoPreferredDistance *
-                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                    this._settings.panoMaxDistance +
-                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +
-                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            if (edge != null) {
-                occupiedAngles.push(edge.motionChange);
-                panoEdges.push({
-                    data: {
-                        direction: Edge_1.EdgeDirection.Pano,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-            else {
-                stepAngles.push(rotation);
-            }
-        }
-        var occupiedStepAngles = {};
-        occupiedStepAngles[Edge_1.EdgeDirection.Pano] = occupiedAngles;
-        occupiedStepAngles[Edge_1.EdgeDirection.StepForward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepLeft] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepBackward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepRight] = [];
-        for (var _c = 0, stepAngles_1 = stepAngles; _c < stepAngles_1.length; _c++) {
-            var stepAngle = stepAngles_1[_c];
-            var occupations = [];
-            for (var k in this._directions.panos) {
-                if (!this._directions.panos.hasOwnProperty(k)) {
-                    continue;
-                }
-                var pano = this._directions.panos[k];
-                var allOccupiedAngles = occupiedStepAngles[Edge_1.EdgeDirection.Pano]
-                    .concat(occupiedStepAngles[pano.direction])
-                    .concat(occupiedStepAngles[pano.prev])
-                    .concat(occupiedStepAngles[pano.next]);
-                var lowestScore = Number.MAX_VALUE;
-                var edge = null;
-                for (var _d = 0, potentialSteps_1 = potentialSteps; _d < potentialSteps_1.length; _d++) {
-                    var potential = potentialSteps_1[_d];
-                    if (potential[0] !== pano.direction) {
-                        continue;
-                    }
-                    var motionChange = this._spatial.angleDifference(stepAngle, potential[1].motionChange);
-                    if (Math.abs(motionChange) > maxRotationDifference) {
-                        continue;
-                    }
-                    var minOccupiedDifference = Number.MAX_VALUE;
-                    for (var _e = 0, allOccupiedAngles_1 = allOccupiedAngles; _e < allOccupiedAngles_1.length; _e++) {
-                        var occupiedAngle = allOccupiedAngles_1[_e];
-                        var occupiedDifference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));
-                        if (occupiedDifference < minOccupiedDifference) {
-                            minOccupiedDifference = occupiedDifference;
-                        }
-                    }
-                    if (minOccupiedDifference <= maxRotationDifference) {
-                        continue;
-                    }
-                    var score = this._coefficients.panoPreferredDistance *
-                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /
-                        this._settings.panoMaxDistance +
-                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +
-                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);
-                    if (score < lowestScore) {
-                        lowestScore = score;
-                        edge = potential;
-                    }
-                }
-                if (edge != null) {
-                    occupations.push(edge);
-                    panoEdges.push({
-                        data: {
-                            direction: edge[0],
-                            worldMotionAzimuth: edge[1].worldMotionAzimuth,
-                        },
-                        from: node.key,
-                        to: edge[1].key,
-                    });
-                }
-            }
-            for (var _f = 0, occupations_1 = occupations; _f < occupations_1.length; _f++) {
-                var occupation = occupations_1[_f];
-                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);
-            }
-        }
-        return panoEdges;
-    };
-    return EdgeCalculator;
-}());
-exports.EdgeCalculator = EdgeCalculator;
-exports.default = EdgeCalculator;
-
-},{"../../Edge":292,"../../Error":293,"../../Geo":294,"three":242}],434:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EdgeCalculatorCoefficients = void 0;
-var EdgeCalculatorCoefficients = /** @class */ (function () {
-    function EdgeCalculatorCoefficients() {
-        this.panoPreferredDistance = 2;
-        this.panoMotion = 2;
-        this.panoSequencePenalty = 1;
-        this.panoMergeCCPenalty = 4;
-        this.stepPreferredDistance = 4;
-        this.stepMotion = 3;
-        this.stepRotation = 4;
-        this.stepSequencePenalty = 2;
-        this.stepMergeCCPenalty = 6;
-        this.similarDistance = 2;
-        this.similarRotation = 3;
-        this.turnDistance = 4;
-        this.turnMotion = 2;
-        this.turnSequencePenalty = 1;
-        this.turnMergeCCPenalty = 4;
-    }
-    return EdgeCalculatorCoefficients;
-}());
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
-exports.default = EdgeCalculatorCoefficients;
-
-},{}],435:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EdgeCalculatorDirections = void 0;
-var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = /** @class */ (function () {
-    function EdgeCalculatorDirections() {
-        this.steps = {};
-        this.turns = {};
-        this.panos = {};
-        this.steps[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            motionChange: 0,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            motionChange: Math.PI,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            motionChange: Math.PI / 2,
-            useFallback: false,
-        };
-        this.steps[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            motionChange: -Math.PI / 2,
-            useFallback: false,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnLeft] = {
-            direction: Edge_1.EdgeDirection.TurnLeft,
-            directionChange: Math.PI / 2,
-            motionChange: Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnRight] = {
-            direction: Edge_1.EdgeDirection.TurnRight,
-            directionChange: -Math.PI / 2,
-            motionChange: -Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnU] = {
-            direction: Edge_1.EdgeDirection.TurnU,
-            directionChange: Math.PI,
-            motionChange: null,
-        };
-        this.panos[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            directionChange: 0,
-            next: Edge_1.EdgeDirection.StepLeft,
-            prev: Edge_1.EdgeDirection.StepRight,
-        };
-        this.panos[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            directionChange: Math.PI,
-            next: Edge_1.EdgeDirection.StepRight,
-            prev: Edge_1.EdgeDirection.StepLeft,
-        };
-        this.panos[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            directionChange: Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepBackward,
-            prev: Edge_1.EdgeDirection.StepForward,
-        };
-        this.panos[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            directionChange: -Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepForward,
-            prev: Edge_1.EdgeDirection.StepBackward,
-        };
-    }
-    return EdgeCalculatorDirections;
-}());
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
-
-},{"../../Edge":292}],436:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EdgeCalculatorSettings = void 0;
-var EdgeCalculatorSettings = /** @class */ (function () {
-    function EdgeCalculatorSettings() {
-        this.panoMinDistance = 0.1;
-        this.panoMaxDistance = 20;
-        this.panoPreferredDistance = 5;
-        this.panoMaxItems = 4;
-        this.panoMaxStepTurnChange = Math.PI / 8;
-        this.rotationMaxDistance = this.turnMaxRigDistance;
-        this.rotationMaxDirectionChange = Math.PI / 6;
-        this.rotationMaxVerticalDirectionChange = Math.PI / 8;
-        this.similarMaxDirectionChange = Math.PI / 8;
-        this.similarMaxDistance = 12;
-        this.similarMinTimeDifference = 12 * 3600 * 1000;
-        this.stepMaxDistance = 20;
-        this.stepMaxDirectionChange = Math.PI / 6;
-        this.stepMaxDrift = Math.PI / 6;
-        this.stepPreferredDistance = 4;
-        this.turnMaxDistance = 15;
-        this.turnMaxDirectionChange = 2 * Math.PI / 9;
-        this.turnMaxRigDistance = 0.65;
-        this.turnMinRigDirectionChange = Math.PI / 6;
-    }
-    Object.defineProperty(EdgeCalculatorSettings.prototype, "maxDistance", {
-        get: function () {
-            return Math.max(this.panoMaxDistance, this.similarMaxDistance, this.stepMaxDistance, this.turnMaxDistance);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return EdgeCalculatorSettings;
-}());
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
-exports.default = EdgeCalculatorSettings;
-
-},{}],437:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EdgeDirection = void 0;
-/**
- * Enumeration for edge directions
- * @enum {number}
- * @readonly
- * @description Directions for edges in node graph describing
- * sequence, spatial and node type relations between nodes.
- */
-var EdgeDirection;
-(function (EdgeDirection) {
-    /**
-     * Next node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Next"] = 0] = "Next";
-    /**
-     * Previous node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Prev"] = 1] = "Prev";
-    /**
-     * Step to the left keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepLeft"] = 2] = "StepLeft";
-    /**
-     * Step to the right keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepRight"] = 3] = "StepRight";
-    /**
-     * Step forward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepForward"] = 4] = "StepForward";
-    /**
-     * Step backward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepBackward"] = 5] = "StepBackward";
-    /**
-     * Turn 90 degrees counter clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnLeft"] = 6] = "TurnLeft";
-    /**
-     * Turn 90 degrees clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnRight"] = 7] = "TurnRight";
-    /**
-     * Turn 180 degrees.
-     */
-    EdgeDirection[EdgeDirection["TurnU"] = 8] = "TurnU";
-    /**
-     * Panorama in general direction.
-     */
-    EdgeDirection[EdgeDirection["Pano"] = 9] = "Pano";
-    /**
-     * Looking in roughly the same direction at rougly the same position.
-     */
-    EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
-})(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {}));
-
-},{}],438:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],439:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],440:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DOMRenderer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var rxjs_2 = require("rxjs");
-var Render_1 = require("../Render");
-var DOMRenderer = /** @class */ (function () {
-    function DOMRenderer(element, renderService, currentFrame$) {
-        this._adaptiveOperation$ = new rxjs_2.Subject();
-        this._render$ = new rxjs_2.Subject();
-        this._renderAdaptive$ = new rxjs_2.Subject();
-        this._renderService = renderService;
-        this._currentFrame$ = currentFrame$;
-        var rootNode = vd.create(vd.h("div.domRenderer", []));
-        element.appendChild(rootNode);
-        this._offset$ = this._adaptiveOperation$.pipe(operators_1.scan(function (adaptive, operation) {
-            return operation(adaptive);
-        }, {
-            elementHeight: element.offsetHeight,
-            elementWidth: element.offsetWidth,
-            imageAspect: 0,
-            renderMode: Render_1.RenderMode.Fill,
-        }), operators_1.filter(function (adaptive) {
-            return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
-        }), operators_1.map(function (adaptive) {
-            var elementAspect = adaptive.elementWidth / adaptive.elementHeight;
-            var ratio = adaptive.imageAspect / elementAspect;
-            var verticalOffset = 0;
-            var horizontalOffset = 0;
-            if (adaptive.renderMode === Render_1.RenderMode.Letterbox) {
-                if (adaptive.imageAspect > elementAspect) {
-                    verticalOffset = adaptive.elementHeight * (1 - 1 / ratio) / 2;
-                }
-                else {
-                    horizontalOffset = adaptive.elementWidth * (1 - ratio) / 2;
-                }
-            }
-            else {
-                if (adaptive.imageAspect > elementAspect) {
-                    horizontalOffset = -adaptive.elementWidth * (ratio - 1) / 2;
-                }
-                else {
-                    verticalOffset = -adaptive.elementHeight * (1 / ratio - 1) / 2;
-                }
-            }
-            return {
-                bottom: verticalOffset,
-                left: horizontalOffset,
-                right: horizontalOffset,
-                top: verticalOffset,
-            };
-        }));
-        this._currentFrame$.pipe(operators_1.filter(function (frame) {
-            return frame.state.currentNode != null;
-        }), operators_1.distinctUntilChanged(function (k1, k2) {
-            return k1 === k2;
-        }, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentTransform.basicAspect;
-        }), operators_1.map(function (aspect) {
-            return function (adaptive) {
-                adaptive.imageAspect = aspect;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-        rxjs_1.combineLatest(this._renderAdaptive$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {})), this._offset$).pipe(operators_1.map(function (vo) {
-            var vNodes = [];
-            var hashes = vo[0];
-            for (var name_1 in hashes) {
-                if (!hashes.hasOwnProperty(name_1)) {
-                    continue;
-                }
-                vNodes.push(hashes[name_1]);
-            }
-            var offset = vo[1];
-            var properties = {
-                style: {
-                    bottom: offset.bottom + "px",
-                    left: offset.left + "px",
-                    "pointer-events": "none",
-                    position: "absolute",
-                    right: offset.right + "px",
-                    top: offset.top + "px",
-                },
-            };
-            return {
-                name: "adaptiveDomRenderer",
-                vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
-            };
-        }))
-            .subscribe(this._render$);
-        this._vNode$ = this._render$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {}), operators_1.map(function (hashes) {
-            var vNodes = [];
-            for (var name_2 in hashes) {
-                if (!hashes.hasOwnProperty(name_2)) {
-                    continue;
-                }
-                vNodes.push(hashes[name_2]);
-            }
-            return vd.h("div.domRenderer", vNodes);
-        }));
-        this._vPatch$ = this._vNode$.pipe(operators_1.scan(function (nodePatch, vNode) {
-            nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
-            nodePatch.vnode = vNode;
-            return nodePatch;
-        }, { vnode: vd.h("div.domRenderer", []), vpatch: null }), operators_1.pluck("vpatch"));
-        this._element$ = this._vPatch$.pipe(operators_1.scan(function (oldElement, vPatch) {
-            return vd.patch(oldElement, vPatch);
-        }, rootNode), operators_1.publishReplay(1), operators_1.refCount());
-        this._element$.subscribe(function () { });
-        this._renderService.size$.pipe(operators_1.map(function (size) {
-            return function (adaptive) {
-                adaptive.elementWidth = size.width;
-                adaptive.elementHeight = size.height;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-        this._renderService.renderMode$.pipe(operators_1.map(function (renderMode) {
-            return function (adaptive) {
-                adaptive.renderMode = renderMode;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-    }
-    Object.defineProperty(DOMRenderer.prototype, "element$", {
-        get: function () {
-            return this._element$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "render$", {
-        get: function () {
-            return this._render$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
-        get: function () {
-            return this._renderAdaptive$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    DOMRenderer.prototype.clear = function (name) {
-        this._renderAdaptive$.next({ name: name, vnode: null });
-        this._render$.next({ name: name, vnode: null });
-    };
-    return DOMRenderer;
-}());
-exports.DOMRenderer = DOMRenderer;
-exports.default = DOMRenderer;
-
-
-},{"../Render":297,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],441:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GLRenderStage = void 0;
-var GLRenderStage;
-(function (GLRenderStage) {
-    GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
-    GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground";
-})(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
-exports.default = GLRenderStage;
-
-},{}],442:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.GLRenderer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var Render_1 = require("../Render");
-var Utils_1 = require("../Utils");
-var GLRenderer = /** @class */ (function () {
-    function GLRenderer(canvasContainer, renderService, dom) {
-        var _this = this;
-        this._renderFrame$ = new rxjs_1.Subject();
-        this._renderCameraOperation$ = new rxjs_1.Subject();
-        this._render$ = new rxjs_1.Subject();
-        this._clear$ = new rxjs_1.Subject();
-        this._renderOperation$ = new rxjs_1.Subject();
-        this._rendererOperation$ = new rxjs_1.Subject();
-        this._eraserOperation$ = new rxjs_1.Subject();
-        this._renderService = renderService;
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        this._renderer$ = this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
-            return operation(renderer);
-        }, { needsRender: false, renderer: null }), operators_1.filter(function (renderer) {
-            return !!renderer.renderer;
-        }));
-        this._renderCollection$ = this._renderOperation$.pipe(operators_1.scan(function (hashes, operation) {
-            return operation(hashes);
-        }, {}), operators_1.share());
-        this._renderCamera$ = this._renderCameraOperation$.pipe(operators_1.scan(function (rc, operation) {
-            return operation(rc);
-        }, { frameId: -1, needsRender: false, perspective: null }));
-        this._eraser$ = this._eraserOperation$.pipe(operators_1.startWith(function (eraser) {
-            return eraser;
-        }), operators_1.scan(function (eraser, operation) {
-            return operation(eraser);
-        }, { needsRender: false }));
-        rxjs_1.combineLatest(this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$).pipe(operators_1.map(function (_a) {
-            var renderer = _a[0], hashes = _a[1], rc = _a[2], eraser = _a[3];
-            var renders = Object.keys(hashes)
-                .map(function (key) {
-                return hashes[key];
-            });
-            return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
-        }), operators_1.filter(function (co) {
-            var needsRender = co.renderer.needsRender ||
-                co.camera.needsRender ||
-                co.eraser.needsRender;
-            var frameId = co.camera.frameId;
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.frameId !== frameId) {
-                    return false;
-                }
-                needsRender = needsRender || render.needsRender;
-            }
-            return needsRender;
-        }), operators_1.distinctUntilChanged(function (n1, n2) {
-            return n1 === n2;
-        }, function (co) {
-            return co.eraser.needsRender ? -1 : co.camera.frameId;
-        }))
-            .subscribe(function (co) {
-            co.renderer.needsRender = false;
-            co.camera.needsRender = false;
-            co.eraser.needsRender = false;
-            var perspectiveCamera = co.camera.perspective;
-            var backgroundRenders = [];
-            var foregroundRenders = [];
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.stage === Render_1.GLRenderStage.Background) {
-                    backgroundRenders.push(render.render);
-                }
-                else if (render.stage === Render_1.GLRenderStage.Foreground) {
-                    foregroundRenders.push(render.render);
-                }
-            }
-            var renderer = co.renderer.renderer;
-            renderer.clear();
-            for (var _b = 0, backgroundRenders_1 = backgroundRenders; _b < backgroundRenders_1.length; _b++) {
-                var render = backgroundRenders_1[_b];
-                render(perspectiveCamera, renderer);
-            }
-            renderer.clearDepth();
-            for (var _c = 0, foregroundRenders_1 = foregroundRenders; _c < foregroundRenders_1.length; _c++) {
-                var render = foregroundRenders_1[_c];
-                render(perspectiveCamera, renderer);
-            }
-        });
-        this._renderFrame$.pipe(operators_1.map(function (rc) {
-            return function (irc) {
-                irc.frameId = rc.frameId;
-                irc.perspective = rc.perspective;
-                if (rc.changed === true) {
-                    irc.needsRender = true;
-                }
-                return irc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._renderFrameSubscribe();
-        var renderHash$ = this._render$.pipe(operators_1.map(function (hash) {
-            return function (hashes) {
-                hashes[hash.name] = hash.render;
-                return hashes;
-            };
-        }));
-        var clearHash$ = this._clear$.pipe(operators_1.map(function (name) {
-            return function (hashes) {
-                delete hashes[name];
-                return hashes;
-            };
-        }));
-        rxjs_1.merge(renderHash$, clearHash$)
-            .subscribe(this._renderOperation$);
-        this._webGLRenderer$ = this._render$.pipe(operators_1.first(), operators_1.map(function (hash) {
-            var canvas = _this._dom.createElement("canvas", "mapillary-js-canvas");
-            canvas.style.position = "absolute";
-            canvas.setAttribute("tabindex", "0");
-            canvasContainer.appendChild(canvas);
-            var element = renderService.element;
-            var webGLRenderer = new THREE.WebGLRenderer({ canvas: canvas });
-            webGLRenderer.setPixelRatio(window.devicePixelRatio);
-            webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
-            webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
-            webGLRenderer.autoClear = false;
-            return webGLRenderer;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._webGLRenderer$.subscribe(function () { });
-        var createRenderer$ = this._webGLRenderer$.pipe(operators_1.first(), operators_1.map(function (webGLRenderer) {
-            return function (renderer) {
-                renderer.needsRender = true;
-                renderer.renderer = webGLRenderer;
-                return renderer;
-            };
-        }));
-        var resizeRenderer$ = this._renderService.size$.pipe(operators_1.map(function (size) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.renderer.setSize(size.width, size.height);
-                renderer.needsRender = true;
-                return renderer;
-            };
-        }));
-        var clearRenderer$ = this._clear$.pipe(operators_1.map(function (name) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.needsRender = true;
-                return renderer;
-            };
-        }));
-        rxjs_1.merge(createRenderer$, resizeRenderer$, clearRenderer$)
-            .subscribe(this._rendererOperation$);
-        var renderCollectionEmpty$ = this._renderCollection$.pipe(operators_1.filter(function (hashes) {
-            return Object.keys(hashes).length === 0;
-        }), operators_1.share());
-        renderCollectionEmpty$
-            .subscribe(function (hashes) {
-            if (_this._renderFrameSubscription == null) {
-                return;
-            }
-            _this._renderFrameSubscription.unsubscribe();
-            _this._renderFrameSubscription = null;
-            _this._renderFrameSubscribe();
-        });
-        renderCollectionEmpty$.pipe(operators_1.map(function (hashes) {
-            return function (eraser) {
-                eraser.needsRender = true;
-                return eraser;
-            };
-        }))
-            .subscribe(this._eraserOperation$);
-    }
-    Object.defineProperty(GLRenderer.prototype, "render$", {
-        get: function () {
-            return this._render$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", {
-        get: function () {
-            return this._webGLRenderer$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    GLRenderer.prototype.clear = function (name) {
-        this._clear$.next(name);
-    };
-    GLRenderer.prototype._renderFrameSubscribe = function () {
-        var _this = this;
-        this._render$.pipe(operators_1.first(), operators_1.map(function (renderHash) {
-            return function (irc) {
-                irc.needsRender = true;
-                return irc;
-            };
-        }))
-            .subscribe(function (operation) {
-            _this._renderCameraOperation$.next(operation);
-        });
-        this._renderFrameSubscription = this._render$.pipe(operators_1.first(), operators_1.mergeMap(function (hash) {
-            return _this._renderService.renderCameraFrame$;
-        }))
-            .subscribe(this._renderFrame$);
-    };
-    return GLRenderer;
-}());
-exports.GLRenderer = GLRenderer;
-exports.default = GLRenderer;
-
-
-},{"../Render":297,"../Utils":301,"rxjs":43,"rxjs/operators":241,"three":242}],443:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RenderCamera = void 0;
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var State_1 = require("../State");
-var RenderCamera = /** @class */ (function () {
-    function RenderCamera(elementWidth, elementHeight, renderMode) {
-        this._spatial = new Geo_1.Spatial();
-        this._viewportCoords = new Geo_1.ViewportCoords();
-        this._initialFov = 50;
-        this._alpha = -1;
-        this._renderMode = renderMode;
-        this._zoom = 0;
-        this._frameId = -1;
-        this._changed = false;
-        this._changedForFrame = -1;
-        this._currentNodeId = null;
-        this._previousNodeId = null;
-        this._currentPano = false;
-        this._previousPano = false;
-        this._state = null;
-        this._currentProjectedPoints = [];
-        this._previousProjectedPoints = [];
-        this._currentFov = this._initialFov;
-        this._previousFov = this._initialFov;
-        this._camera = new Geo_1.Camera();
-        this._perspective = new THREE.PerspectiveCamera(this._initialFov, this._computeAspect(elementWidth, elementHeight), 0.16, 10000);
-        this._perspective.matrixAutoUpdate = false;
-        this._rotation = { phi: 0, theta: 0 };
-    }
-    Object.defineProperty(RenderCamera.prototype, "alpha", {
-        get: function () {
-            return this._alpha;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "changed", {
-        get: function () {
-            return this._frameId === this._changedForFrame;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "perspective", {
-        get: function () {
-            return this._perspective;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "renderMode", {
-        get: function () {
-            return this._renderMode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "rotation", {
-        get: function () {
-            return this._rotation;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "zoom", {
-        get: function () {
-            return this._zoom;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    RenderCamera.prototype.getTilt = function () {
-        return 90 - this._spatial.radToDeg(this._rotation.theta);
-    };
-    RenderCamera.prototype.fovToZoom = function (fov) {
-        fov = Math.min(90, Math.max(0, fov));
-        var currentFov = this._computeCurrentFov(0);
-        var actualFov = this._alpha === 1 ?
-            currentFov :
-            this._interpolateFov(currentFov, this._computePreviousFov(0), this._alpha);
-        var y0 = Math.tan(actualFov / 2 * Math.PI / 180);
-        var y1 = Math.tan(fov / 2 * Math.PI / 180);
-        var zoom = Math.log(y0 / y1) / Math.log(2);
-        return zoom;
-    };
-    RenderCamera.prototype.setFrame = function (frame) {
-        var state = frame.state;
-        if (state.state !== this._state) {
-            this._state = state.state;
-            this._changed = true;
-        }
-        var currentNodeId = state.currentNode.key;
-        var previousNodeId = !!state.previousNode ? state.previousNode.key : null;
-        if (currentNodeId !== this._currentNodeId) {
-            this._currentNodeId = currentNodeId;
-            this._currentPano = !!state.currentTransform.gpano;
-            this._currentProjectedPoints = this._computeProjectedPoints(state.currentTransform);
-            this._changed = true;
-        }
-        if (previousNodeId !== this._previousNodeId) {
-            this._previousNodeId = previousNodeId;
-            this._previousPano = !!state.previousTransform.gpano;
-            this._previousProjectedPoints = this._computeProjectedPoints(state.previousTransform);
-            this._changed = true;
-        }
-        var zoom = state.zoom;
-        if (zoom !== this._zoom) {
-            this._zoom = zoom;
-            this._changed = true;
-        }
-        if (this._changed) {
-            this._currentFov = this._computeCurrentFov(this.zoom);
-            this._previousFov = this._computePreviousFov(this._zoom);
-        }
-        var alpha = state.alpha;
-        if (this._changed || alpha !== this._alpha) {
-            this._alpha = alpha;
-            this._perspective.fov = this._state === State_1.State.Earth ?
-                60 :
-                this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
-            this._changed = true;
-        }
-        var camera = state.camera;
-        if (this._camera.diff(camera) > 1e-9) {
-            this._camera.copy(camera);
-            this._rotation = this._computeRotation(camera);
-            this._perspective.up.copy(camera.up);
-            this._perspective.position.copy(camera.position);
-            // Workaround for shaking camera
-            this._perspective.matrixAutoUpdate = true;
-            this._perspective.lookAt(camera.lookat);
-            this._perspective.matrixAutoUpdate = false;
-            this._perspective.updateMatrix();
-            this._perspective.updateMatrixWorld(false);
-            this._changed = true;
-        }
-        if (this._changed) {
-            this._perspective.updateProjectionMatrix();
-        }
-        this._setFrameId(frame.id);
-    };
-    RenderCamera.prototype.setRenderMode = function (renderMode) {
-        this._renderMode = renderMode;
-        this._perspective.fov = this._computeFov();
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
-    };
-    RenderCamera.prototype.setSize = function (size) {
-        this._perspective.aspect = this._computeAspect(size.width, size.height);
-        this._perspective.fov = this._computeFov();
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
-    };
-    RenderCamera.prototype._computeAspect = function (elementWidth, elementHeight) {
-        return elementWidth === 0 ? 0 : elementWidth / elementHeight;
-    };
-    RenderCamera.prototype._computeCurrentFov = function (zoom) {
-        if (this._perspective.aspect === 0) {
-            return 0;
-        }
-        if (!this._currentNodeId) {
-            return this._initialFov;
-        }
-        return this._currentPano ?
-            this._yToFov(1, zoom) :
-            this._computeVerticalFov(this._currentProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
-    };
-    RenderCamera.prototype._computeFov = function () {
-        this._currentFov = this._computeCurrentFov(this._zoom);
-        this._previousFov = this._computePreviousFov(this._zoom);
-        return this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
-    };
-    RenderCamera.prototype._computePreviousFov = function (zoom) {
-        if (this._perspective.aspect === 0) {
-            return 0;
-        }
-        if (!this._currentNodeId) {
-            return this._initialFov;
-        }
-        return !this._previousNodeId ?
-            this._currentFov :
-            this._previousPano ?
-                this._yToFov(1, zoom) :
-                this._computeVerticalFov(this._previousProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
-    };
-    RenderCamera.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[0.5, 0], [1, 0]];
-        var directions = [[0.5, 0], [0, 0.5]];
-        var pointsPerLine = 100;
-        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    RenderCamera.prototype._computeRequiredVerticalFov = function (projectedPoint, zoom, aspect) {
-        var maxY = Math.max(projectedPoint[0] / aspect, projectedPoint[1]);
-        return this._yToFov(maxY, zoom);
-    };
-    RenderCamera.prototype._computeRotation = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var up = camera.up.clone();
-        var phi = this._spatial.azimuthal(direction.toArray(), up.toArray());
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    RenderCamera.prototype._computeVerticalFov = function (projectedPoints, renderMode, zoom, aspect) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._computeRequiredVerticalFov(projectedPoint, zoom, aspect);
-        });
-        var fov = renderMode === Render_1.RenderMode.Fill ?
-            Math.min.apply(Math, fovs) * 0.995 : Math.max.apply(Math, fovs);
-        return fov;
-    };
-    RenderCamera.prototype._yToFov = function (y, zoom) {
-        return 2 * Math.atan(y / Math.pow(2, zoom)) * 180 / Math.PI;
-    };
-    RenderCamera.prototype._interpolateFov = function (v1, v2, alpha) {
-        return alpha * v1 + (1 - alpha) * v2;
-    };
-    RenderCamera.prototype._setFrameId = function (frameId) {
-        this._frameId = frameId;
-        if (this._changed) {
-            this._changed = false;
-            this._changedForFrame = frameId;
-        }
-    };
-    return RenderCamera;
-}());
-exports.RenderCamera = RenderCamera;
-exports.default = RenderCamera;
-
-},{"../Geo":294,"../Render":297,"../State":298,"three":242}],444:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RenderMode = void 0;
-/**
- * Enumeration for render mode
- * @enum {number}
- * @readonly
- * @description Modes for specifying how rendering is done
- * in the viewer. All modes preserves the original aspect
- * ratio of the images.
- */
-var RenderMode;
-(function (RenderMode) {
-    /**
-     * Displays all content within the viewer.
-     *
-     * @description Black bars shown on both
-     * sides of the content. Bars are shown
-     * either below and above or to the left
-     * and right of the content depending on
-     * the aspect ratio relation between the
-     * image and the viewer.
-     */
-    RenderMode[RenderMode["Letterbox"] = 0] = "Letterbox";
-    /**
-     * Fills the viewer by cropping content.
-     *
-     * @description Cropping is done either
-     * in horizontal or vertical direction
-     * depending on the aspect ratio relation
-     * between the image and the viewer.
-     */
-    RenderMode[RenderMode["Fill"] = 1] = "Fill";
-})(RenderMode = exports.RenderMode || (exports.RenderMode = {}));
-exports.default = RenderMode;
-
-},{}],445:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RenderService = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var RenderService = /** @class */ (function () {
-    function RenderService(element, currentFrame$, renderMode, renderCamera) {
-        var _this = this;
-        this._element = element;
-        this._currentFrame$ = currentFrame$;
-        this._spatial = new Geo_1.Spatial();
-        renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill;
-        this._resize$ = new rxjs_1.Subject();
-        this._renderCameraOperation$ = new rxjs_1.Subject();
-        this._size$ =
-            new rxjs_1.BehaviorSubject({
-                height: this._element.offsetHeight,
-                width: this._element.offsetWidth,
-            });
-        this._resize$.pipe(operators_1.map(function () {
-            return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
-        }))
-            .subscribe(this._size$);
-        this._renderMode$ = new rxjs_1.BehaviorSubject(renderMode);
-        this._renderCameraHolder$ = this._renderCameraOperation$.pipe(operators_1.startWith(function (rc) {
-            return rc;
-        }), operators_1.scan(function (rc, operation) {
-            return operation(rc);
-        }, !!renderCamera ? renderCamera : new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode)), operators_1.publishReplay(1), operators_1.refCount());
-        this._renderCameraFrame$ = this._currentFrame$.pipe(operators_1.withLatestFrom(this._renderCameraHolder$), operators_1.tap(function (_a) {
-            var frame = _a[0], rc = _a[1];
-            rc.setFrame(frame);
-        }), operators_1.map(function (args) {
-            return args[1];
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._renderCamera$ = this._renderCameraFrame$.pipe(operators_1.filter(function (rc) {
-            return rc.changed;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._bearing$ = this._renderCamera$.pipe(operators_1.map(function (rc) {
-            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(rc.rotation.phi));
-            return _this._spatial.wrap(bearing, 0, 360);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._size$.pipe(operators_1.skip(1), operators_1.map(function (size) {
-            return function (rc) {
-                rc.setSize(size);
-                return rc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._renderMode$.pipe(operators_1.skip(1), operators_1.map(function (rm) {
-            return function (rc) {
-                rc.setRenderMode(rm);
-                return rc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._bearing$.subscribe(function () { });
-        this._renderCameraHolder$.subscribe(function () { });
-        this._size$.subscribe(function () { });
-        this._renderMode$.subscribe(function () { });
-        this._renderCamera$.subscribe(function () { });
-        this._renderCameraFrame$.subscribe(function () { });
-    }
-    Object.defineProperty(RenderService.prototype, "bearing$", {
-        get: function () {
-            return this._bearing$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "element", {
-        get: function () {
-            return this._element;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "resize$", {
-        get: function () {
-            return this._resize$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "size$", {
-        get: function () {
-            return this._size$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderMode$", {
-        get: function () {
-            return this._renderMode$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
-        get: function () {
-            return this._renderCameraFrame$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCamera$", {
-        get: function () {
-            return this._renderCamera$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return RenderService;
-}());
-exports.RenderService = RenderService;
-exports.default = RenderService;
-
-
-},{"../Geo":294,"../Render":297,"rxjs":43,"rxjs/operators":241}],446:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],447:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.FrameGenerator = void 0;
-var FrameGenerator = /** @class */ (function () {
-    function FrameGenerator(root) {
-        if (root.requestAnimationFrame) {
-            this._cancelAnimationFrame = root.cancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.requestAnimationFrame.bind(root);
-        }
-        else if (root.mozRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);
-        }
-        else if (root.webkitRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);
-        }
-        else if (root.msRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.msRequestAnimationFrame.bind(root);
-        }
-        else if (root.oRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.oRequestAnimationFrame.bind(root);
-        }
-        else {
-            this._cancelAnimationFrame = root.clearTimeout.bind(root);
-            this._requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };
-        }
-    }
-    Object.defineProperty(FrameGenerator.prototype, "cancelAnimationFrame", {
-        get: function () {
-            return this._cancelAnimationFrame;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", {
-        get: function () {
-            return this._requestAnimationFrame;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return FrameGenerator;
-}());
-exports.FrameGenerator = FrameGenerator;
-exports.default = FrameGenerator;
-
-},{}],448:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RotationDelta = void 0;
-var RotationDelta = /** @class */ (function () {
-    function RotationDelta(phi, theta) {
-        this._phi = phi;
-        this._theta = theta;
-    }
-    Object.defineProperty(RotationDelta.prototype, "phi", {
-        get: function () {
-            return this._phi;
-        },
-        set: function (value) {
-            this._phi = value;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "theta", {
-        get: function () {
-            return this._theta;
-        },
-        set: function (value) {
-            this._theta = value;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "isZero", {
-        get: function () {
-            return this._phi === 0 && this._theta === 0;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    RotationDelta.prototype.copy = function (delta) {
-        this._phi = delta.phi;
-        this._theta = delta.theta;
-    };
-    RotationDelta.prototype.lerp = function (other, alpha) {
-        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
-        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
-    };
-    RotationDelta.prototype.multiply = function (value) {
-        this._phi *= value;
-        this._theta *= value;
-    };
-    RotationDelta.prototype.threshold = function (value) {
-        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
-        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
-    };
-    RotationDelta.prototype.lengthSquared = function () {
-        return this._phi * this._phi + this._theta * this._theta;
-    };
-    RotationDelta.prototype.reset = function () {
-        this._phi = 0;
-        this._theta = 0;
-    };
-    return RotationDelta;
-}());
-exports.RotationDelta = RotationDelta;
-exports.default = RotationDelta;
-
-},{}],449:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.State = void 0;
-var State;
-(function (State) {
-    State[State["Earth"] = 0] = "Earth";
-    State[State["Traversing"] = 1] = "Traversing";
-    State[State["Waiting"] = 2] = "Waiting";
-    State[State["WaitingInteractively"] = 3] = "WaitingInteractively";
-})(State = exports.State || (exports.State = {}));
-exports.default = State;
-
-},{}],450:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.StateContext = void 0;
-var State_1 = require("../State");
-var Geo_1 = require("../Geo");
-var StateContext = /** @class */ (function () {
-    function StateContext(transitionMode) {
-        this._state = new State_1.TraversingState({
-            alpha: 1,
-            camera: new Geo_1.Camera(),
-            currentIndex: -1,
-            reference: { alt: 0, lat: 0, lon: 0 },
-            trajectory: [],
-            transitionMode: transitionMode == null ? State_1.TransitionMode.Default : transitionMode,
-            zoom: 0,
-        });
-    }
-    Object.defineProperty(StateContext.prototype, "state", {
-        get: function () {
-            if (this._state instanceof State_1.EarthState) {
-                return State_1.State.Earth;
-            }
-            else if (this._state instanceof State_1.TraversingState) {
-                return State_1.State.Traversing;
-            }
-            else if (this._state instanceof State_1.WaitingState) {
-                return State_1.State.Waiting;
-            }
-            else if (this._state instanceof State_1.InteractiveWaitingState) {
-                return State_1.State.WaitingInteractively;
-            }
-            throw new Error("Invalid state");
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "reference", {
-        get: function () {
-            return this._state.reference;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "alpha", {
-        get: function () {
-            return this._state.alpha;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "camera", {
-        get: function () {
-            return this._state.camera;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "zoom", {
-        get: function () {
-            return this._state.zoom;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentNode", {
-        get: function () {
-            return this._state.currentNode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousNode", {
-        get: function () {
-            return this._state.previousNode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentCamera", {
-        get: function () {
-            return this._state.currentCamera;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentTransform", {
-        get: function () {
-            return this._state.currentTransform;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousTransform", {
-        get: function () {
-            return this._state.previousTransform;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "trajectory", {
-        get: function () {
-            return this._state.trajectory;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentIndex", {
-        get: function () {
-            return this._state.currentIndex;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "lastNode", {
-        get: function () {
-            return this._state.trajectory[this._state.trajectory.length - 1];
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "nodesAhead", {
-        get: function () {
-            return this._state.trajectory.length - 1 - this._state.currentIndex;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "motionless", {
-        get: function () {
-            return this._state.motionless;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    StateContext.prototype.earth = function () {
-        this._state = this._state.earth();
-    };
-    StateContext.prototype.traverse = function () {
-        this._state = this._state.traverse();
-    };
-    StateContext.prototype.wait = function () {
-        this._state = this._state.wait();
-    };
-    StateContext.prototype.waitInteractively = function () {
-        this._state = this._state.waitInteractively();
-    };
-    StateContext.prototype.getCenter = function () {
-        return this._state.getCenter();
-    };
-    StateContext.prototype.setCenter = function (center) {
-        this._state.setCenter(center);
-    };
-    StateContext.prototype.setZoom = function (zoom) {
-        this._state.setZoom(zoom);
-    };
-    StateContext.prototype.update = function (fps) {
-        this._state.update(fps);
-    };
-    StateContext.prototype.append = function (nodes) {
-        this._state.append(nodes);
-    };
-    StateContext.prototype.prepend = function (nodes) {
-        this._state.prepend(nodes);
-    };
-    StateContext.prototype.remove = function (n) {
-        this._state.remove(n);
-    };
-    StateContext.prototype.clear = function () {
-        this._state.clear();
-    };
-    StateContext.prototype.clearPrior = function () {
-        this._state.clearPrior();
-    };
-    StateContext.prototype.cut = function () {
-        this._state.cut();
-    };
-    StateContext.prototype.set = function (nodes) {
-        this._state.set(nodes);
-    };
-    StateContext.prototype.rotate = function (delta) {
-        this._state.rotate(delta);
-    };
-    StateContext.prototype.rotateUnbounded = function (delta) {
-        this._state.rotateUnbounded(delta);
-    };
-    StateContext.prototype.rotateWithoutInertia = function (delta) {
-        this._state.rotateWithoutInertia(delta);
-    };
-    StateContext.prototype.rotateBasic = function (basicRotation) {
-        this._state.rotateBasic(basicRotation);
-    };
-    StateContext.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._state.rotateBasicUnbounded(basicRotation);
-    };
-    StateContext.prototype.rotateBasicWithoutInertia = function (basicRotation) {
-        this._state.rotateBasicWithoutInertia(basicRotation);
-    };
-    StateContext.prototype.rotateToBasic = function (basic) {
-        this._state.rotateToBasic(basic);
-    };
-    StateContext.prototype.move = function (delta) {
-        this._state.move(delta);
-    };
-    StateContext.prototype.moveTo = function (delta) {
-        this._state.moveTo(delta);
-    };
-    StateContext.prototype.zoomIn = function (delta, reference) {
-        this._state.zoomIn(delta, reference);
-    };
-    StateContext.prototype.setSpeed = function (speed) {
-        this._state.setSpeed(speed);
-    };
-    StateContext.prototype.setTransitionMode = function (mode) {
-        this._state.setTransitionMode(mode);
-    };
-    StateContext.prototype.dolly = function (delta) {
-        this._state.dolly(delta);
-    };
-    StateContext.prototype.orbit = function (rotation) {
-        this._state.orbit(rotation);
-    };
-    StateContext.prototype.truck = function (direction) {
-        this._state.truck(direction);
-    };
-    return StateContext;
-}());
-exports.StateContext = StateContext;
-
-},{"../Geo":294,"../State":298}],451:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.StateService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var State_1 = require("../State");
-var StateService = /** @class */ (function () {
-    function StateService(transitionMode) {
-        var _this = this;
-        this._appendNode$ = new rxjs_1.Subject();
-        this._start$ = new rxjs_1.Subject();
-        this._frame$ = new rxjs_1.Subject();
-        this._fpsSampleRate = 30;
-        this._contextOperation$ = new rxjs_1.BehaviorSubject(function (context) {
-            return context;
-        });
-        this._context$ = this._contextOperation$.pipe(operators_1.scan(function (context, operation) {
-            return operation(context);
-        }, new State_1.StateContext(transitionMode)), operators_1.publishReplay(1), operators_1.refCount());
-        this._state$ = this._context$.pipe(operators_1.map(function (context) {
-            return context.state;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._fps$ = this._start$.pipe(operators_1.switchMap(function () {
-            return _this._frame$.pipe(operators_1.bufferCount(1, _this._fpsSampleRate), operators_1.map(function (frameIds) {
-                return new Date().getTime();
-            }), operators_1.pairwise(), operators_1.map(function (times) {
-                return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
-            }), operators_1.startWith(60));
-        }), operators_1.share());
-        this._currentState$ = this._frame$.pipe(operators_1.withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
-            return [frameId, fps, context];
-        }), operators_1.filter(function (fc) {
-            return fc[2].currentNode != null;
-        }), operators_1.tap(function (fc) {
-            fc[2].update(fc[1]);
-        }), operators_1.map(function (fc) {
-            return { fps: fc[1], id: fc[0], state: fc[2] };
-        }), operators_1.share());
-        this._lastState$ = this._currentState$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        var nodeChanged$ = this._currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (f) {
-            return f.state.currentNode.key;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var nodeChangedSubject$ = new rxjs_1.Subject();
-        nodeChanged$
-            .subscribe(nodeChangedSubject$);
-        this._currentKey$ = new rxjs_1.BehaviorSubject(null);
-        nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode.key;
-        }))
-            .subscribe(this._currentKey$);
-        this._currentNode$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentCamera$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentCamera;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentTransform$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentTransform;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._reference$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.reference;
-        }), operators_1.distinctUntilChanged(function (r1, r2) {
-            return r1.lat === r2.lat && r1.lon === r2.lon;
-        }, function (reference) {
-            return { lat: reference.lat, lon: reference.lon };
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentNodeExternal$ = nodeChanged$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._appendNode$.pipe(operators_1.map(function (node) {
-            return function (context) {
-                context.append([node]);
-                return context;
-            };
-        }))
-            .subscribe(this._contextOperation$);
-        this._inMotionOperation$ = new rxjs_1.Subject();
-        nodeChanged$.pipe(operators_1.map(function (frame) {
-            return true;
-        }))
-            .subscribe(this._inMotionOperation$);
-        this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (moving) {
-            return moving;
-        }), operators_1.switchMap(function (moving) {
-            return _this._currentState$.pipe(operators_1.filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            }), operators_1.map(function (frame) {
-                return [frame.state.camera.clone(), frame.state.zoom];
-            }), operators_1.pairwise(), operators_1.map(function (pair) {
-                var c1 = pair[0][0];
-                var c2 = pair[1][0];
-                var z1 = pair[0][1];
-                var z2 = pair[1][1];
-                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;
-            }), operators_1.first(function (changed) {
-                return !changed;
-            }));
-        }))
-            .subscribe(this._inMotionOperation$);
-        this._inMotion$ = this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._inTranslationOperation$ = new rxjs_1.Subject();
-        nodeChanged$.pipe(operators_1.map(function (frame) {
-            return true;
-        }))
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (inTranslation) {
-            return inTranslation;
-        }), operators_1.switchMap(function (inTranslation) {
-            return _this._currentState$.pipe(operators_1.filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            }), operators_1.map(function (frame) {
-                return frame.state.camera.position.clone();
-            }), operators_1.pairwise(), operators_1.map(function (pair) {
-                return pair[0].distanceToSquared(pair[1]) !== 0;
-            }), operators_1.first(function (changed) {
-                return !changed;
-            }));
-        }))
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslation$ = this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._state$.subscribe(function () { });
-        this._currentNode$.subscribe(function () { });
-        this._currentCamera$.subscribe(function () { });
-        this._currentTransform$.subscribe(function () { });
-        this._reference$.subscribe(function () { });
-        this._currentNodeExternal$.subscribe(function () { });
-        this._lastState$.subscribe(function () { });
-        this._inMotion$.subscribe(function () { });
-        this._inTranslation$.subscribe(function () { });
-        this._frameId = null;
-        this._frameGenerator = new State_1.FrameGenerator(window);
-    }
-    Object.defineProperty(StateService.prototype, "currentState$", {
-        get: function () {
-            return this._currentState$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNode$", {
-        get: function () {
-            return this._currentNode$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentKey$", {
-        get: function () {
-            return this._currentKey$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
-        get: function () {
-            return this._currentNodeExternal$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentCamera$", {
-        get: function () {
-            return this._currentCamera$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentTransform$", {
-        get: function () {
-            return this._currentTransform$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "state$", {
-        get: function () {
-            return this._state$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "reference$", {
-        get: function () {
-            return this._reference$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inMotion$", {
-        get: function () {
-            return this._inMotion$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inTranslation$", {
-        get: function () {
-            return this._inTranslation$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "appendNode$", {
-        get: function () {
-            return this._appendNode$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    StateService.prototype.earth = function () {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.earth(); });
-    };
-    StateService.prototype.traverse = function () {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.traverse(); });
-    };
-    StateService.prototype.wait = function () {
-        this._invokeContextOperation(function (context) { context.wait(); });
-    };
-    StateService.prototype.waitInteractively = function () {
-        this._invokeContextOperation(function (context) { context.waitInteractively(); });
-    };
-    StateService.prototype.appendNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.append(nodes); });
-    };
-    StateService.prototype.prependNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.prepend(nodes); });
-    };
-    StateService.prototype.removeNodes = function (n) {
-        this._invokeContextOperation(function (context) { context.remove(n); });
-    };
-    StateService.prototype.clearNodes = function () {
-        this._invokeContextOperation(function (context) { context.clear(); });
-    };
-    StateService.prototype.clearPriorNodes = function () {
-        this._invokeContextOperation(function (context) { context.clearPrior(); });
-    };
-    StateService.prototype.cutNodes = function () {
-        this._invokeContextOperation(function (context) { context.cut(); });
-    };
-    StateService.prototype.setNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.set(nodes); });
-    };
-    StateService.prototype.rotate = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotate(delta); });
-    };
-    StateService.prototype.rotateUnbounded = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateUnbounded(delta); });
-    };
-    StateService.prototype.rotateWithoutInertia = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateWithoutInertia(delta); });
-    };
-    StateService.prototype.rotateBasic = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
-    };
-    StateService.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); });
-    };
-    StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); });
-    };
-    StateService.prototype.rotateToBasic = function (basic) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
-    };
-    StateService.prototype.move = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.move(delta); });
-    };
-    StateService.prototype.moveTo = function (position) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.moveTo(position); });
-    };
-    StateService.prototype.dolly = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.dolly(delta); });
-    };
-    StateService.prototype.orbit = function (rotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.orbit(rotation); });
-    };
-    StateService.prototype.truck = function (direction) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.truck(direction); });
-    };
-    /**
-     * Change zoom level while keeping the reference point position approximately static.
-     *
-     * @parameter {number} delta - Change in zoom level.
-     * @parameter {Array<number>} reference - Reference point in basic coordinates.
-     */
-    StateService.prototype.zoomIn = function (delta, reference) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
-    };
-    StateService.prototype.getCenter = function () {
-        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.getCenter();
-        }));
-    };
-    StateService.prototype.getZoom = function () {
-        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.zoom;
-        }));
-    };
-    StateService.prototype.setCenter = function (center) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setCenter(center); });
-    };
-    StateService.prototype.setSpeed = function (speed) {
-        this._invokeContextOperation(function (context) { context.setSpeed(speed); });
-    };
-    StateService.prototype.setTransitionMode = function (mode) {
-        this._invokeContextOperation(function (context) { context.setTransitionMode(mode); });
-    };
-    StateService.prototype.setZoom = function (zoom) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
-    };
-    StateService.prototype.start = function () {
-        if (this._frameId == null) {
-            this._start$.next(null);
-            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-            this._frame$.next(this._frameId);
-        }
-    };
-    StateService.prototype.stop = function () {
-        if (this._frameId != null) {
-            this._frameGenerator.cancelAnimationFrame(this._frameId);
-            this._frameId = null;
-        }
-    };
-    StateService.prototype._invokeContextOperation = function (action) {
-        this._contextOperation$
-            .next(function (context) {
-            action(context);
-            return context;
-        });
-    };
-    StateService.prototype._frame = function (time) {
-        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-        this._frame$.next(this._frameId);
-    };
-    return StateService;
-}());
-exports.StateService = StateService;
-
-},{"../State":298,"rxjs":43,"rxjs/operators":241}],452:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TransitionMode = void 0;
-/**
- * Enumeration for transition mode
- * @enum {number}
- * @readonly
- * @description Modes for specifying how transitions
- * between nodes are performed.
- */
-var TransitionMode;
-(function (TransitionMode) {
-    /**
-     * Default transitions.
-     *
-     * @description The viewer dynamically determines
-     * whether transitions should be performed with or
-     * without motion and blending for each transition
-     * based on the underlying data.
-     */
-    TransitionMode[TransitionMode["Default"] = 0] = "Default";
-    /**
-     * Instantaneous transitions.
-     *
-     * @description All transitions are performed
-     * without motion or blending.
-     */
-    TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous";
-})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {}));
-exports.default = TransitionMode;
-
-},{}],453:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],454:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EarthState = void 0;
-var THREE = require("three");
-var State_1 = require("../../State");
-var EarthState = /** @class */ (function (_super) {
-    __extends(EarthState, _super);
-    function EarthState(state) {
-        var _this = _super.call(this, state) || this;
-        var viewingDirection = _this._camera.lookat
-            .clone()
-            .sub(_this._camera.position)
-            .normalize();
-        _this._camera.lookat.copy(_this._camera.position);
-        _this._camera.position.z = state.camera.position.z + 20;
-        _this._camera.position.x = state.camera.position.x - 16 * viewingDirection.x;
-        _this._camera.position.y = state.camera.position.y - 16 * viewingDirection.y;
-        _this._camera.up.set(0, 0, 1);
-        return _this;
-    }
-    EarthState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    EarthState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    EarthState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    EarthState.prototype.dolly = function (delta) {
-        var camera = this._camera;
-        var offset = new THREE.Vector3()
-            .copy(camera.position)
-            .sub(camera.lookat);
-        var length = offset.length();
-        var scaled = length * Math.pow(2, -delta);
-        var clipped = Math.max(1, Math.min(scaled, 1000));
-        offset.normalize();
-        offset.multiplyScalar(clipped);
-        camera.position.copy(camera.lookat).add(offset);
-    };
-    EarthState.prototype.orbit = function (rotation) {
-        var camera = this._camera;
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.position).sub(camera.lookat);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += rotation.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += rotation.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.position.copy(camera.lookat).add(offset.multiplyScalar(length));
-    };
-    EarthState.prototype.truck = function (direction) {
-        this._camera.position.add(new THREE.Vector3().fromArray(direction));
-        this._camera.lookat.add(new THREE.Vector3().fromArray(direction));
-    };
-    EarthState.prototype.update = function () { };
-    return EarthState;
-}(State_1.StateBase));
-exports.EarthState = EarthState;
-exports.default = EarthState;
-
-
-},{"../../State":298,"three":242}],455:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.InteractiveStateBase = void 0;
-var THREE = require("three");
-var State_1 = require("../../State");
-var InteractiveStateBase = /** @class */ (function (_super) {
-    __extends(InteractiveStateBase, _super);
-    function InteractiveStateBase(state) {
-        var _this = _super.call(this, state) || this;
-        _this._animationSpeed = 1 / 40;
-        _this._rotationDelta = new State_1.RotationDelta(0, 0);
-        _this._requestedRotationDelta = null;
-        _this._basicRotation = [0, 0];
-        _this._requestedBasicRotation = null;
-        _this._requestedBasicRotationUnbounded = null;
-        _this._rotationAcceleration = 0.86;
-        _this._rotationIncreaseAlpha = 0.97;
-        _this._rotationDecreaseAlpha = 0.9;
-        _this._rotationThreshold = 1e-3;
-        _this._unboundedRotationAlpha = 0.8;
-        _this._desiredZoom = state.zoom;
-        _this._minZoom = 0;
-        _this._maxZoom = 3;
-        _this._lookatDepth = 10;
-        _this._desiredLookat = null;
-        _this._desiredCenter = null;
-        return _this;
-    }
-    InteractiveStateBase.prototype.rotate = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        if (rotationDelta.phi === 0 && rotationDelta.theta === 0) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
-            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
-        }
-        else {
-            this._requestedRotationDelta = new State_1.RotationDelta(rotationDelta.phi, rotationDelta.theta);
-        }
-    };
-    InteractiveStateBase.prototype.rotateUnbounded = function (delta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._requestedBasicRotation = null;
-        this._requestedRotationDelta = null;
-        this._applyRotation(delta, this._currentCamera);
-        this._applyRotation(delta, this._previousCamera);
-        if (!this._desiredLookat) {
-            return;
-        }
-        var q = new THREE.Quaternion().setFromUnitVectors(this._currentCamera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3()
-            .copy(this._desiredLookat)
-            .sub(this._camera.position)
-            .applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += delta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += delta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        this._desiredLookat
-            .copy(this._camera.position)
-            .add(offset.multiplyScalar(length));
-    };
-    InteractiveStateBase.prototype.rotateWithoutInertia = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        this._requestedRotationDelta = null;
-        var threshold = Math.PI / (10 * Math.pow(2, this._zoom));
-        var delta = {
-            phi: this._spatial.clamp(rotationDelta.phi, -threshold, threshold),
-            theta: this._spatial.clamp(rotationDelta.theta, -threshold, threshold),
-        };
-        this._applyRotation(delta, this._currentCamera);
-        this._applyRotation(delta, this._previousCamera);
-    };
-    InteractiveStateBase.prototype.rotateBasic = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation[0] += basicRotation[0];
-            this._requestedBasicRotation[1] += basicRotation[1];
-            var threshold = 0.05 / Math.pow(2, this._zoom);
-            this._requestedBasicRotation[0] =
-                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);
-            this._requestedBasicRotation[1] =
-                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);
-        }
-        else {
-            this._requestedBasicRotation = basicRotation.slice();
-        }
-    };
-    InteractiveStateBase.prototype.rotateBasicUnbounded = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            this._requestedBasicRotationUnbounded[0] += basicRotation[0];
-            this._requestedBasicRotationUnbounded[1] += basicRotation[1];
-        }
-        else {
-            this._requestedBasicRotationUnbounded = basicRotation.slice();
-        }
-    };
-    InteractiveStateBase.prototype.rotateBasicWithoutInertia = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        var threshold = 0.05 / Math.pow(2, this._zoom);
-        var basicRotation = basic.slice();
-        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);
-        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);
-        this._applyRotationBasic(basicRotation);
-    };
-    InteractiveStateBase.prototype.rotateToBasic = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        basic[0] = this._spatial.clamp(basic[0], 0, 1);
-        basic[1] = this._spatial.clamp(basic[1], 0, 1);
-        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
-        this._currentCamera.lookat.fromArray(lookat);
-    };
-    InteractiveStateBase.prototype.zoomIn = function (delta, reference) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
-        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
-        var currentCenterX = currentCenter[0];
-        var currentCenterY = currentCenter[1];
-        var zoom0 = Math.pow(2, this._zoom);
-        var zoom1 = Math.pow(2, this._desiredZoom);
-        var refX = reference[0];
-        var refY = reference[1];
-        if (this.currentTransform.gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            if (refX - currentCenterX > 0.5) {
-                refX = refX - 1;
-            }
-            else if (currentCenterX - refX > 0.5) {
-                refX = 1 + refX;
-            }
-        }
-        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
-        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
-        var gpano = this.currentTransform.gpano;
-        if (this._currentNode.fullPano) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
-        }
-        else {
-            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
-        }
-        this._desiredLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
-    };
-    InteractiveStateBase.prototype.setCenter = function (center) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._desiredZoom = this._zoom;
-        var clamped = [
-            this._spatial.clamp(center[0], 0, 1),
-            this._spatial.clamp(center[1], 0, 1),
-        ];
-        if (this._currentNode == null) {
-            this._desiredCenter = clamped;
-            return;
-        }
-        this._desiredCenter = null;
-        var currentLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var previousLookat = new THREE.Vector3()
-            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
-        this._currentCamera.lookat.copy(currentLookat);
-        this._previousCamera.lookat.copy(previousLookat);
-    };
-    InteractiveStateBase.prototype.setZoom = function (zoom) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
-        this._desiredZoom = this._zoom;
-    };
-    InteractiveStateBase.prototype._applyRotation = function (delta, camera) {
-        if (camera == null) {
-            return;
-        }
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.lookat).sub(camera.position);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += delta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += delta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
-    };
-    InteractiveStateBase.prototype._applyRotationBasic = function (basicRotation) {
-        var currentNode = this._currentNode;
-        var previousNode = this._previousNode != null ?
-            this.previousNode :
-            this.currentNode;
-        var currentCamera = this._currentCamera;
-        var previousCamera = this._previousCamera;
-        var currentTransform = this.currentTransform;
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
-        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
-        var currentGPano = currentTransform.gpano;
-        var previousGPano = previousTransform.gpano;
-        if (currentNode.fullPano) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);
-        }
-        else if (currentGPano != null &&
-            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        else {
-            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        if (previousNode.fullPano) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);
-        }
-        else if (previousGPano != null &&
-            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);
-        }
-        else {
-            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
-        currentCamera.lookat.fromArray(currentLookat);
-        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
-        previousCamera.lookat.fromArray(previousLookat);
-    };
-    InteractiveStateBase.prototype._updateZoom = function (animationSpeed) {
-        var diff = this._desiredZoom - this._zoom;
-        var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        if (diff === 0) {
-            return;
-        }
-        else if (Math.abs(diff) < 2e-3) {
-            this._zoom = this._desiredZoom;
-            if (this._desiredLookat != null) {
-                this._desiredLookat = null;
-            }
-        }
-        else {
-            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);
-        }
-    };
-    InteractiveStateBase.prototype._updateLookat = function (animationSpeed) {
-        if (this._desiredLookat === null) {
-            return;
-        }
-        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
-        if (Math.abs(diff) < 1e-6) {
-            this._currentCamera.lookat.copy(this._desiredLookat);
-            this._desiredLookat = null;
-        }
-        else {
-            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
-        }
-    };
-    InteractiveStateBase.prototype._updateRotation = function () {
-        if (this._requestedRotationDelta != null) {
-            var length_1 = this._rotationDelta.lengthSquared();
-            var requestedLength = this._requestedRotationDelta.lengthSquared();
-            if (requestedLength > length_1) {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
-            }
-            else {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
-            }
-            this._requestedRotationDelta = null;
-            return;
-        }
-        if (this._rotationDelta.isZero) {
-            return;
-        }
-        var alpha = this.currentNode.fullPano ? 1 : this._alpha;
-        this._rotationDelta.multiply(this._rotationAcceleration * alpha);
-        this._rotationDelta.threshold(this._rotationThreshold);
-    };
-    InteractiveStateBase.prototype._updateRotationBasic = function () {
-        if (this._requestedBasicRotation != null) {
-            var x = this._basicRotation[0];
-            var y = this._basicRotation[1];
-            var reqX = this._requestedBasicRotation[0];
-            var reqY = this._requestedBasicRotation[1];
-            if (Math.abs(reqX) > Math.abs(x)) {
-                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
-            }
-            else {
-                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
-            }
-            if (Math.abs(reqY) > Math.abs(y)) {
-                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
-            }
-            else {
-                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
-            }
-            this._requestedBasicRotation = null;
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            var reqX = this._requestedBasicRotationUnbounded[0];
-            var reqY = this._requestedBasicRotationUnbounded[1];
-            if (Math.abs(reqX) > 0) {
-                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;
-            }
-            if (Math.abs(reqY) > 0) {
-                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;
-            }
-            if (this._desiredLookat != null) {
-                var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray());
-                desiredBasicLookat[0] += reqX;
-                desiredBasicLookat[1] += reqY;
-                this._desiredLookat = new THREE.Vector3()
-                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));
-            }
-            this._requestedBasicRotationUnbounded = null;
-        }
-        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
-            return;
-        }
-        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
-        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
-        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
-            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    InteractiveStateBase.prototype._clearRotation = function () {
-        if (this._currentNode.fullPano) {
-            return;
-        }
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta = null;
-        }
-        if (!this._rotationDelta.isZero) {
-            this._rotationDelta.reset();
-        }
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation = null;
-        }
-        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    InteractiveStateBase.prototype._setDesiredCenter = function () {
-        if (this._desiredCenter == null) {
-            return;
-        }
-        var lookatDirection = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
-            .sub(this._currentCamera.position);
-        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
-        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
-        this._desiredCenter = null;
-    };
-    InteractiveStateBase.prototype._setDesiredZoom = function () {
-        this._desiredZoom =
-            this._currentNode.fullPano || this._previousNode == null ?
-                this._zoom : 0;
-    };
-    return InteractiveStateBase;
-}(State_1.StateBase));
-exports.InteractiveStateBase = InteractiveStateBase;
-exports.default = InteractiveStateBase;
-
-
-},{"../../State":298,"three":242}],456:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.InteractiveWaitingState = void 0;
-var State_1 = require("../../State");
-var InteractiveWaitingState = /** @class */ (function (_super) {
-    __extends(InteractiveWaitingState, _super);
-    function InteractiveWaitingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        return _this;
-    }
-    InteractiveWaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    InteractiveWaitingState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    InteractiveWaitingState.prototype.prepend = function (nodes) {
-        _super.prototype.prepend.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    InteractiveWaitingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    InteractiveWaitingState.prototype.move = function (delta) {
-        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
-    };
-    InteractiveWaitingState.prototype.moveTo = function (position) {
-        this._alpha = Math.max(0, Math.min(1, position));
-    };
-    InteractiveWaitingState.prototype.update = function (fps) {
-        this._updateRotation();
-        if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._rotationDelta, this._previousCamera);
-            this._applyRotation(this._rotationDelta, this._currentCamera);
-        }
-        this._updateRotationBasic();
-        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic(this._basicRotation);
-        }
-        var animationSpeed = this._animationSpeed * (60 / fps);
-        this._updateZoom(animationSpeed);
-        this._updateLookat(animationSpeed);
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    InteractiveWaitingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.round(this._alpha) : this._alpha;
-    };
-    InteractiveWaitingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    InteractiveWaitingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        if (this._currentNode.fullPano) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-        if (this._previousNode.fullPano) {
-            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
-            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        }
-    };
-    return InteractiveWaitingState;
-}(State_1.InteractiveStateBase));
-exports.InteractiveWaitingState = InteractiveWaitingState;
-exports.default = InteractiveWaitingState;
-
-},{"../../State":298}],457:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.StateBase = void 0;
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var StateBase = /** @class */ (function () {
-    function StateBase(state) {
-        this._spatial = new Geo_1.Spatial();
-        this._geoCoords = new Geo_1.GeoCoords();
-        this._referenceThreshold = 0.01;
-        this._transitionMode = state.transitionMode;
-        this._reference = state.reference;
-        this._alpha = state.alpha;
-        this._camera = state.camera.clone();
-        this._zoom = state.zoom;
-        this._currentIndex = state.currentIndex;
-        this._trajectory = state.trajectory.slice();
-        this._trajectoryTransforms = [];
-        this._trajectoryCameras = [];
-        for (var _i = 0, _a = this._trajectory; _i < _a.length; _i++) {
-            var node = _a[_i];
-            var translation = this._nodeToTranslation(node, this._reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.push(transform);
-            this._trajectoryCameras.push(new Geo_1.Camera(transform));
-        }
-        this._currentNode = this._trajectory.length > 0 ?
-            this._trajectory[this._currentIndex] :
-            null;
-        this._previousNode = this._trajectory.length > 1 && this.currentIndex > 0 ?
-            this._trajectory[this._currentIndex - 1] :
-            null;
-        this._currentCamera = this._trajectoryCameras.length > 0 ?
-            this._trajectoryCameras[this._currentIndex].clone() :
-            new Geo_1.Camera();
-        this._previousCamera = this._trajectoryCameras.length > 1 && this.currentIndex > 0 ?
-            this._trajectoryCameras[this._currentIndex - 1].clone() :
-            this._currentCamera.clone();
-    }
-    Object.defineProperty(StateBase.prototype, "reference", {
-        get: function () {
-            return this._reference;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "alpha", {
-        get: function () {
-            return this._getAlpha();
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "zoom", {
-        get: function () {
-            return this._zoom;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "trajectory", {
-        get: function () {
-            return this._trajectory;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentIndex", {
-        get: function () {
-            return this._currentIndex;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentNode", {
-        get: function () {
-            return this._currentNode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousNode", {
-        get: function () {
-            return this._previousNode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentCamera", {
-        get: function () {
-            return this._currentCamera;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 0 ?
-                this._trajectoryTransforms[this.currentIndex] : null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?
-                this._trajectoryTransforms[this.currentIndex - 1] : null;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "motionless", {
-        get: function () {
-            return this._motionless;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "transitionMode", {
-        get: function () {
-            return this._transitionMode;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    StateBase.prototype.earth = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.traverse = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.wait = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.waitInteractively = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.move = function (delta) { };
-    StateBase.prototype.moveTo = function (position) { };
-    StateBase.prototype.rotate = function (delta) { };
-    StateBase.prototype.rotateUnbounded = function (delta) { };
-    StateBase.prototype.rotateWithoutInertia = function (delta) { };
-    StateBase.prototype.rotateBasic = function (basicRotation) { };
-    StateBase.prototype.rotateBasicUnbounded = function (basicRotation) { };
-    StateBase.prototype.rotateBasicWithoutInertia = function (basicRotation) { };
-    StateBase.prototype.rotateToBasic = function (basic) { };
-    StateBase.prototype.setSpeed = function (speed) { };
-    StateBase.prototype.zoomIn = function (delta, reference) { };
-    StateBase.prototype.update = function (fps) { };
-    StateBase.prototype.setCenter = function (center) { };
-    StateBase.prototype.setZoom = function (zoom) { };
-    StateBase.prototype.dolly = function (delta) { };
-    StateBase.prototype.orbit = function (rotation) { };
-    StateBase.prototype.truck = function (direction) { };
-    StateBase.prototype.append = function (nodes) {
-        if (nodes.length < 1) {
-            throw Error("Trajectory can not be empty");
-        }
-        if (this._currentIndex < 0) {
-            this.set(nodes);
-        }
-        else {
-            this._trajectory = this._trajectory.concat(nodes);
-            this._appendToTrajectories(nodes);
-        }
-    };
-    StateBase.prototype.prepend = function (nodes) {
-        if (nodes.length < 1) {
-            throw Error("Trajectory can not be empty");
-        }
-        this._trajectory = nodes.slice().concat(this._trajectory);
-        this._currentIndex += nodes.length;
-        this._setCurrentNode();
-        var referenceReset = this._setReference(this._currentNode);
-        if (referenceReset) {
-            this._setTrajectories();
-        }
-        else {
-            this._prependToTrajectories(nodes);
-        }
-        this._setCurrentCamera();
-    };
-    StateBase.prototype.remove = function (n) {
-        if (n < 0) {
-            throw Error("n must be a positive integer");
-        }
-        if (this._currentIndex - 1 < n) {
-            throw Error("Current and previous nodes can not be removed");
-        }
-        for (var i = 0; i < n; i++) {
-            this._trajectory.shift();
-            this._trajectoryTransforms.shift();
-            this._trajectoryCameras.shift();
-            this._currentIndex--;
-        }
-        this._setCurrentNode();
-    };
-    StateBase.prototype.clearPrior = function () {
-        if (this._currentIndex > 0) {
-            this.remove(this._currentIndex - 1);
-        }
-    };
-    StateBase.prototype.clear = function () {
-        this.cut();
-        if (this._currentIndex > 0) {
-            this.remove(this._currentIndex - 1);
-        }
-    };
-    StateBase.prototype.cut = function () {
-        while (this._trajectory.length - 1 > this._currentIndex) {
-            this._trajectory.pop();
-            this._trajectoryTransforms.pop();
-            this._trajectoryCameras.pop();
-        }
-    };
-    StateBase.prototype.set = function (nodes) {
-        this._setTrajectory(nodes);
-        this._setCurrentNode();
-        this._setReference(this._currentNode);
-        this._setTrajectories();
-        this._setCurrentCamera();
-    };
-    StateBase.prototype.getCenter = function () {
-        return this._currentNode != null ?
-            this.currentTransform.projectBasic(this._camera.lookat.toArray()) :
-            [0.5, 0.5];
-    };
-    StateBase.prototype.setTransitionMode = function (mode) {
-        this._transitionMode = mode;
-    };
-    StateBase.prototype._getAlpha = function () { return 1; };
-    StateBase.prototype._setCurrent = function () {
-        this._setCurrentNode();
-        var referenceReset = this._setReference(this._currentNode);
-        if (referenceReset) {
-            this._setTrajectories();
-        }
-        this._setCurrentCamera();
-    };
-    StateBase.prototype._setCurrentCamera = function () {
-        this._currentCamera = this._trajectoryCameras[this._currentIndex].clone();
-        this._previousCamera = this._currentIndex > 0 ?
-            this._trajectoryCameras[this._currentIndex - 1].clone() :
-            this._currentCamera.clone();
-    };
-    StateBase.prototype._motionlessTransition = function () {
-        var nodesSet = this._currentNode != null && this._previousNode != null;
-        return nodesSet && (this._transitionMode === State_1.TransitionMode.Instantaneous || !(this._currentNode.merged &&
-            this._previousNode.merged &&
-            this._withinOriginalDistance() &&
-            this._sameConnectedComponent()));
-    };
-    StateBase.prototype._setReference = function (node) {
-        // do not reset reference if node is within threshold distance
-        if (Math.abs(node.latLon.lat - this.reference.lat) < this._referenceThreshold &&
-            Math.abs(node.latLon.lon - this.reference.lon) < this._referenceThreshold) {
-            return false;
-        }
-        // do not reset reference if previous node exist and transition is with motion
-        if (this._previousNode != null && !this._motionlessTransition()) {
-            return false;
-        }
-        this._reference.lat = node.latLon.lat;
-        this._reference.lon = node.latLon.lon;
-        this._reference.alt = node.alt;
-        return true;
-    };
-    StateBase.prototype._setCurrentNode = function () {
-        this._currentNode = this._trajectory.length > 0 ?
-            this._trajectory[this._currentIndex] :
-            null;
-        this._previousNode = this._currentIndex > 0 ?
-            this._trajectory[this._currentIndex - 1] :
-            null;
-    };
-    StateBase.prototype._setTrajectory = function (nodes) {
-        if (nodes.length < 1) {
-            throw new Error_1.ArgumentMapillaryError("Trajectory can not be empty");
-        }
-        if (this._currentNode != null) {
-            this._trajectory = [this._currentNode].concat(nodes);
-            this._currentIndex = 1;
-        }
-        else {
-            this._trajectory = nodes.slice();
-            this._currentIndex = 0;
-        }
-    };
-    StateBase.prototype._setTrajectories = function () {
-        this._trajectoryTransforms.length = 0;
-        this._trajectoryCameras.length = 0;
-        this._appendToTrajectories(this._trajectory);
-    };
-    StateBase.prototype._appendToTrajectories = function (nodes) {
-        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-            var node = nodes_1[_i];
-            if (!node.assetsCached) {
-                throw new Error_1.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");
-            }
-            var translation = this._nodeToTranslation(node, this.reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.push(transform);
-            this._trajectoryCameras.push(new Geo_1.Camera(transform));
-        }
-    };
-    StateBase.prototype._prependToTrajectories = function (nodes) {
-        for (var _i = 0, _a = nodes.reverse(); _i < _a.length; _i++) {
-            var node = _a[_i];
-            if (!node.assetsCached) {
-                throw new Error_1.ArgumentMapillaryError("Assets must be cached when added to trajectory");
-            }
-            var translation = this._nodeToTranslation(node, this.reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.unshift(transform);
-            this._trajectoryCameras.unshift(new Geo_1.Camera(transform));
-        }
-    };
-    StateBase.prototype._nodeToTranslation = function (node, reference) {
-        return Geo_1.Geo.computeTranslation({ alt: node.alt, lat: node.latLon.lat, lon: node.latLon.lon }, node.rotation, reference);
-    };
-    StateBase.prototype._sameConnectedComponent = function () {
-        var current = this._currentNode;
-        var previous = this._previousNode;
-        return !!current && !!previous &&
-            current.mergeCC === previous.mergeCC;
-    };
-    StateBase.prototype._withinOriginalDistance = function () {
-        var current = this._currentNode;
-        var previous = this._previousNode;
-        if (!current || !previous) {
-            return true;
-        }
-        // 50 km/h moves 28m in 2s
-        var distance = this._spatial.distanceFromLatLon(current.originalLatLon.lat, current.originalLatLon.lon, previous.originalLatLon.lat, previous.originalLatLon.lon);
-        return distance < 25;
-    };
-    return StateBase;
-}());
-exports.StateBase = StateBase;
-
-},{"../../Error":293,"../../Geo":294,"../../State":298}],458:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TraversingState = void 0;
-var UnitBezier = require("@mapbox/unitbezier");
-var State_1 = require("../../State");
-var TraversingState = /** @class */ (function (_super) {
-    __extends(TraversingState, _super);
-    function TraversingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        _this._baseAlpha = _this._alpha;
-        _this._speedCoefficient = 1;
-        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        _this._useBezier = false;
-        return _this;
-    }
-    TraversingState.prototype.earth = function () {
-        return new State_1.EarthState(this);
-    };
-    TraversingState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    TraversingState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    TraversingState.prototype.append = function (nodes) {
-        var emptyTrajectory = this._trajectory.length === 0;
-        if (emptyTrajectory) {
-            this._resetTransition();
-        }
-        _super.prototype.append.call(this, nodes);
-        if (emptyTrajectory) {
-            this._setDesiredCenter();
-            this._setDesiredZoom();
-        }
-    };
-    TraversingState.prototype.prepend = function (nodes) {
-        var emptyTrajectory = this._trajectory.length === 0;
-        if (emptyTrajectory) {
-            this._resetTransition();
-        }
-        _super.prototype.prepend.call(this, nodes);
-        if (emptyTrajectory) {
-            this._setDesiredCenter();
-            this._setDesiredZoom();
-        }
-    };
-    TraversingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._desiredLookat = null;
-        this._resetTransition();
-        this._clearRotation();
-        this._setDesiredCenter();
-        this._setDesiredZoom();
-        if (this._trajectory.length < 3) {
-            this._useBezier = true;
-        }
-    };
-    TraversingState.prototype.setSpeed = function (speed) {
-        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);
-    };
-    TraversingState.prototype.update = function (fps) {
-        if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {
-            this._currentIndex += 1;
-            this._useBezier = this._trajectory.length < 3 &&
-                this._currentIndex + 1 === this._trajectory.length;
-            this._setCurrent();
-            this._resetTransition();
-            this._clearRotation();
-            this._desiredZoom = this._currentNode.fullPano ? this._zoom : 0;
-            this._desiredLookat = null;
-        }
-        var animationSpeed = this._animationSpeed * (60 / fps);
-        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);
-        if (this._useBezier) {
-            this._alpha = this._unitBezier.solve(this._baseAlpha);
-        }
-        else {
-            this._alpha = this._baseAlpha;
-        }
-        this._updateRotation();
-        if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._rotationDelta, this._previousCamera);
-            this._applyRotation(this._rotationDelta, this._currentCamera);
-        }
-        this._updateRotationBasic();
-        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic(this._basicRotation);
-        }
-        this._updateZoom(animationSpeed);
-        this._updateLookat(animationSpeed);
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    TraversingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.ceil(this._alpha) : this._alpha;
-    };
-    TraversingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    TraversingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        var lookat = this._camera.lookat.clone().sub(this._camera.position);
-        this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        if (this._currentNode.fullPano) {
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-    };
-    TraversingState.prototype._resetTransition = function () {
-        this._alpha = 0;
-        this._baseAlpha = 0;
-        this._motionless = this._motionlessTransition();
-    };
-    return TraversingState;
-}(State_1.InteractiveStateBase));
-exports.TraversingState = TraversingState;
-exports.default = TraversingState;
-
-},{"../../State":298,"@mapbox/unitbezier":2}],459:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.WaitingState = void 0;
-var State_1 = require("../../State");
-var WaitingState = /** @class */ (function (_super) {
-    __extends(WaitingState, _super);
-    function WaitingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._zoom = 0;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        return _this;
-    }
-    WaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    WaitingState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    WaitingState.prototype.prepend = function (nodes) {
-        _super.prototype.prepend.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    WaitingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    WaitingState.prototype.move = function (delta) {
-        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
-    };
-    WaitingState.prototype.moveTo = function (position) {
-        this._alpha = Math.max(0, Math.min(1, position));
-    };
-    WaitingState.prototype.update = function (fps) {
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    WaitingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.round(this._alpha) : this._alpha;
-    };
-    WaitingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    WaitingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        if (this._currentNode.fullPano) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-        if (this._previousNode.fullPano) {
-            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
-            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        }
-    };
-    return WaitingState;
-}(State_1.StateBase));
-exports.WaitingState = WaitingState;
-exports.default = WaitingState;
-
-},{"../../State":298}],460:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageTileLoader = void 0;
-var rxjs_1 = require("rxjs");
-/**
- * @class ImageTileLoader
- *
- * @classdesc Represents a loader of image tiles.
- */
-var ImageTileLoader = /** @class */ (function () {
-    /**
-     * Create a new node image tile loader instance.
-     *
-     * @param {string} scheme - The URI scheme.
-     * @param {string} host - The URI host.
-     * @param {string} [origin] - The origin query param.
-     */
-    function ImageTileLoader(scheme, host, origin) {
-        this._scheme = scheme;
-        this._host = host;
-        this._origin = origin != null ? "?origin=" + origin : "";
-    }
-    /**
-     * Retrieve an image tile.
-     *
-     * @description Retrieve an image tile by specifying the area
-     * as well as the scaled size.
-     *
-     * @param {string} identifier - The identifier of the image.
-     * @param {number} x - The top left x pixel coordinate for the tile
-     * in the original image.
-     * @param {number} y - The top left y pixel coordinate for the tile
-     * in the original image.
-     * @param {number} w - The pixel width of the tile in the original image.
-     * @param {number} h - The pixel height of the tile in the original image.
-     * @param {number} scaledW - The scaled width of the returned tile.
-     * @param {number} scaledH - The scaled height of the returned tile.
-     */
-    ImageTileLoader.prototype.getTile = function (identifier, x, y, w, h, scaledW, scaledH) {
-        var characteristics = "/" + identifier + "/" + x + "," + y + "," + w + "," + h + "/" + scaledW + "," + scaledH + "/0/default.jpg";
-        var url = this._scheme +
-            "://" +
-            this._host +
-            characteristics +
-            this._origin;
-        var xmlHTTP = null;
-        return [rxjs_1.Observable.create(function (subscriber) {
-                xmlHTTP = new XMLHttpRequest();
-                xmlHTTP.open("GET", url, true);
-                xmlHTTP.responseType = "arraybuffer";
-                xmlHTTP.timeout = 15000;
-                xmlHTTP.onload = function (event) {
-                    if (xmlHTTP.status !== 200) {
-                        subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + "). " +
-                            ("Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText)));
-                        return;
-                    }
-                    var image = new Image();
-                    image.crossOrigin = "Anonymous";
-                    image.onload = function (e) {
-                        subscriber.next(image);
-                        subscriber.complete();
-                    };
-                    image.onerror = function (error) {
-                        subscriber.error(new Error("Failed to load tile image (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                    };
-                    var blob = new Blob([xmlHTTP.response]);
-                    image.src = window.URL.createObjectURL(blob);
-                };
-                xmlHTTP.onerror = function (error) {
-                    subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.ontimeout = function (error) {
-                    subscriber.error(new Error("Tile request timed out (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.onabort = function (event) {
-                    subscriber.error(new Error("Tile request was aborted (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.send(null);
-            }),
-            function () {
-                if (xmlHTTP != null) {
-                    xmlHTTP.abort();
-                }
-            },
-        ];
-    };
-    return ImageTileLoader;
-}());
-exports.ImageTileLoader = ImageTileLoader;
-exports.default = ImageTileLoader;
-
-},{"rxjs":43}],461:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageTileStore = void 0;
-/**
- * @class ImageTileStore
- *
- * @classdesc Represents a store for image tiles.
- */
-var ImageTileStore = /** @class */ (function () {
-    /**
-     * Create a new node image tile store instance.
-     */
-    function ImageTileStore() {
-        this._images = {};
-    }
-    /**
-     * Add an image tile to the store.
-     *
-     * @param {HTMLImageElement} image - The image tile.
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.addImage = function (image, key, level) {
-        if (!(level in this._images)) {
-            this._images[level] = {};
-        }
-        this._images[level][key] = image;
-    };
-    /**
-     * Dispose the store.
-     *
-     * @description Disposes all cached assets.
-     */
-    ImageTileStore.prototype.dispose = function () {
-        for (var _i = 0, _a = Object.keys(this._images); _i < _a.length; _i++) {
-            var level = _a[_i];
-            var levelImages = this._images[level];
-            for (var _b = 0, _c = Object.keys(levelImages); _b < _c.length; _b++) {
-                var key = _c[_b];
-                window.URL.revokeObjectURL(levelImages[key].src);
-                delete levelImages[key];
-            }
-            delete this._images[level];
-        }
-    };
-    /**
-     * Get an image tile from the store.
-     *
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.getImage = function (key, level) {
-        return this._images[level][key];
-    };
-    /**
-     * Check if an image tile exist in the store.
-     *
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.hasImage = function (key, level) {
-        return level in this._images && key in this._images[level];
-    };
-    return ImageTileStore;
-}());
-exports.ImageTileStore = ImageTileStore;
-exports.default = ImageTileStore;
-
-},{}],462:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RegionOfInterestCalculator = void 0;
-var Geo_1 = require("../Geo");
-/**
- * @class RegionOfInterestCalculator
- *
- * @classdesc Represents a calculator for regions of interest.
- */
-var RegionOfInterestCalculator = /** @class */ (function () {
-    function RegionOfInterestCalculator() {
-        this._viewportCoords = new Geo_1.ViewportCoords();
-    }
-    /**
-     * Compute a region of interest based on the current render camera
-     * and the viewport size.
-     *
-     * @param {RenderCamera} renderCamera - Render camera used for unprojections.
-     * @param {ISize} size - Viewport size in pixels.
-     * @param {Transform} transform - Transform used for projections.
-     *
-     * @returns {IRegionOfInterest} A region of interest.
-     */
-    RegionOfInterestCalculator.prototype.computeRegionOfInterest = function (renderCamera, size, transform) {
-        var viewportBoundaryPoints = this._viewportBoundaryPoints(4);
-        var bbox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform);
-        this._clipBoundingBox(bbox);
-        var viewportPixelWidth = 2 / size.width;
-        var viewportPixelHeight = 2 / size.height;
-        var centralViewportPixel = [
-            [-0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
-            [0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
-            [0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
-            [-0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
-        ];
-        var cpbox = this._viewportPointsBoundingBox(centralViewportPixel, renderCamera, transform);
-        return {
-            bbox: bbox,
-            pixelHeight: cpbox.maxY - cpbox.minY,
-            pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1),
-        };
-    };
-    RegionOfInterestCalculator.prototype._viewportBoundaryPoints = function (pointsPerSide) {
-        var points = [];
-        var os = [[-1, 1], [1, 1], [1, -1], [-1, -1]];
-        var ds = [[2, 0], [0, -2], [-2, 0], [0, 2]];
-        for (var side = 0; side < 4; ++side) {
-            var o = os[side];
-            var d = ds[side];
-            for (var i = 0; i < pointsPerSide; ++i) {
-                points.push([o[0] + d[0] * i / pointsPerSide,
-                    o[1] + d[1] * i / pointsPerSide]);
-            }
-        }
-        return points;
-    };
-    RegionOfInterestCalculator.prototype._viewportPointsBoundingBox = function (viewportPoints, renderCamera, transform) {
-        var _this = this;
-        var basicPoints = viewportPoints
-            .map(function (point) {
-            return _this._viewportCoords
-                .viewportToBasic(point[0], point[1], transform, renderCamera.perspective);
-        });
-        if (transform.gpano != null) {
-            return this._boundingBoxPano(basicPoints);
-        }
-        else {
-            return this._boundingBox(basicPoints);
-        }
-    };
-    RegionOfInterestCalculator.prototype._boundingBox = function (points) {
-        var bbox = {
-            maxX: Number.NEGATIVE_INFINITY,
-            maxY: Number.NEGATIVE_INFINITY,
-            minX: Number.POSITIVE_INFINITY,
-            minY: Number.POSITIVE_INFINITY,
-        };
-        for (var i = 0; i < points.length; ++i) {
-            bbox.minX = Math.min(bbox.minX, points[i][0]);
-            bbox.maxX = Math.max(bbox.maxX, points[i][0]);
-            bbox.minY = Math.min(bbox.minY, points[i][1]);
-            bbox.maxY = Math.max(bbox.maxY, points[i][1]);
-        }
-        return bbox;
-    };
-    RegionOfInterestCalculator.prototype._boundingBoxPano = function (points) {
-        var _this = this;
-        var xs = [];
-        var ys = [];
-        for (var i = 0; i < points.length; ++i) {
-            xs.push(points[i][0]);
-            ys.push(points[i][1]);
-        }
-        xs.sort(function (a, b) { return _this._sign(a - b); });
-        ys.sort(function (a, b) { return _this._sign(a - b); });
-        var intervalX = this._intervalPano(xs);
-        return {
-            maxX: intervalX[1],
-            maxY: ys[ys.length - 1],
-            minX: intervalX[0],
-            minY: ys[0],
-        };
-    };
-    /**
-     * Find the max interval between consecutive numbers.
-     * Assumes numbers are between 0 and 1, sorted and that
-     * x is equivalent to x + 1.
-     */
-    RegionOfInterestCalculator.prototype._intervalPano = function (xs) {
-        var maxdx = 0;
-        var maxi = -1;
-        for (var i = 0; i < xs.length - 1; ++i) {
-            var dx = xs[i + 1] - xs[i];
-            if (dx > maxdx) {
-                maxdx = dx;
-                maxi = i;
-            }
-        }
-        var loopdx = xs[0] + 1 - xs[xs.length - 1];
-        if (loopdx > maxdx) {
-            return [xs[0], xs[xs.length - 1]];
-        }
-        else {
-            return [xs[maxi + 1], xs[maxi]];
-        }
-    };
-    RegionOfInterestCalculator.prototype._clipBoundingBox = function (bbox) {
-        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
-        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
-        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
-        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
-    };
-    RegionOfInterestCalculator.prototype._sign = function (n) {
-        return n > 0 ? 1 : n < 0 ? -1 : 0;
-    };
-    return RegionOfInterestCalculator;
-}());
-exports.RegionOfInterestCalculator = RegionOfInterestCalculator;
-exports.default = RegionOfInterestCalculator;
-
-},{"../Geo":294}],463:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TextureProvider = void 0;
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var rxjs_1 = require("rxjs");
-/**
- * @class TextureProvider
- *
- * @classdesc Represents a provider of textures.
- */
-var TextureProvider = /** @class */ (function () {
-    /**
-     * Create a new node texture provider instance.
-     *
-     * @param {string} key - The identifier of the image for which to request tiles.
-     * @param {number} width - The full width of the original image.
-     * @param {number} height - The full height of the original image.
-     * @param {number} tileSize - The size used when requesting tiles.
-     * @param {HTMLImageElement} background - Image to use as background.
-     * @param {ImageTileLoader} imageTileLoader - Loader for retrieving tiles.
-     * @param {ImageTileStore} imageTileStore - Store for saving tiles.
-     * @param {THREE.WebGLRenderer} renderer - Renderer used for rendering tiles to texture.
-     */
-    function TextureProvider(key, width, height, tileSize, background, imageTileLoader, imageTileStore, renderer) {
-        this._disposed = false;
-        this._key = key;
-        if (width <= 0 || height <= 0) {
-            console.warn("Original image size (" + width + ", " + height + ") is invalid (" + key + "). Tiles will not be loaded.");
-        }
-        this._width = width;
-        this._height = height;
-        this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2));
-        this._currentLevel = -1;
-        this._tileSize = tileSize;
-        this._updated$ = new rxjs_1.Subject();
-        this._createdSubject$ = new rxjs_1.Subject();
-        this._created$ = this._createdSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._createdSubscription = this._created$.subscribe(function () { });
-        this._hasSubject$ = new rxjs_1.Subject();
-        this._has$ = this._hasSubject$.pipe(operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasSubscription = this._has$.subscribe(function () { });
-        this._abortFunctions = [];
-        this._tileSubscriptions = {};
-        this._renderedCurrentLevelTiles = {};
-        this._renderedTiles = {};
-        this._background = background;
-        this._camera = null;
-        this._imageTileLoader = imageTileLoader;
-        this._imageTileStore = imageTileStore;
-        this._renderer = renderer;
-        this._renderTarget = null;
-        this._roi = null;
-    }
-    Object.defineProperty(TextureProvider.prototype, "disposed", {
-        /**
-         * Get disposed.
-         *
-         * @returns {boolean} Value indicating whether provider has
-         * been disposed.
-         */
-        get: function () {
-            return this._disposed;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "hasTexture$", {
-        /**
-         * Get hasTexture$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values indicating when the existance of a texture
-         * changes.
-         */
-        get: function () {
-            return this._has$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {boolean} The identifier of the image for
-         * which to render textures.
-         */
-        get: function () {
-            return this._key;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "textureUpdated$", {
-        /**
-         * Get textureUpdated$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values when an existing texture has been updated.
-         */
-        get: function () {
-            return this._updated$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "textureCreated$", {
-        /**
-         * Get textureCreated$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values when a new texture has been created.
-         */
-        get: function () {
-            return this._created$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Abort all outstanding image tile requests.
-     */
-    TextureProvider.prototype.abort = function () {
-        for (var key in this._tileSubscriptions) {
-            if (!this._tileSubscriptions.hasOwnProperty(key)) {
-                continue;
-            }
-            this._tileSubscriptions[key].unsubscribe();
-        }
-        this._tileSubscriptions = {};
-        for (var _i = 0, _a = this._abortFunctions; _i < _a.length; _i++) {
-            var abort = _a[_i];
-            abort();
-        }
-        this._abortFunctions = [];
-    };
-    /**
-     * Dispose the provider.
-     *
-     * @description Disposes all cached assets and
-     * aborts all outstanding image tile requests.
-     */
-    TextureProvider.prototype.dispose = function () {
-        if (this._disposed) {
-            console.warn("Texture already disposed (" + this._key + ")");
-            return;
-        }
-        this.abort();
-        if (this._renderTarget != null) {
-            this._renderTarget.dispose();
-            this._renderTarget = null;
-        }
-        this._imageTileStore.dispose();
-        this._imageTileStore = null;
-        this._background = null;
-        this._camera = null;
-        this._imageTileLoader = null;
-        this._renderer = null;
-        this._roi = null;
-        this._createdSubscription.unsubscribe();
-        this._hasSubscription.unsubscribe();
-        this._disposed = true;
-    };
-    /**
-     * Set the region of interest.
-     *
-     * @description When the region of interest is set the
-     * the tile level is determined and tiles for the region
-     * are fetched from the store or the loader and renderedLevel
-     * to the texture.
-     *
-     * @param {IRegionOfInterest} roi - Spatial edges to cache.
-     */
-    TextureProvider.prototype.setRegionOfInterest = function (roi) {
-        if (this._width <= 0 || this._height <= 0) {
-            return;
-        }
-        this._roi = roi;
-        var width = 1 / this._roi.pixelWidth;
-        var height = 1 / this._roi.pixelHeight;
-        var size = Math.max(height, width);
-        var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2))));
-        if (currentLevel !== this._currentLevel) {
-            this.abort();
-            this._currentLevel = currentLevel;
-            if (!(this._currentLevel in this._renderedTiles)) {
-                this._renderedTiles[this._currentLevel] = [];
-            }
-            this._renderedCurrentLevelTiles = {};
-            for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) {
-                var tile = _a[_i];
-                this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
-            }
-        }
-        var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]);
-        var bottomRight = this._getTileCoords([this._roi.bbox.maxX, this._roi.bbox.maxY]);
-        var tiles = this._getTiles(topLeft, bottomRight);
-        if (this._camera == null) {
-            this._camera = new THREE.OrthographicCamera(-this._width / 2, this._width / 2, this._height / 2, -this._height / 2, -1, 1);
-            this._camera.position.z = 1;
-            var gl = this._renderer.getContext();
-            var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
-            var backgroundSize = Math.max(this._width, this._height);
-            var scale = maxTextureSize > backgroundSize ? 1 : maxTextureSize / backgroundSize;
-            var targetWidth = Math.floor(scale * this._width);
-            var targetHeight = Math.floor(scale * this._height);
-            this._renderTarget = new THREE.WebGLRenderTarget(targetWidth, targetHeight, {
-                depthBuffer: false,
-                format: THREE.RGBFormat,
-                magFilter: THREE.LinearFilter,
-                minFilter: THREE.LinearFilter,
-                stencilBuffer: false,
-            });
-            this._renderToTarget(0, 0, this._width, this._height, this._background);
-            this._createdSubject$.next(this._renderTarget.texture);
-            this._hasSubject$.next(true);
-        }
-        this._fetchTiles(tiles);
-    };
-    TextureProvider.prototype.setTileSize = function (tileSize) {
-        this._tileSize = tileSize;
-    };
-    /**
-     * Update the image used as background for the texture.
-     *
-     * @param {HTMLImageElement} background - The background image.
-     */
-    TextureProvider.prototype.updateBackground = function (background) {
-        this._background = background;
-    };
-    /**
-     * Retrieve an image tile.
-     *
-     * @description Retrieve an image tile and render it to the
-     * texture. Add the tile to the store and emit to the updated
-     * observable.
-     *
-     * @param {Array<number>} tile - The tile coordinates.
-     * @param {number} level - The tile level.
-     * @param {number} x - The top left x pixel coordinate of the tile.
-     * @param {number} y - The top left y pixel coordinate of the tile.
-     * @param {number} w - The pixel width of the tile.
-     * @param {number} h - The pixel height of the tile.
-     * @param {number} scaledW - The scaled width of the returned tile.
-     * @param {number} scaledH - The scaled height of the returned tile.
-     */
-    TextureProvider.prototype._fetchTile = function (tile, level, x, y, w, h, scaledX, scaledY) {
-        var _this = this;
-        var getTile = this._imageTileLoader.getTile(this._key, x, y, w, h, scaledX, scaledY);
-        var tile$ = getTile[0];
-        var abort = getTile[1];
-        this._abortFunctions.push(abort);
-        var tileKey = this._tileKey(this._tileSize, tile);
-        var subscription = tile$
-            .subscribe(function (image) {
-            _this._renderToTarget(x, y, w, h, image);
-            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
-            _this._removeFromArray(abort, _this._abortFunctions);
-            _this._setTileRendered(tile, _this._currentLevel);
-            _this._imageTileStore.addImage(image, tileKey, level);
-            _this._updated$.next(true);
-        }, function (error) {
-            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
-            _this._removeFromArray(abort, _this._abortFunctions);
-            console.error(error);
-        });
-        if (!subscription.closed) {
-            this._tileSubscriptions[tileKey] = subscription;
-        }
-    };
-    /**
-     * Retrieve image tiles.
-     *
-     * @description Retrieve a image tiles and render them to the
-     * texture. Retrieve from store if it exists, otherwise Retrieve
-     * from loader.
-     *
-     * @param {Array<Array<number>>} tiles - Array of tile coordinates to
-     * retrieve.
-     */
-    TextureProvider.prototype._fetchTiles = function (tiles) {
-        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-        for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) {
-            var tile = tiles_1[_i];
-            var tileKey = this._tileKey(this._tileSize, tile);
-            if (tileKey in this._renderedCurrentLevelTiles ||
-                tileKey in this._tileSubscriptions) {
-                continue;
-            }
-            var tileX = tileSize * tile[0];
-            var tileY = tileSize * tile[1];
-            var tileWidth = tileX + tileSize > this._width ? this._width - tileX : tileSize;
-            var tileHeight = tileY + tileSize > this._height ? this._height - tileY : tileSize;
-            if (this._imageTileStore.hasImage(tileKey, this._currentLevel)) {
-                this._renderToTarget(tileX, tileY, tileWidth, tileHeight, this._imageTileStore.getImage(tileKey, this._currentLevel));
-                this._setTileRendered(tile, this._currentLevel);
-                this._updated$.next(true);
-                continue;
-            }
-            var scaledX = Math.floor(tileWidth / tileSize * this._tileSize);
-            var scaledY = Math.floor(tileHeight / tileSize * this._tileSize);
-            this._fetchTile(tile, this._currentLevel, tileX, tileY, tileWidth, tileHeight, scaledX, scaledY);
-        }
-    };
-    /**
-     * Get tile coordinates for a point using the current level.
-     *
-     * @param {Array<number>} point - Point in basic coordinates.
-     *
-     * @returns {Array<number>} x and y tile coodinates.
-     */
-    TextureProvider.prototype._getTileCoords = function (point) {
-        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-        var maxX = Math.ceil(this._width / tileSize) - 1;
-        var maxY = Math.ceil(this._height / tileSize) - 1;
-        return [
-            Math.min(Math.floor(this._width * point[0] / tileSize), maxX),
-            Math.min(Math.floor(this._height * point[1] / tileSize), maxY),
-        ];
-    };
-    /**
-     * Get tile coordinates for all tiles contained in a bounding
-     * box.
-     *
-     * @param {Array<number>} topLeft - Top left tile coordinate of bounding box.
-     * @param {Array<number>} bottomRight - Bottom right tile coordinate of bounding box.
-     *
-     * @returns {Array<Array<number>>} Array of x, y tile coodinates.
-     */
-    TextureProvider.prototype._getTiles = function (topLeft, bottomRight) {
-        var xs = [];
-        if (topLeft[0] > bottomRight[0]) {
-            var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-            var maxX = Math.ceil(this._width / tileSize) - 1;
-            for (var x = topLeft[0]; x <= maxX; x++) {
-                xs.push(x);
-            }
-            for (var x = 0; x <= bottomRight[0]; x++) {
-                xs.push(x);
-            }
-        }
-        else {
-            for (var x = topLeft[0]; x <= bottomRight[0]; x++) {
-                xs.push(x);
-            }
-        }
-        var tiles = [];
-        for (var _i = 0, xs_1 = xs; _i < xs_1.length; _i++) {
-            var x = xs_1[_i];
-            for (var y = topLeft[1]; y <= bottomRight[1]; y++) {
-                tiles.push([x, y]);
-            }
-        }
-        return tiles;
-    };
-    /**
-     * Remove an item from an array if it exists in array.
-     *
-     * @param {T} item - Item to remove.
-     * @param {Array<T>} array - Array from which item should be removed.
-     */
-    TextureProvider.prototype._removeFromArray = function (item, array) {
-        var index = array.indexOf(item);
-        if (index !== -1) {
-            array.splice(index, 1);
-        }
-    };
-    /**
-     * Remove an item from a dictionary.
-     *
-     * @param {string} key - Key of the item to remove.
-     * @param {Object} dict - Dictionary from which item should be removed.
-     */
-    TextureProvider.prototype._removeFromDictionary = function (key, dict) {
-        if (key in dict) {
-            delete dict[key];
-        }
-    };
-    /**
-     * Render an image tile to the target texture.
-     *
-     * @param {number} x - The top left x pixel coordinate of the tile.
-     * @param {number} y - The top left y pixel coordinate of the tile.
-     * @param {number} w - The pixel width of the tile.
-     * @param {number} h - The pixel height of the tile.
-     * @param {HTMLImageElement} background - The image tile to render.
-     */
-    TextureProvider.prototype._renderToTarget = function (x, y, w, h, image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        var geometry = new THREE.PlaneGeometry(w, h);
-        var material = new THREE.MeshBasicMaterial({ map: texture, side: THREE.FrontSide });
-        var mesh = new THREE.Mesh(geometry, material);
-        mesh.position.x = -this._width / 2 + x + w / 2;
-        mesh.position.y = this._height / 2 - y - h / 2;
-        var scene = new THREE.Scene();
-        scene.add(mesh);
-        var target = this._renderer.getRenderTarget();
-        this._renderer.setRenderTarget(this._renderTarget);
-        this._renderer.render(scene, this._camera);
-        this._renderer.setRenderTarget(target);
-        scene.remove(mesh);
-        geometry.dispose();
-        material.dispose();
-        texture.dispose();
-    };
-    /**
-     * Mark a tile as rendered.
-     *
-     * @description Clears tiles marked as rendered in other
-     * levels of the tile pyramid  if they were rendered on
-     * top of or below the tile.
-     *
-     * @param {Arrary<number>} tile - The tile coordinates.
-     * @param {number} level - Tile level of the tile coordinates.
-     */
-    TextureProvider.prototype._setTileRendered = function (tile, level) {
-        var otherLevels = Object.keys(this._renderedTiles)
-            .map(function (key) {
-            return parseInt(key, 10);
-        })
-            .filter(function (renderedLevel) {
-            return renderedLevel !== level;
-        });
-        for (var _i = 0, otherLevels_1 = otherLevels; _i < otherLevels_1.length; _i++) {
-            var otherLevel = otherLevels_1[_i];
-            var scale = Math.pow(2, otherLevel - level);
-            if (otherLevel < level) {
-                var x = Math.floor(scale * tile[0]);
-                var y = Math.floor(scale * tile[1]);
-                for (var _a = 0, _b = this._renderedTiles[otherLevel].slice(); _a < _b.length; _a++) {
-                    var otherTile = _b[_a];
-                    if (otherTile[0] === x && otherTile[1] === y) {
-                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
-                        this._renderedTiles[otherLevel].splice(index, 1);
-                    }
-                }
-            }
-            else {
-                var startX = scale * tile[0];
-                var endX = startX + scale - 1;
-                var startY = scale * tile[1];
-                var endY = startY + scale - 1;
-                for (var _c = 0, _d = this._renderedTiles[otherLevel].slice(); _c < _d.length; _c++) {
-                    var otherTile = _d[_c];
-                    if (otherTile[0] >= startX && otherTile[0] <= endX &&
-                        otherTile[1] >= startY && otherTile[1] <= endY) {
-                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
-                        this._renderedTiles[otherLevel].splice(index, 1);
-                    }
-                }
-            }
-            if (this._renderedTiles[otherLevel].length === 0) {
-                delete this._renderedTiles[otherLevel];
-            }
-        }
-        this._renderedTiles[level].push(tile);
-        this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
-    };
-    /**
-     * Create a tile key from a tile coordinates.
-     *
-     * @description Tile keys are used as a hash for
-     * storing the tile in a dictionary.
-     *
-     * @param {number} tileSize - The tile size.
-     * @param {Arrary<number>} tile - The tile coordinates.
-     */
-    TextureProvider.prototype._tileKey = function (tileSize, tile) {
-        return tileSize + "-" + tile[0] + "-" + tile[1];
-    };
-    return TextureProvider;
-}());
-exports.TextureProvider = TextureProvider;
-exports.default = TextureProvider;
-
-},{"rxjs":43,"rxjs/operators":241,"three":242}],464:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}],465:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DOM = void 0;
-var DOM = /** @class */ (function () {
-    function DOM(doc) {
-        this._document = !!doc ? doc : document;
-    }
-    Object.defineProperty(DOM.prototype, "document", {
-        get: function () {
-            return this._document;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    DOM.prototype.createElement = function (tagName, className, container) {
-        var element = this._document.createElement(tagName);
-        if (!!className) {
-            element.className = className;
-        }
-        if (!!container) {
-            container.appendChild(element);
-        }
-        return element;
-    };
-    return DOM;
-}());
-exports.DOM = DOM;
-exports.default = DOM;
-
-},{}],466:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EventEmitter = void 0;
-var EventEmitter = /** @class */ (function () {
-    function EventEmitter() {
-        this._events = {};
-    }
-    /**
-     * Subscribe to an event by its name.
-     * @param {string }eventType - The name of the event to subscribe to.
-     * @param {any} fn - The handler called when the event occurs.
-     */
-    EventEmitter.prototype.on = function (eventType, fn) {
-        this._events[eventType] = this._events[eventType] || [];
-        this._events[eventType].push(fn);
-        return;
-    };
-    /**
-     * Unsubscribe from an event by its name.
-     * @param {string} eventType - The name of the event to subscribe to.
-     * @param {any} fn - The handler to remove.
-     */
-    EventEmitter.prototype.off = function (eventType, fn) {
-        if (!eventType) {
-            this._events = {};
-            return;
-        }
-        if (!this._listens(eventType)) {
-            var idx = this._events[eventType].indexOf(fn);
-            if (idx >= 0) {
-                this._events[eventType].splice(idx, 1);
-            }
-            if (this._events[eventType].length) {
-                delete this._events[eventType];
-            }
-        }
-        else {
-            delete this._events[eventType];
-        }
-        return;
-    };
-    EventEmitter.prototype.fire = function (eventType, data) {
-        if (!this._listens(eventType)) {
-            return;
-        }
-        for (var _i = 0, _a = this._events[eventType]; _i < _a.length; _i++) {
-            var fn = _a[_i];
-            fn.call(this, data);
-        }
-        return;
-    };
-    EventEmitter.prototype._listens = function (eventType) {
-        return !!(this._events && this._events[eventType]);
-    };
-    return EventEmitter;
-}());
-exports.EventEmitter = EventEmitter;
-exports.default = EventEmitter;
-
-},{}],467:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Settings = void 0;
-var Viewer_1 = require("../Viewer");
-var Settings = /** @class */ (function () {
-    function Settings() {
-    }
-    Object.defineProperty(Settings, "baseImageSize", {
-        get: function () {
-            return Settings._baseImageSize;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "basePanoramaSize", {
-        get: function () {
-            return Settings._basePanoramaSize;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "maxImageSize", {
-        get: function () {
-            return Settings._maxImageSize;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Settings.setOptions = function (options) {
-        Settings._baseImageSize = options.baseImageSize != null ?
-            options.baseImageSize :
-            Viewer_1.ImageSize.Size640;
-        Settings._basePanoramaSize = options.basePanoramaSize != null ?
-            options.basePanoramaSize :
-            Viewer_1.ImageSize.Size2048;
-        Settings._maxImageSize = options.maxImageSize != null ?
-            options.maxImageSize :
-            Viewer_1.ImageSize.Size2048;
-    };
-    return Settings;
-}());
-exports.Settings = Settings;
-exports.default = Settings;
-
-},{"../Viewer":302}],468:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isWebGLSupported = exports.isWebGLSupportedCached = exports.isBlobSupported = exports.isObjectSupported = exports.isJSONSupported = exports.isFunctionSupported = exports.isArraySupported = exports.isBrowser = void 0;
-function isBrowser() {
-    return typeof window !== "undefined" && typeof document !== "undefined";
-}
-exports.isBrowser = isBrowser;
-function isArraySupported() {
-    return !!(Array.prototype &&
-        Array.prototype.filter &&
-        Array.prototype.indexOf &&
-        Array.prototype.map &&
-        Array.prototype.reverse);
-}
-exports.isArraySupported = isArraySupported;
-function isFunctionSupported() {
-    return !!(Function.prototype && Function.prototype.bind);
-}
-exports.isFunctionSupported = isFunctionSupported;
-function isJSONSupported() {
-    return "JSON" in window && "parse" in JSON && "stringify" in JSON;
-}
-exports.isJSONSupported = isJSONSupported;
-function isObjectSupported() {
-    return !!(Object.keys &&
-        Object.assign);
-}
-exports.isObjectSupported = isObjectSupported;
-function isBlobSupported() {
-    return "Blob" in window && "URL" in window;
-}
-exports.isBlobSupported = isBlobSupported;
-var isWebGLSupportedCache = undefined;
-function isWebGLSupportedCached() {
-    if (isWebGLSupportedCache === undefined) {
-        isWebGLSupportedCache = isWebGLSupported();
-    }
-    return isWebGLSupportedCache;
-}
-exports.isWebGLSupportedCached = isWebGLSupportedCached;
-function isWebGLSupported() {
-    var webGLContextAttributes = {
-        alpha: false,
-        antialias: false,
-        depth: true,
-        failIfMajorPerformanceCaveat: false,
-        premultipliedAlpha: true,
-        preserveDrawingBuffer: false,
-        stencil: true,
-    };
-    var canvas = document.createElement("canvas");
-    var context = canvas.getContext("webgl", webGLContextAttributes) ||
-        canvas.getContext("experimental-webgl", webGLContextAttributes);
-    if (!context) {
-        return false;
-    }
-    var requiredExtensions = [
-        "OES_standard_derivatives",
-    ];
-    var supportedExtensions = context.getSupportedExtensions();
-    for (var _i = 0, requiredExtensions_1 = requiredExtensions; _i < requiredExtensions_1.length; _i++) {
-        var requiredExtension = requiredExtensions_1[_i];
-        if (supportedExtensions.indexOf(requiredExtension) === -1) {
-            return false;
-        }
-    }
-    return true;
-}
-exports.isWebGLSupported = isWebGLSupported;
-
-},{}],469:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Urls = void 0;
-var Urls = /** @class */ (function () {
-    function Urls() {
-    }
-    Object.defineProperty(Urls, "explore", {
-        get: function () {
-            return Urls._scheme + "://" + Urls._exploreHost;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "origin", {
-        get: function () {
-            return Urls._origin;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "tileScheme", {
-        get: function () {
-            return Urls._scheme;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "tileDomain", {
-        get: function () {
-            return Urls._imageTileHost;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Urls.clusterReconstruction = function (key) {
-        return Urls._scheme + "://" + Urls._clusterReconstructionHost + "/" + key + "/v1.0/aligned.jsonz";
-    };
-    Urls.exporeImage = function (key) {
-        return Urls._scheme + "://" + Urls._exploreHost + "/app/?pKey=" + key + "&focus=photo";
-    };
-    Urls.exporeUser = function (username) {
-        return Urls._scheme + "://" + Urls._exploreHost + "/app/user/" + username;
-    };
-    Urls.falcorModel = function (clientId) {
-        return Urls._scheme + "://" + Urls._apiHost + "/v3/model.json?client_id=" + clientId;
-    };
-    Urls.protoMesh = function (key) {
-        return Urls._scheme + "://" + Urls._meshHost + "/v2/mesh/" + key;
-    };
-    Urls.thumbnail = function (key, size, origin) {
-        var query = !!origin ? "?origin=" + origin : "";
-        return Urls._scheme + "://" + Urls._imageHost + "/" + key + "/thumb-" + size + ".jpg" + query;
-    };
-    Urls.setOptions = function (options) {
-        if (!options) {
-            return;
-        }
-        if (!!options.apiHost) {
-            Urls._apiHost = options.apiHost;
-        }
-        if (!!options.clusterReconstructionHost) {
-            Urls._clusterReconstructionHost = options.clusterReconstructionHost;
-        }
-        if (!!options.exploreHost) {
-            Urls._exploreHost = options.exploreHost;
-        }
-        if (!!options.imageHost) {
-            Urls._imageHost = options.imageHost;
-        }
-        if (!!options.imageTileHost) {
-            Urls._imageTileHost = options.imageTileHost;
-        }
-        if (!!options.meshHost) {
-            Urls._meshHost = options.meshHost;
-        }
-        if (!!options.scheme) {
-            Urls._scheme = options.scheme;
-        }
-    };
-    Urls._apiHost = "a.mapillary.com";
-    Urls._clusterReconstructionHost = "cluster-reconstructions.mapillary.com";
-    Urls._exploreHost = "www.mapillary.com";
-    Urls._imageHost = "images.mapillary.com";
-    Urls._imageTileHost = "loris.mapillary.com";
-    Urls._meshHost = "meshes.mapillary.com";
-    Urls._origin = "mapillary.webgl";
-    Urls._scheme = "https";
-    return Urls;
-}());
-exports.Urls = Urls;
-exports.default = Urls;
-
-},{}],470:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Alignment = void 0;
-/**
- * Enumeration for alignments
- * @enum {number}
- * @readonly
- */
-var Alignment;
-(function (Alignment) {
-    /**
-     * Align to bottom
-     */
-    Alignment[Alignment["Bottom"] = 0] = "Bottom";
-    /**
-     * Align to bottom left
-     */
-    Alignment[Alignment["BottomLeft"] = 1] = "BottomLeft";
-    /**
-     * Align to bottom right
-     */
-    Alignment[Alignment["BottomRight"] = 2] = "BottomRight";
-    /**
-     * Align to center
-     */
-    Alignment[Alignment["Center"] = 3] = "Center";
-    /**
-     * Align to left
-     */
-    Alignment[Alignment["Left"] = 4] = "Left";
-    /**
-     * Align to right
-     */
-    Alignment[Alignment["Right"] = 5] = "Right";
-    /**
-     * Align to top
-     */
-    Alignment[Alignment["Top"] = 6] = "Top";
-    /**
-     * Align to top left
-     */
-    Alignment[Alignment["TopLeft"] = 7] = "TopLeft";
-    /**
-     * Align to top right
-     */
-    Alignment[Alignment["TopRight"] = 8] = "TopRight";
-})(Alignment = exports.Alignment || (exports.Alignment = {}));
-exports.default = Alignment;
-
-},{}],471:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CacheService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-var CacheService = /** @class */ (function () {
-    function CacheService(graphService, stateService) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._started = false;
-    }
-    Object.defineProperty(CacheService.prototype, "started", {
-        get: function () {
-            return this._started;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    CacheService.prototype.start = function () {
-        var _this = this;
-        if (this._started) {
-            return;
-        }
-        this._uncacheSubscription = this._stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.map(function (frame) {
-            var trajectory = frame.state.trajectory;
-            var trajectoryKeys = trajectory
-                .map(function (n) {
-                return n.key;
-            });
-            var sequenceKey = trajectory[trajectory.length - 1].sequenceKey;
-            return [trajectoryKeys, sequenceKey];
-        }), operators_1.bufferCount(1, 5), operators_1.withLatestFrom(this._graphService.graphMode$), operators_1.switchMap(function (_a) {
-            var keepBuffer = _a[0], graphMode = _a[1];
-            var keepKeys = keepBuffer[0][0];
-            var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ?
-                keepBuffer[0][1] : undefined;
-            return _this._graphService.uncache$(keepKeys, keepSequenceKey);
-        }))
-            .subscribe(function () { });
-        this._cacheNodeSubscription = this._graphService.graphMode$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._stateService.currentState$), operators_1.switchMap(function (_a) {
-            var mode = _a[0], frame = _a[1];
-            return mode === Graph_1.GraphMode.Sequence ?
-                _this._keyToEdges(frame.state.currentNode.key, function (node) {
-                    return node.sequenceEdges$;
-                }) :
-                rxjs_1.from(frame.state.trajectory
-                    .map(function (node) {
-                    return node.key;
-                })
-                    .slice(frame.state.currentIndex)).pipe(operators_1.mergeMap(function (key) {
-                    return _this._keyToEdges(key, function (node) {
-                        return node.spatialEdges$;
-                    });
-                }, 6));
-        }))
-            .subscribe(function () { });
-        this._started = true;
-    };
-    CacheService.prototype.stop = function () {
-        if (!this._started) {
-            return;
-        }
-        this._uncacheSubscription.unsubscribe();
-        this._uncacheSubscription = null;
-        this._cacheNodeSubscription.unsubscribe();
-        this._cacheNodeSubscription = null;
-        this._started = false;
-    };
-    CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) {
-        return this._graphService.cacheNode$(key).pipe(operators_1.switchMap(nodeToEdgeMap), operators_1.first(function (status) {
-            return status.cached;
-        }), operators_1.timeout(15000), operators_1.catchError(function (error) {
-            console.error("Failed to cache edges (" + key + ").", error);
-            return rxjs_1.empty();
-        }));
-    };
-    return CacheService;
-}());
-exports.CacheService = CacheService;
-exports.default = CacheService;
-
-},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],472:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ComponentController = void 0;
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../Component");
-var ComponentController = /** @class */ (function () {
-    function ComponentController(container, navigator, observer, key, options, componentService) {
-        var _this = this;
-        this._container = container;
-        this._observer = observer;
-        this._navigator = navigator;
-        this._options = options != null ? options : {};
-        this._key = key;
-        this._navigable = key == null;
-        this._componentService = !!componentService ?
-            componentService :
-            new Component_1.ComponentService(this._container, this._navigator);
-        this._coverComponent = this._componentService.getCover();
-        this._initializeComponents();
-        if (key) {
-            this._initilizeCoverComponent();
-            this._subscribeCoverComponent();
-        }
-        else {
-            this._navigator.movedToKey$.pipe(operators_1.first(function (k) {
-                return k != null;
-            }))
-                .subscribe(function (k) {
-                _this._key = k;
-                _this._componentService.deactivateCover();
-                _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden });
-                _this._subscribeCoverComponent();
-                _this._navigator.stateService.start();
-                _this._navigator.cacheService.start();
-                _this._navigator.panService.start();
-                _this._observer.startEmit();
-            });
-        }
-    }
-    Object.defineProperty(ComponentController.prototype, "navigable", {
-        get: function () {
-            return this._navigable;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    ComponentController.prototype.get = function (name) {
-        return this._componentService.get(name);
-    };
-    ComponentController.prototype.activate = function (name) {
-        this._componentService.activate(name);
-    };
-    ComponentController.prototype.activateCover = function () {
-        this._coverComponent.configure({ state: Component_1.CoverState.Visible });
-    };
-    ComponentController.prototype.deactivate = function (name) {
-        this._componentService.deactivate(name);
-    };
-    ComponentController.prototype.deactivateCover = function () {
-        this._coverComponent.configure({ state: Component_1.CoverState.Loading });
-    };
-    ComponentController.prototype._initializeComponents = function () {
-        var options = this._options;
-        this._uFalse(options.background, "background");
-        this._uFalse(options.debug, "debug");
-        this._uFalse(options.image, "image");
-        this._uFalse(options.marker, "marker");
-        this._uFalse(options.navigation, "navigation");
-        this._uFalse(options.popup, "popup");
-        this._uFalse(options.route, "route");
-        this._uFalse(options.slider, "slider");
-        this._uFalse(options.spatialData, "spatialData");
-        this._uFalse(options.tag, "tag");
-        this._uTrue(options.attribution, "attribution");
-        this._uTrue(options.bearing, "bearing");
-        this._uTrue(options.cache, "cache");
-        this._uTrue(options.direction, "direction");
-        this._uTrue(options.imagePlane, "imagePlane");
-        this._uTrue(options.keyboard, "keyboard");
-        this._uTrue(options.loading, "loading");
-        this._uTrue(options.mouse, "mouse");
-        this._uTrue(options.sequence, "sequence");
-        this._uTrue(options.stats, "stats");
-        this._uTrue(options.zoom, "zoom");
-    };
-    ComponentController.prototype._initilizeCoverComponent = function () {
-        var options = this._options;
-        this._coverComponent.configure({ key: this._key });
-        if (options.cover === undefined || options.cover) {
-            this.activateCover();
-        }
-        else {
-            this.deactivateCover();
-        }
-    };
-    ComponentController.prototype._setNavigable = function (navigable) {
-        if (this._navigable === navigable) {
-            return;
-        }
-        this._navigable = navigable;
-        this._observer.navigable$.next(navigable);
-    };
-    ComponentController.prototype._subscribeCoverComponent = function () {
-        var _this = this;
-        this._coverComponent.configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (c) {
-            return c.state;
-        }))
-            .subscribe(function (conf) {
-            if (conf.state === Component_1.CoverState.Loading) {
-                _this._navigator.stateService.currentKey$.pipe(operators_1.first(), operators_1.switchMap(function (key) {
-                    var keyChanged = key == null || key !== conf.key;
-                    if (keyChanged) {
-                        _this._setNavigable(false);
-                    }
-                    return keyChanged ?
-                        _this._navigator.moveToKey$(conf.key) :
-                        _this._navigator.stateService.currentNode$.pipe(operators_1.first());
-                }))
-                    .subscribe(function () {
-                    _this._navigator.stateService.start();
-                    _this._navigator.cacheService.start();
-                    _this._navigator.panService.start();
-                    _this._observer.startEmit();
-                    _this._coverComponent.configure({ state: Component_1.CoverState.Hidden });
-                    _this._componentService.deactivateCover();
-                    _this._setNavigable(true);
-                }, function (error) {
-                    console.error("Failed to deactivate cover.", error);
-                    _this._coverComponent.configure({ state: Component_1.CoverState.Visible });
-                });
-            }
-            else if (conf.state === Component_1.CoverState.Visible) {
-                _this._observer.stopEmit();
-                _this._navigator.stateService.stop();
-                _this._navigator.cacheService.stop();
-                _this._navigator.playService.stop();
-                _this._navigator.panService.stop();
-                _this._componentService.activateCover();
-                _this._setNavigable(conf.key == null);
-            }
-        });
-    };
-    ComponentController.prototype._uFalse = function (option, name) {
-        if (option === undefined) {
-            this._componentService.deactivate(name);
-            return;
-        }
-        if (typeof option === "boolean") {
-            if (option) {
-                this._componentService.activate(name);
-            }
-            else {
-                this._componentService.deactivate(name);
-            }
-            return;
-        }
-        this._componentService.configure(name, option);
-        this._componentService.activate(name);
-    };
-    ComponentController.prototype._uTrue = function (option, name) {
-        if (option === undefined) {
-            this._componentService.activate(name);
-            return;
-        }
-        if (typeof option === "boolean") {
-            if (option) {
-                this._componentService.activate(name);
-            }
-            else {
-                this._componentService.deactivate(name);
-            }
-            return;
-        }
-        this._componentService.configure(name, option);
-        this._componentService.activate(name);
-    };
-    return ComponentController;
-}());
-exports.ComponentController = ComponentController;
-
-},{"../Component":291,"rxjs/operators":241}],473:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Container = void 0;
-var Render_1 = require("../Render");
-var Utils_1 = require("../Utils");
-var Viewer_1 = require("../Viewer");
-var Container = /** @class */ (function () {
-    function Container(container, stateService, options, dom) {
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        if (typeof container === 'string') {
-            this._container = this._dom.document.getElementById(container);
-            if (!this._container) {
-                throw new Error("Container '" + container + "' not found.");
-            }
-        }
-        else if (container instanceof HTMLElement) {
-            this._container = container;
-        }
-        else {
-            throw new Error("Invalid type: 'container' must be a String or HTMLElement.");
-        }
-        this.id = !!this._container.id ? this._container.id : "mapillary-js-fallback-container-id";
-        this._container.classList.add("mapillary-js");
-        this._canvasContainer = this._dom.createElement("div", "mapillary-js-interactive", this._container);
-        this._domContainer = this._dom.createElement("div", "mapillary-js-dom", this._container);
-        this.renderService = new Render_1.RenderService(this._container, stateService.currentState$, options.renderMode);
-        this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService, this._dom);
-        this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);
-        this.keyboardService = new Viewer_1.KeyboardService(this._canvasContainer);
-        this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer, document);
-        this.touchService = new Viewer_1.TouchService(this._canvasContainer, this._domContainer);
-        this.spriteService = new Viewer_1.SpriteService(options.sprite);
-    }
-    Object.defineProperty(Container.prototype, "element", {
-        get: function () {
-            return this._container;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Container.prototype, "canvasContainer", {
-        get: function () {
-            return this._canvasContainer;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Container.prototype, "domContainer", {
-        get: function () {
-            return this._domContainer;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return Container;
-}());
-exports.Container = Container;
-exports.default = Container;
-
-},{"../Render":297,"../Utils":301,"../Viewer":302}],474:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ImageSize = void 0;
-/**
- * Enumeration for image sizes
- * @enum {number}
- * @readonly
- * @description Image sizes in pixels for the long side of the image.
- */
-var ImageSize;
-(function (ImageSize) {
-    /**
-     * 320 pixels image size
-     */
-    ImageSize[ImageSize["Size320"] = 320] = "Size320";
-    /**
-     * 640 pixels image size
-     */
-    ImageSize[ImageSize["Size640"] = 640] = "Size640";
-    /**
-     * 1024 pixels image size
-     */
-    ImageSize[ImageSize["Size1024"] = 1024] = "Size1024";
-    /**
-     * 2048 pixels image size
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).mapillary={})}(this,(function(t){"use strict";
+/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation.
+
+    Permission to use, copy, modify, and/or distribute this software for any
+    purpose with or without fee is hereby granted.
+
+    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+    PERFORMANCE OF THIS SOFTWARE.
+    ***************************************************************************** */var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])})(t,i)};function i(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}function n(t){return"function"==typeof t}var r=!1,s={Promise:void 0,set useDeprecatedSynchronousErrorHandling(t){t&&(new Error).stack;r=t},get useDeprecatedSynchronousErrorHandling(){return r}};function o(t){setTimeout((function(){throw t}),0)}var a={closed:!0,next:function(t){},error:function(t){if(s.useDeprecatedSynchronousErrorHandling)throw t;o(t)},complete:function(){}},c=function(){return Array.isArray||function(t){return t&&"number"==typeof t.length}}();function h(t){return null!==t&&"object"==typeof t}var l=function(){function t(t){return Error.call(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(t,e){return e+1+") "+t.toString()})).join("\n  "):"",this.name="UnsubscriptionError",this.errors=t,this}return t.prototype=Object.create(Error.prototype),t}(),u=function(){function t(t){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,t&&(this._ctorUnsubscribe=!0,this._unsubscribe=t)}return t.prototype.unsubscribe=function(){var e;if(!this.closed){var i=this,r=i._parentOrParents,s=i._ctorUnsubscribe,o=i._unsubscribe,a=i._subscriptions;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,r instanceof t)r.remove(this);else if(null!==r)for(var u=0;u<r.length;++u){r[u].remove(this)}if(n(o)){s&&(this._unsubscribe=void 0);try{o.call(this)}catch(t){e=t instanceof l?d(t.errors):[t]}}if(c(a)){u=-1;for(var p=a.length;++u<p;){var f=a[u];if(h(f))try{f.unsubscribe()}catch(t){e=e||[],t instanceof l?e=e.concat(d(t.errors)):e.push(t)}}}if(e)throw new l(e)}},t.prototype.add=function(e){var i=e;if(!e)return t.EMPTY;switch(typeof e){case"function":i=new t(e);case"object":if(i===this||i.closed||"function"!=typeof i.unsubscribe)return i;if(this.closed)return i.unsubscribe(),i;if(!(i instanceof t)){var n=i;(i=new t)._subscriptions=[n]}break;default:throw new Error("unrecognized teardown "+e+" added to Subscription.")}var r=i._parentOrParents;if(null===r)i._parentOrParents=this;else if(r instanceof t){if(r===this)return i;i._parentOrParents=[r,this]}else{if(-1!==r.indexOf(this))return i;r.push(this)}var s=this._subscriptions;return null===s?this._subscriptions=[i]:s.push(i),i},t.prototype.remove=function(t){var e=this._subscriptions;if(e){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}},t.EMPTY=function(t){return t.closed=!0,t}(new t),t}();function d(t){return t.reduce((function(t,e){return t.concat(e instanceof l?e.errors:e)}),[])}var p=function(){return"function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random()}(),f=function(t){function e(i,n,r){var s=t.call(this)||this;switch(s.syncErrorValue=null,s.syncErrorThrown=!1,s.syncErrorThrowable=!1,s.isStopped=!1,arguments.length){case 0:s.destination=a;break;case 1:if(!i){s.destination=a;break}if("object"==typeof i){i instanceof e?(s.syncErrorThrowable=i.syncErrorThrowable,s.destination=i,i.add(s)):(s.syncErrorThrowable=!0,s.destination=new m(s,i));break}default:s.syncErrorThrowable=!0,s.destination=new m(s,i,n,r)}return s}return i(e,t),e.prototype[p]=function(){return this},e.create=function(t,i,n){var r=new e(t,i,n);return r.syncErrorThrowable=!1,r},e.prototype.next=function(t){this.isStopped||this._next(t)},e.prototype.error=function(t){this.isStopped||(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,t.prototype.unsubscribe.call(this))},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){this.destination.error(t),this.unsubscribe()},e.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},e.prototype._unsubscribeAndRecycle=function(){var t=this._parentOrParents;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=t,this},e}(u),m=function(t){function e(e,i,r,s){var o,c=t.call(this)||this;c._parentSubscriber=e;var h=c;return n(i)?o=i:i&&(o=i.next,r=i.error,s=i.complete,i!==a&&(n((h=Object.create(i)).unsubscribe)&&c.add(h.unsubscribe.bind(h)),h.unsubscribe=c.unsubscribe.bind(c))),c._context=h,c._next=o,c._error=r,c._complete=s,c}return i(e,t),e.prototype.next=function(t){if(!this.isStopped&&this._next){var e=this._parentSubscriber;s.useDeprecatedSynchronousErrorHandling&&e.syncErrorThrowable?this.__tryOrSetError(e,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}},e.prototype.error=function(t){if(!this.isStopped){var e=this._parentSubscriber,i=s.useDeprecatedSynchronousErrorHandling;if(this._error)i&&e.syncErrorThrowable?(this.__tryOrSetError(e,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else if(e.syncErrorThrowable)i?(e.syncErrorValue=t,e.syncErrorThrown=!0):o(t),this.unsubscribe();else{if(this.unsubscribe(),i)throw t;o(t)}}},e.prototype.complete=function(){var t=this;if(!this.isStopped){var e=this._parentSubscriber;if(this._complete){var i=function(){return t._complete.call(t._context)};s.useDeprecatedSynchronousErrorHandling&&e.syncErrorThrowable?(this.__tryOrSetError(e,i),this.unsubscribe()):(this.__tryOrUnsub(i),this.unsubscribe())}else this.unsubscribe()}},e.prototype.__tryOrUnsub=function(t,e){try{t.call(this._context,e)}catch(t){if(this.unsubscribe(),s.useDeprecatedSynchronousErrorHandling)throw t;o(t)}},e.prototype.__tryOrSetError=function(t,e,i){if(!s.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{e.call(this._context,i)}catch(e){return s.useDeprecatedSynchronousErrorHandling?(t.syncErrorValue=e,t.syncErrorThrown=!0,!0):(o(e),!0)}return!1},e.prototype._unsubscribe=function(){var t=this._parentSubscriber;this._context=null,this._parentSubscriber=null,t.unsubscribe()},e}(f);var g=function(){return"function"==typeof Symbol&&Symbol.observable||"@@observable"}();function _(t){return t}function v(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return y(t)}function y(t){return 0===t.length?_:1===t.length?t[0]:function(e){return t.reduce((function(t,e){return e(t)}),e)}}var b=function(){function t(t){this._isScalar=!1,t&&(this._subscribe=t)}return t.prototype.lift=function(e){var i=new t;return i.source=this,i.operator=e,i},t.prototype.subscribe=function(t,e,i){var n=this.operator,r=function(t,e,i){if(t){if(t instanceof f)return t;if(t[p])return t[p]()}return t||e||i?new f(t,e,i):new f(a)}(t,e,i);if(n?r.add(n.call(r,this.source)):r.add(this.source||s.useDeprecatedSynchronousErrorHandling&&!r.syncErrorThrowable?this._subscribe(r):this._trySubscribe(r)),s.useDeprecatedSynchronousErrorHandling&&r.syncErrorThrowable&&(r.syncErrorThrowable=!1,r.syncErrorThrown))throw r.syncErrorValue;return r},t.prototype._trySubscribe=function(t){try{return this._subscribe(t)}catch(e){s.useDeprecatedSynchronousErrorHandling&&(t.syncErrorThrown=!0,t.syncErrorValue=e),!function(t){for(;t;){var e=t,i=e.closed,n=e.destination,r=e.isStopped;if(i||r)return!1;t=n&&n instanceof f?n:null}return!0}(t)?console.warn(e):t.error(e)}},t.prototype.forEach=function(t,e){var i=this;return new(e=x(e))((function(e,n){var r;r=i.subscribe((function(e){try{t(e)}catch(t){n(t),r&&r.unsubscribe()}}),n,e)}))},t.prototype._subscribe=function(t){var e=this.source;return e&&e.subscribe(t)},t.prototype[g]=function(){return this},t.prototype.pipe=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return 0===t.length?this:y(t)(this)},t.prototype.toPromise=function(t){var e=this;return new(t=x(t))((function(t,i){var n;e.subscribe((function(t){return n=t}),(function(t){return i(t)}),(function(){return t(n)}))}))},t.create=function(e){return new t(e)},t}();function x(t){if(t||(t=Promise),!t)throw new Error("no Promise impl found");return t}var w=function(){function t(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return t.prototype=Object.create(Error.prototype),t}(),S=function(t){function e(e,i){var n=t.call(this)||this;return n.subject=e,n.subscriber=i,n.closed=!1,n}return i(e,t),e.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var t=this.subject,e=t.observers;if(this.subject=null,e&&0!==e.length&&!t.isStopped&&!t.closed){var i=e.indexOf(this.subscriber);-1!==i&&e.splice(i,1)}}},e}(u),M=function(t){function e(e){var i=t.call(this,e)||this;return i.destination=e,i}return i(e,t),e}(f),T=function(t){function e(){var e=t.call(this)||this;return e.observers=[],e.closed=!1,e.isStopped=!1,e.hasError=!1,e.thrownError=null,e}return i(e,t),e.prototype[p]=function(){return new M(this)},e.prototype.lift=function(t){var e=new C(this,this);return e.operator=t,e},e.prototype.next=function(t){if(this.closed)throw new w;if(!this.isStopped)for(var e=this.observers,i=e.length,n=e.slice(),r=0;r<i;r++)n[r].next(t)},e.prototype.error=function(t){if(this.closed)throw new w;this.hasError=!0,this.thrownError=t,this.isStopped=!0;for(var e=this.observers,i=e.length,n=e.slice(),r=0;r<i;r++)n[r].error(t);this.observers.length=0},e.prototype.complete=function(){if(this.closed)throw new w;this.isStopped=!0;for(var t=this.observers,e=t.length,i=t.slice(),n=0;n<e;n++)i[n].complete();this.observers.length=0},e.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},e.prototype._trySubscribe=function(e){if(this.closed)throw new w;return t.prototype._trySubscribe.call(this,e)},e.prototype._subscribe=function(t){if(this.closed)throw new w;return this.hasError?(t.error(this.thrownError),u.EMPTY):this.isStopped?(t.complete(),u.EMPTY):(this.observers.push(t),new S(this,t))},e.prototype.asObservable=function(){var t=new b;return t.source=this,t},e.create=function(t,e){return new C(t,e)},e}(b),C=function(t){function e(e,i){var n=t.call(this)||this;return n.destination=e,n.source=i,n}return i(e,t),e.prototype.next=function(t){var e=this.destination;e&&e.next&&e.next(t)},e.prototype.error=function(t){var e=this.destination;e&&e.error&&this.destination.error(t)},e.prototype.complete=function(){var t=this.destination;t&&t.complete&&this.destination.complete()},e.prototype._subscribe=function(t){return this.source?this.source.subscribe(t):u.EMPTY},e}(T);function E(){return function(t){return t.lift(new I(t))}}var I=function(){function t(t){this.connectable=t}return t.prototype.call=function(t,e){var i=this.connectable;i._refCount++;var n=new A(t,i),r=e.subscribe(n);return n.closed||(n.connection=i.connect()),r},t}(),A=function(t){function e(e,i){var n=t.call(this,e)||this;return n.connectable=i,n}return i(e,t),e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._refCount;if(e<=0)this.connection=null;else if(t._refCount=e-1,e>1)this.connection=null;else{var i=this.connection,n=t._connection;this.connection=null,!n||i&&n!==i||n.unsubscribe()}}else this.connection=null},e}(f),P=function(t){function e(e,i){var n=t.call(this)||this;return n.source=e,n.subjectFactory=i,n._refCount=0,n._isComplete=!1,n}return i(e,t),e.prototype._subscribe=function(t){return this.getSubject().subscribe(t)},e.prototype.getSubject=function(){var t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject},e.prototype.connect=function(){var t=this._connection;return t||(this._isComplete=!1,(t=this._connection=new u).add(this.source.subscribe(new L(this.getSubject(),this))),t.closed&&(this._connection=null,t=u.EMPTY)),t},e.prototype.refCount=function(){return E()(this)},e}(b),R=function(){var t=P.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:t._subscribe},_isComplete:{value:t._isComplete,writable:!0},getSubject:{value:t.getSubject},connect:{value:t.connect},refCount:{value:t.refCount}}}(),L=function(t){function e(e,i){var n=t.call(this,e)||this;return n.connectable=i,n}return i(e,t),e.prototype._error=function(e){this._unsubscribe(),t.prototype._error.call(this,e)},e.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}},e}(M),O=function(t){function e(e){var i=t.call(this)||this;return i._value=e,i}return i(e,t),Object.defineProperty(e.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),e.prototype._subscribe=function(e){var i=t.prototype._subscribe.call(this,e);return i&&!i.closed&&e.next(this._value),i},e.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new w;return this._value},e.prototype.next=function(e){t.prototype.next.call(this,this._value=e)},e}(T),N=function(t){function e(e,i){var n=t.call(this,e,i)||this;return n.scheduler=e,n.work=i,n.pending=!1,n}return i(e,t),e.prototype.schedule=function(t,e){if(void 0===e&&(e=0),this.closed)return this;this.state=t;var i=this.id,n=this.scheduler;return null!=i&&(this.id=this.recycleAsyncId(n,i,e)),this.pending=!0,this.delay=e,this.id=this.id||this.requestAsyncId(n,this.id,e),this},e.prototype.requestAsyncId=function(t,e,i){return void 0===i&&(i=0),setInterval(t.flush.bind(t,this),i)},e.prototype.recycleAsyncId=function(t,e,i){if(void 0===i&&(i=0),null!==i&&this.delay===i&&!1===this.pending)return e;clearInterval(e)},e.prototype.execute=function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var i=this._execute(t,e);if(i)return i;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},e.prototype._execute=function(t,e){var i=!1,n=void 0;try{this.work(t)}catch(t){i=!0,n=!!t&&t||new Error(t)}if(i)return this.unsubscribe(),n},e.prototype._unsubscribe=function(){var t=this.id,e=this.scheduler,i=e.actions,n=i.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==n&&i.splice(n,1),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null},e}(function(t){function e(e,i){return t.call(this)||this}return i(e,t),e.prototype.schedule=function(t,e){return this},e}(u)),D=function(t){function e(e,i){var n=t.call(this,e,i)||this;return n.scheduler=e,n.work=i,n}return i(e,t),e.prototype.schedule=function(e,i){return void 0===i&&(i=0),i>0?t.prototype.schedule.call(this,e,i):(this.delay=i,this.state=e,this.scheduler.flush(this),this)},e.prototype.execute=function(e,i){return i>0||this.closed?t.prototype.execute.call(this,e,i):this._execute(e,i)},e.prototype.requestAsyncId=function(e,i,n){return void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0?t.prototype.requestAsyncId.call(this,e,i,n):e.flush(this)},e}(N),$=function(){function t(e,i){void 0===i&&(i=t.now),this.SchedulerAction=e,this.now=i}return t.prototype.schedule=function(t,e,i){return void 0===e&&(e=0),new this.SchedulerAction(this,t).schedule(i,e)},t.now=function(){return Date.now()},t}(),k=function(t){function e(i,n){void 0===n&&(n=$.now);var r=t.call(this,i,(function(){return e.delegate&&e.delegate!==r?e.delegate.now():n()}))||this;return r.actions=[],r.active=!1,r.scheduled=void 0,r}return i(e,t),e.prototype.schedule=function(i,n,r){return void 0===n&&(n=0),e.delegate&&e.delegate!==this?e.delegate.schedule(i,n,r):t.prototype.schedule.call(this,i,n,r)},e.prototype.flush=function(t){var e=this.actions;if(this.active)e.push(t);else{var i;this.active=!0;do{if(i=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,i){for(;t=e.shift();)t.unsubscribe();throw i}}},e}($),z=new(function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(k))(D),F=new b((function(t){return t.complete()}));function B(t){return t?function(t){return new b((function(e){return t.schedule((function(){return e.complete()}))}))}(t):F}function j(t){return t&&"function"==typeof t.schedule}var H=function(t){return function(e){for(var i=0,n=t.length;i<n&&!e.closed;i++)e.next(t[i]);e.complete()}};function U(t,e){return new b((function(i){var n=new u,r=0;return n.add(e.schedule((function(){r!==t.length?(i.next(t[r++]),i.closed||n.add(this.schedule())):i.complete()}))),n}))}function V(t,e){return e?U(t,e):new b(H(t))}function G(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=t[t.length-1];return j(i)?(t.pop(),U(t,i)):V(t)}function q(t,e){return new b(e?function(i){return e.schedule(W,0,{error:t,subscriber:i})}:function(e){return e.error(t)})}function W(t){var e=t.error;t.subscriber.error(e)}var X=function(){function t(t,e,i){this.kind=t,this.value=e,this.error=i,this.hasValue="N"===t}return t.prototype.observe=function(t){switch(this.kind){case"N":return t.next&&t.next(this.value);case"E":return t.error&&t.error(this.error);case"C":return t.complete&&t.complete()}},t.prototype.do=function(t,e,i){switch(this.kind){case"N":return t&&t(this.value);case"E":return e&&e(this.error);case"C":return i&&i()}},t.prototype.accept=function(t,e,i){return t&&"function"==typeof t.next?this.observe(t):this.do(t,e,i)},t.prototype.toObservable=function(){switch(this.kind){case"N":return G(this.value);case"E":return q(this.error);case"C":return B()}throw new Error("unexpected notification kind value")},t.createNext=function(e){return void 0!==e?new t("N",e):t.undefinedValueNotification},t.createError=function(e){return new t("E",void 0,e)},t.createComplete=function(){return t.completeNotification},t.completeNotification=new t("C"),t.undefinedValueNotification=new t("N",void 0),t}(),Y=function(t){function e(e,i,n){void 0===n&&(n=0);var r=t.call(this,e)||this;return r.scheduler=i,r.delay=n,r}return i(e,t),e.dispatch=function(t){var e=t.notification,i=t.destination;e.observe(i),this.unsubscribe()},e.prototype.scheduleMessage=function(t){this.destination.add(this.scheduler.schedule(e.dispatch,this.delay,new Z(t,this.destination)))},e.prototype._next=function(t){this.scheduleMessage(X.createNext(t))},e.prototype._error=function(t){this.scheduleMessage(X.createError(t)),this.unsubscribe()},e.prototype._complete=function(){this.scheduleMessage(X.createComplete()),this.unsubscribe()},e}(f),Z=function(){return function(t,e){this.notification=t,this.destination=e}}(),J=function(t){function e(e,i,n){void 0===e&&(e=Number.POSITIVE_INFINITY),void 0===i&&(i=Number.POSITIVE_INFINITY);var r=t.call(this)||this;return r.scheduler=n,r._events=[],r._infiniteTimeWindow=!1,r._bufferSize=e<1?1:e,r._windowTime=i<1?1:i,i===Number.POSITIVE_INFINITY?(r._infiniteTimeWindow=!0,r.next=r.nextInfiniteTimeWindow):r.next=r.nextTimeWindow,r}return i(e,t),e.prototype.nextInfiniteTimeWindow=function(e){if(!this.isStopped){var i=this._events;i.push(e),i.length>this._bufferSize&&i.shift()}t.prototype.next.call(this,e)},e.prototype.nextTimeWindow=function(e){this.isStopped||(this._events.push(new K(this._getNow(),e)),this._trimBufferThenGetEvents()),t.prototype.next.call(this,e)},e.prototype._subscribe=function(t){var e,i=this._infiniteTimeWindow,n=i?this._events:this._trimBufferThenGetEvents(),r=this.scheduler,s=n.length;if(this.closed)throw new w;if(this.isStopped||this.hasError?e=u.EMPTY:(this.observers.push(t),e=new S(this,t)),r&&t.add(t=new Y(t,r)),i)for(var o=0;o<s&&!t.closed;o++)t.next(n[o]);else for(o=0;o<s&&!t.closed;o++)t.next(n[o].value);return this.hasError?t.error(this.thrownError):this.isStopped&&t.complete(),e},e.prototype._getNow=function(){return(this.scheduler||z).now()},e.prototype._trimBufferThenGetEvents=function(){for(var t=this._getNow(),e=this._bufferSize,i=this._windowTime,n=this._events,r=n.length,s=0;s<r&&!(t-n[s].time<i);)s++;return r>e&&(s=Math.max(s,r-e)),s>0&&n.splice(0,s),n},e}(T),K=function(){return function(t,e){this.time=t,this.value=e}}(),Q=new k(N);function tt(){}var et=function(){function t(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return t.prototype=Object.create(Error.prototype),t}(),it=function(){function t(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return t.prototype=Object.create(Error.prototype),t}(),nt=function(){function t(){return Error.call(this),this.message="Timeout has occurred",this.name="TimeoutError",this}return t.prototype=Object.create(Error.prototype),t}();function rt(t,e){return function(i){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return i.lift(new st(t,e))}}var st=function(){function t(t,e){this.project=t,this.thisArg=e}return t.prototype.call=function(t,e){return e.subscribe(new ot(t,this.project,this.thisArg))},t}(),ot=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.project=i,r.count=0,r.thisArg=n||r,r}return i(e,t),e.prototype._next=function(t){var e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(f),at=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.notifyNext=function(t,e,i,n,r){this.destination.next(e)},e.prototype.notifyError=function(t,e){this.destination.error(t)},e.prototype.notifyComplete=function(t){this.destination.complete()},e}(f),ct=function(t){function e(e,i,n){var r=t.call(this)||this;return r.parent=e,r.outerValue=i,r.outerIndex=n,r.index=0,r}return i(e,t),e.prototype._next=function(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)},e.prototype._error=function(t){this.parent.notifyError(t,this),this.unsubscribe()},e.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},e}(f);function ht(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}var lt=ht(),ut=function(t){return t&&"number"==typeof t.length&&"function"!=typeof t};function dt(t){return!!t&&"function"!=typeof t.subscribe&&"function"==typeof t.then}var pt=function(t){if(t&&"function"==typeof t[g])return n=t,function(t){var e=n[g]();if("function"!=typeof e.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return e.subscribe(t)};if(ut(t))return H(t);if(dt(t))return i=t,function(t){return i.then((function(e){t.closed||(t.next(e),t.complete())}),(function(e){return t.error(e)})).then(null,o),t};if(t&&"function"==typeof t[lt])return e=t,function(t){for(var i=e[lt]();;){var n=void 0;try{n=i.next()}catch(e){return t.error(e),t}if(n.done){t.complete();break}if(t.next(n.value),t.closed)break}return"function"==typeof i.return&&t.add((function(){i.return&&i.return()})),t};var e,i,n,r=h(t)?"an invalid object":"'"+t+"'";throw new TypeError("You provided "+r+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.")};function ft(t,e,i,n,r){if(void 0===r&&(r=new ct(t,i,n)),!r.closed)return e instanceof b?e.subscribe(r):pt(e)(r)}var mt={};function gt(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=void 0,n=void 0;return j(t[t.length-1])&&(n=t.pop()),"function"==typeof t[t.length-1]&&(i=t.pop()),1===t.length&&c(t[0])&&(t=t[0]),V(t,n).lift(new _t(i))}var _t=function(){function t(t){this.resultSelector=t}return t.prototype.call=function(t,e){return e.subscribe(new vt(t,this.resultSelector))},t}(),vt=function(t){function e(e,i){var n=t.call(this,e)||this;return n.resultSelector=i,n.active=0,n.values=[],n.observables=[],n}return i(e,t),e.prototype._next=function(t){this.values.push(mt),this.observables.push(t)},e.prototype._complete=function(){var t=this.observables,e=t.length;if(0===e)this.destination.complete();else{this.active=e,this.toRespond=e;for(var i=0;i<e;i++){var n=t[i];this.add(ft(this,n,void 0,i))}}},e.prototype.notifyComplete=function(t){0==(this.active-=1)&&this.destination.complete()},e.prototype.notifyNext=function(t,e,i){var n=this.values,r=n[i],s=this.toRespond?r===mt?--this.toRespond:this.toRespond:0;n[i]=e,0===s&&(this.resultSelector?this._tryResultSelector(n):this.destination.next(n.slice()))},e.prototype._tryResultSelector=function(t){var e;try{e=this.resultSelector.apply(this,t)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(at);function yt(t,e){if(null!=t){if(function(t){return t&&"function"==typeof t[g]}(t))return function(t,e){return new b((function(i){var n=new u;return n.add(e.schedule((function(){var r=t[g]();n.add(r.subscribe({next:function(t){n.add(e.schedule((function(){return i.next(t)})))},error:function(t){n.add(e.schedule((function(){return i.error(t)})))},complete:function(){n.add(e.schedule((function(){return i.complete()})))}}))}))),n}))}(t,e);if(dt(t))return function(t,e){return new b((function(i){var n=new u;return n.add(e.schedule((function(){return t.then((function(t){n.add(e.schedule((function(){i.next(t),n.add(e.schedule((function(){return i.complete()})))})))}),(function(t){n.add(e.schedule((function(){return i.error(t)})))}))}))),n}))}(t,e);if(ut(t))return U(t,e);if(function(t){return t&&"function"==typeof t[lt]}(t)||"string"==typeof t)return function(t,e){if(!t)throw new Error("Iterable cannot be null");return new b((function(i){var n,r=new u;return r.add((function(){n&&"function"==typeof n.return&&n.return()})),r.add(e.schedule((function(){n=t[lt](),r.add(e.schedule((function(){if(!i.closed){var t,e;try{var r=n.next();t=r.value,e=r.done}catch(t){return void i.error(t)}e?i.complete():(i.next(t),this.schedule())}})))}))),r}))}(t,e)}throw new TypeError((null!==t&&typeof t||t)+" is not observable")}function bt(t,e){return e?yt(t,e):t instanceof b?t:new b(pt(t))}var xt=function(t){function e(e){var i=t.call(this)||this;return i.parent=e,i}return i(e,t),e.prototype._next=function(t){this.parent.notifyNext(t)},e.prototype._error=function(t){this.parent.notifyError(t),this.unsubscribe()},e.prototype._complete=function(){this.parent.notifyComplete(),this.unsubscribe()},e}(f),wt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.notifyNext=function(t){this.destination.next(t)},e.prototype.notifyError=function(t){this.destination.error(t)},e.prototype.notifyComplete=function(){this.destination.complete()},e}(f);function St(t,e){if(!e.closed)return t instanceof b?t.subscribe(e):pt(t)(e)}function Mt(t,e,i){return void 0===i&&(i=Number.POSITIVE_INFINITY),"function"==typeof e?function(n){return n.pipe(Mt((function(i,n){return bt(t(i,n)).pipe(rt((function(t,r){return e(i,t,n,r)})))}),i))}:("number"==typeof e&&(i=e),function(e){return e.lift(new Tt(t,i))})}var Tt=function(){function t(t,e){void 0===e&&(e=Number.POSITIVE_INFINITY),this.project=t,this.concurrent=e}return t.prototype.call=function(t,e){return e.subscribe(new Ct(t,this.project,this.concurrent))},t}(),Ct=function(t){function e(e,i,n){void 0===n&&(n=Number.POSITIVE_INFINITY);var r=t.call(this,e)||this;return r.project=i,r.concurrent=n,r.hasCompleted=!1,r.buffer=[],r.active=0,r.index=0,r}return i(e,t),e.prototype._next=function(t){this.active<this.concurrent?this._tryNext(t):this.buffer.push(t)},e.prototype._tryNext=function(t){var e,i=this.index++;try{e=this.project(t,i)}catch(t){return void this.destination.error(t)}this.active++,this._innerSub(e)},e.prototype._innerSub=function(t){var e=new xt(this),i=this.destination;i.add(e);var n=St(t,e);n!==e&&i.add(n)},e.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete(),this.unsubscribe()},e.prototype.notifyNext=function(t){this.destination.next(t)},e.prototype.notifyComplete=function(){var t=this.buffer;this.active--,t.length>0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(wt);function Et(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Mt(_,t)}function It(){return Et(1)}function At(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return It()(G.apply(void 0,t))}function Pt(t,e,i,r){return n(i)&&(r=i,i=void 0),r?Pt(t,e,i).pipe(rt((function(t){return c(t)?r.apply(void 0,t):r(t)}))):new b((function(n){Rt(t,e,(function(t){arguments.length>1?n.next(Array.prototype.slice.call(arguments)):n.next(t)}),n,i)}))}function Rt(t,e,i,n,r){var s;if(function(t){return t&&"function"==typeof t.addEventListener&&"function"==typeof t.removeEventListener}(t)){var o=t;t.addEventListener(e,i,r),s=function(){return o.removeEventListener(e,i,r)}}else if(function(t){return t&&"function"==typeof t.on&&"function"==typeof t.off}(t)){var a=t;t.on(e,i),s=function(){return a.off(e,i)}}else if(function(t){return t&&"function"==typeof t.addListener&&"function"==typeof t.removeListener}(t)){var c=t;t.addListener(e,i),s=function(){return c.removeListener(e,i)}}else{if(!t||!t.length)throw new TypeError("Invalid event target");for(var h=0,l=t.length;h<l;h++)Rt(t[h],e,i,n,r)}n.add(s)}function Lt(t){return!c(t)&&t-parseFloat(t)+1>=0}function Ot(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=Number.POSITIVE_INFINITY,n=null,r=t[t.length-1];return j(r)?(n=t.pop(),t.length>1&&"number"==typeof t[t.length-1]&&(i=t.pop())):"number"==typeof r&&(i=t.pop()),null===n&&1===t.length&&t[0]instanceof b?t[0]:Et(i)(V(t,n))}function Nt(t,e){return function(i){return i.lift(new Dt(t,e))}}var Dt=function(){function t(t,e){this.predicate=t,this.thisArg=e}return t.prototype.call=function(t,e){return e.subscribe(new $t(t,this.predicate,this.thisArg))},t}(),$t=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.predicate=i,r.thisArg=n,r.count=0,r}return i(e,t),e.prototype._next=function(t){var e;try{e=this.predicate.call(this.thisArg,t,this.count++)}catch(t){return void this.destination.error(t)}e&&this.destination.next(t)},e}(f);function kt(t,e,i){void 0===t&&(t=0);var n=-1;return Lt(e)?n=Number(e)<1?1:Number(e):j(e)&&(i=e),j(i)||(i=Q),new b((function(e){var r=Lt(t)?t:+t-i.now();return i.schedule(zt,r,{index:0,period:n,subscriber:e})}))}function zt(t){var e=t.index,i=t.period,n=t.subscriber;if(n.next(e),!n.closed){if(-1===i)return n.complete();t.index=e+1,this.schedule(t,i)}}function Ft(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=t[t.length-1];return"function"==typeof i&&t.pop(),V(t,void 0).lift(new Bt(i))}var Bt=function(){function t(t){this.resultSelector=t}return t.prototype.call=function(t,e){return e.subscribe(new jt(t,this.resultSelector))},t}(),jt=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.resultSelector=i,r.iterators=[],r.active=0,r.resultSelector="function"==typeof i?i:void 0,r}return i(e,t),e.prototype._next=function(t){var e=this.iterators;c(t)?e.push(new Ut(t)):"function"==typeof t[lt]?e.push(new Ht(t[lt]())):e.push(new Vt(this.destination,this,t))},e.prototype._complete=function(){var t=this.iterators,e=t.length;if(this.unsubscribe(),0!==e){this.active=e;for(var i=0;i<e;i++){var n=t[i];if(n.stillUnsubscribed)this.destination.add(n.subscribe());else this.active--}}else this.destination.complete()},e.prototype.notifyInactive=function(){this.active--,0===this.active&&this.destination.complete()},e.prototype.checkIterators=function(){for(var t=this.iterators,e=t.length,i=this.destination,n=0;n<e;n++){if("function"==typeof(o=t[n]).hasValue&&!o.hasValue())return}var r=!1,s=[];for(n=0;n<e;n++){var o,a=(o=t[n]).next();if(o.hasCompleted()&&(r=!0),a.done)return void i.complete();s.push(a.value)}this.resultSelector?this._tryresultSelector(s):i.next(s),r&&i.complete()},e.prototype._tryresultSelector=function(t){var e;try{e=this.resultSelector.apply(this,t)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(f),Ht=function(){function t(t){this.iterator=t,this.nextResult=t.next()}return t.prototype.hasValue=function(){return!0},t.prototype.next=function(){var t=this.nextResult;return this.nextResult=this.iterator.next(),t},t.prototype.hasCompleted=function(){var t=this.nextResult;return Boolean(t&&t.done)},t}(),Ut=function(){function t(t){this.array=t,this.index=0,this.length=0,this.length=t.length}return t.prototype[lt]=function(){return this},t.prototype.next=function(t){var e=this.index++,i=this.array;return e<this.length?{value:i[e],done:!1}:{value:null,done:!0}},t.prototype.hasValue=function(){return this.array.length>this.index},t.prototype.hasCompleted=function(){return this.array.length===this.index},t}(),Vt=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.parent=i,r.observable=n,r.stillUnsubscribed=!0,r.buffer=[],r.isComplete=!1,r}return i(e,t),e.prototype[lt]=function(){return this},e.prototype.next=function(){var t=this.buffer;return 0===t.length&&this.isComplete?{value:null,done:!0}:{value:t.shift(),done:!1}},e.prototype.hasValue=function(){return this.buffer.length>0},e.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},e.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},e.prototype.notifyNext=function(t){this.buffer.push(t),this.parent.checkIterators()},e.prototype.subscribe=function(){return St(this.observable,new xt(this))},e}(wt);var Gt=function(){function t(t){this.durationSelector=t}return t.prototype.call=function(t,e){return e.subscribe(new qt(t,this.durationSelector))},t}(),qt=function(t){function e(e,i){var n=t.call(this,e)||this;return n.durationSelector=i,n.hasValue=!1,n}return i(e,t),e.prototype._next=function(t){if(this.value=t,this.hasValue=!0,!this.throttled){var e=void 0;try{e=(0,this.durationSelector)(t)}catch(t){return this.destination.error(t)}var i=St(e,new xt(this));!i||i.closed?this.clearThrottle():this.add(this.throttled=i)}},e.prototype.clearThrottle=function(){var t=this,e=t.value,i=t.hasValue,n=t.throttled;n&&(this.remove(n),this.throttled=void 0,n.unsubscribe()),i&&(this.value=void 0,this.hasValue=!1,this.destination.next(e))},e.prototype.notifyNext=function(){this.clearThrottle()},e.prototype.notifyComplete=function(){this.clearThrottle()},e}(wt);function Wt(t,e){return void 0===e&&(e=Q),i=function(){return kt(t,e)},function(t){return t.lift(new Gt(i))};var i}function Xt(t,e){return void 0===e&&(e=null),function(i){return i.lift(new Yt(t,e))}}var Yt=function(){function t(t,e){this.bufferSize=t,this.startBufferEvery=e,this.subscriberClass=e&&t!==e?Jt:Zt}return t.prototype.call=function(t,e){return e.subscribe(new this.subscriberClass(t,this.bufferSize,this.startBufferEvery))},t}(),Zt=function(t){function e(e,i){var n=t.call(this,e)||this;return n.bufferSize=i,n.buffer=[],n}return i(e,t),e.prototype._next=function(t){var e=this.buffer;e.push(t),e.length==this.bufferSize&&(this.destination.next(e),this.buffer=[])},e.prototype._complete=function(){var e=this.buffer;e.length>0&&this.destination.next(e),t.prototype._complete.call(this)},e}(f),Jt=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.bufferSize=i,r.startBufferEvery=n,r.buffers=[],r.count=0,r}return i(e,t),e.prototype._next=function(t){var e=this,i=e.bufferSize,n=e.startBufferEvery,r=e.buffers,s=e.count;this.count++,s%n==0&&r.push([]);for(var o=r.length;o--;){var a=r[o];a.push(t),a.length===i&&(r.splice(o,1),this.destination.next(a))}},e.prototype._complete=function(){for(var e=this.buffers,i=this.destination;e.length>0;){var n=e.shift();n.length>0&&i.next(n)}t.prototype._complete.call(this)},e}(f);var Kt=function(){function t(t){this.closingSelector=t}return t.prototype.call=function(t,e){return e.subscribe(new Qt(t,this.closingSelector))},t}(),Qt=function(t){function e(e,i){var n=t.call(this,e)||this;return n.closingSelector=i,n.subscribing=!1,n.openBuffer(),n}return i(e,t),e.prototype._next=function(t){this.buffer.push(t)},e.prototype._complete=function(){var e=this.buffer;e&&this.destination.next(e),t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){this.buffer=void 0,this.subscribing=!1},e.prototype.notifyNext=function(){this.openBuffer()},e.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()},e.prototype.openBuffer=function(){var t=this.closingSubscription;t&&(this.remove(t),t.unsubscribe());var e,i=this.buffer;this.buffer&&this.destination.next(i),this.buffer=[];try{e=(0,this.closingSelector)()}catch(t){return this.error(t)}t=new u,this.closingSubscription=t,this.add(t),this.subscribing=!0,t.add(St(e,new xt(this))),this.subscribing=!1},e}(wt);function te(t){return function(e){var i=new ee(t),n=e.lift(i);return i.caught=n}}var ee=function(){function t(t){this.selector=t}return t.prototype.call=function(t,e){return e.subscribe(new ie(t,this.selector,this.caught))},t}(),ie=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.selector=i,r.caught=n,r}return i(e,t),e.prototype.error=function(e){if(!this.isStopped){var i=void 0;try{i=this.selector(e,this.caught)}catch(e){return void t.prototype.error.call(this,e)}this._unsubscribeAndRecycle();var n=new xt(this);this.add(n);var r=St(i,n);r!==n&&this.add(r)}},e}(wt);function ne(t,e){return Mt(t,e,1)}function re(t,e){return void 0===e&&(e=Q),function(i){return i.lift(new se(t,e))}}var se=function(){function t(t,e){this.dueTime=t,this.scheduler=e}return t.prototype.call=function(t,e){return e.subscribe(new oe(t,this.dueTime,this.scheduler))},t}(),oe=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.dueTime=i,r.scheduler=n,r.debouncedSubscription=null,r.lastValue=null,r.hasValue=!1,r}return i(e,t),e.prototype._next=function(t){this.clearDebounce(),this.lastValue=t,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(ae,this.dueTime,this))},e.prototype._complete=function(){this.debouncedNext(),this.destination.complete()},e.prototype.debouncedNext=function(){if(this.clearDebounce(),this.hasValue){var t=this.lastValue;this.lastValue=null,this.hasValue=!1,this.destination.next(t)}},e.prototype.clearDebounce=function(){var t=this.debouncedSubscription;null!==t&&(this.remove(t),t.unsubscribe(),this.debouncedSubscription=null)},e}(f);function ae(t){t.debouncedNext()}function ce(t){return void 0===t&&(t=null),function(e){return e.lift(new he(t))}}var he=function(){function t(t){this.defaultValue=t}return t.prototype.call=function(t,e){return e.subscribe(new le(t,this.defaultValue))},t}(),le=function(t){function e(e,i){var n=t.call(this,e)||this;return n.defaultValue=i,n.isEmpty=!0,n}return i(e,t),e.prototype._next=function(t){this.isEmpty=!1,this.destination.next(t)},e.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},e}(f);function ue(t,e){return function(i){return i.lift(new de(t,e))}}var de=function(){function t(t,e){this.compare=t,this.keySelector=e}return t.prototype.call=function(t,e){return e.subscribe(new pe(t,this.compare,this.keySelector))},t}(),pe=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.keySelector=n,r.hasKey=!1,"function"==typeof i&&(r.compare=i),r}return i(e,t),e.prototype.compare=function(t,e){return t===e},e.prototype._next=function(t){var e;try{var i=this.keySelector;e=i?i(t):t}catch(t){return this.destination.error(t)}var n=!1;if(this.hasKey)try{n=(0,this.compare)(this.key,e)}catch(t){return this.destination.error(t)}else this.hasKey=!0;n||(this.key=e,this.destination.next(t))},e}(f);function fe(t){return void 0===t&&(t=_e),function(e){return e.lift(new me(t))}}var me=function(){function t(t){this.errorFactory=t}return t.prototype.call=function(t,e){return e.subscribe(new ge(t,this.errorFactory))},t}(),ge=function(t){function e(e,i){var n=t.call(this,e)||this;return n.errorFactory=i,n.hasValue=!1,n}return i(e,t),e.prototype._next=function(t){this.hasValue=!0,this.destination.next(t)},e.prototype._complete=function(){if(this.hasValue)return this.destination.complete();var t=void 0;try{t=this.errorFactory()}catch(e){t=e}this.destination.error(t)},e}(f);function _e(){return new it}function ve(t){return function(e){return 0===t?B():e.lift(new ye(t))}}var ye=function(){function t(t){if(this.total=t,this.total<0)throw new et}return t.prototype.call=function(t,e){return e.subscribe(new be(t,this.total))},t}(),be=function(t){function e(e,i){var n=t.call(this,e)||this;return n.total=i,n.count=0,n}return i(e,t),e.prototype._next=function(t){var e=this.total,i=++this.count;i<=e&&(this.destination.next(t),i===e&&(this.destination.complete(),this.unsubscribe()))},e}(f);function xe(t,e,i){return void 0===e&&(e=Number.POSITIVE_INFINITY),e=(e||0)<1?Number.POSITIVE_INFINITY:e,function(n){return n.lift(new we(t,e,i))}}var we=function(){function t(t,e,i){this.project=t,this.concurrent=e,this.scheduler=i}return t.prototype.call=function(t,e){return e.subscribe(new Se(t,this.project,this.concurrent,this.scheduler))},t}(),Se=function(t){function e(e,i,n,r){var s=t.call(this,e)||this;return s.project=i,s.concurrent=n,s.scheduler=r,s.index=0,s.active=0,s.hasCompleted=!1,n<Number.POSITIVE_INFINITY&&(s.buffer=[]),s}return i(e,t),e.dispatch=function(t){var e=t.subscriber,i=t.result,n=t.value,r=t.index;e.subscribeToProjection(i,n,r)},e.prototype._next=function(t){var i=this.destination;if(i.closed)this._complete();else{var n=this.index++;if(this.active<this.concurrent){i.next(t);try{var r=(0,this.project)(t,n);if(this.scheduler){var s={subscriber:this,result:r,value:t,index:n};this.destination.add(this.scheduler.schedule(e.dispatch,0,s))}else this.subscribeToProjection(r,t,n)}catch(t){i.error(t)}}else this.buffer.push(t)}},e.prototype.subscribeToProjection=function(t,e,i){this.active++,this.destination.add(St(t,new xt(this)))},e.prototype._complete=function(){this.hasCompleted=!0,this.hasCompleted&&0===this.active&&this.destination.complete(),this.unsubscribe()},e.prototype.notifyNext=function(t){this._next(t)},e.prototype.notifyComplete=function(){var t=this.buffer;this.active--,t&&t.length>0&&this._next(t.shift()),this.hasCompleted&&0===this.active&&this.destination.complete()},e}(wt);function Me(t){return function(e){return e.lift(new Te(t))}}var Te=function(){function t(t){this.callback=t}return t.prototype.call=function(t,e){return e.subscribe(new Ce(t,this.callback))},t}(),Ce=function(t){function e(e,i){var n=t.call(this,e)||this;return n.add(new u(i)),n}return i(e,t),e}(f);function Ee(t,e){var i=arguments.length>=2;return function(n){return n.pipe(t?Nt((function(e,i){return t(e,i,n)})):_,ve(1),i?ce(e):fe((function(){return new it})))}}function Ie(t){return function(e){return 0===t?B():e.lift(new Ae(t))}}var Ae=function(){function t(t){if(this.total=t,this.total<0)throw new et}return t.prototype.call=function(t,e){return e.subscribe(new Pe(t,this.total))},t}(),Pe=function(t){function e(e,i){var n=t.call(this,e)||this;return n.total=i,n.ring=new Array,n.count=0,n}return i(e,t),e.prototype._next=function(t){var e=this.ring,i=this.total,n=this.count++;e.length<i?e.push(t):e[n%i]=t},e.prototype._complete=function(){var t=this.destination,e=this.count;if(e>0)for(var i=this.count>=this.total?this.total:this.count,n=this.ring,r=0;r<i;r++){var s=e++%i;t.next(n[s])}t.complete()},e}(f);function Re(t,e){var i=arguments.length>=2;return function(n){return n.pipe(t?Nt((function(e,i){return t(e,i,n)})):_,Ie(1),i?ce(e):fe((function(){return new it})))}}function Le(t,e){var i=!1;return arguments.length>=2&&(i=!0),function(n){return n.lift(new Oe(t,e,i))}}var Oe=function(){function t(t,e,i){void 0===i&&(i=!1),this.accumulator=t,this.seed=e,this.hasSeed=i}return t.prototype.call=function(t,e){return e.subscribe(new Ne(t,this.accumulator,this.seed,this.hasSeed))},t}(),Ne=function(t){function e(e,i,n,r){var s=t.call(this,e)||this;return s.accumulator=i,s._seed=n,s.hasSeed=r,s.index=0,s}return i(e,t),Object.defineProperty(e.prototype,"seed",{get:function(){return this._seed},set:function(t){this.hasSeed=!0,this._seed=t},enumerable:!0,configurable:!0}),e.prototype._next=function(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)},e.prototype._tryNext=function(t){var e,i=this.index++;try{e=this.accumulator(this.seed,t,i)}catch(t){this.destination.error(t)}this.seed=e,this.destination.next(e)},e}(f);function De(t,e){return arguments.length>=2?function(i){return v(Le(t,e),Ie(1),ce(e))(i)}:function(e){return v(Le((function(e,i,n){return t(e,i,n+1)})),Ie(1))(e)}}function $e(t,e){return function(i){var n;if(n="function"==typeof t?t:function(){return t},"function"==typeof e)return i.lift(new ke(n,e));var r=Object.create(i,R);return r.source=i,r.subjectFactory=n,r}}var ke=function(){function t(t,e){this.subjectFactory=t,this.selector=e}return t.prototype.call=function(t,e){var i=this.selector,n=this.subjectFactory(),r=i(n).subscribe(t);return r.add(e.subscribe(n)),r},t}();function ze(){return function(t){return t.lift(new Fe)}}var Fe=function(){function t(){}return t.prototype.call=function(t,e){return e.subscribe(new Be(t))},t}(),Be=function(t){function e(e){var i=t.call(this,e)||this;return i.hasPrev=!1,i}return i(e,t),e.prototype._next=function(t){var e;this.hasPrev?e=[this.prev,t]:this.hasPrev=!0,this.prev=t,e&&this.destination.next(e)},e}(f);function je(t,e){return function(i){for(var n=i,r=0;r<e;r++){var s=null!=n?n[t[r]]:void 0;if(void 0===s)return;n=s}return n}}function He(t){return t?$e((function(){return new T}),t):$e(new T)}function Ue(t,e,i,n){i&&"function"!=typeof i&&(n=i);var r="function"==typeof i?i:void 0,s=new J(t,e,n);return function(t){return $e((function(){return s}),r)(t)}}function Ve(t){return void 0===t&&(t=-1),function(e){return e.lift(new Ge(t,e))}}var Ge=function(){function t(t,e){this.count=t,this.source=e}return t.prototype.call=function(t,e){return e.subscribe(new qe(t,this.count,this.source))},t}(),qe=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.count=i,r.source=n,r}return i(e,t),e.prototype.error=function(e){if(!this.isStopped){var i=this.source,n=this.count;if(0===n)return t.prototype.error.call(this,e);n>-1&&(this.count=n-1),i.subscribe(this._unsubscribeAndRecycle())}},e}(f);var We=function(){function t(t){this.notifier=t}return t.prototype.call=function(t,e){var i=new Xe(t),n=e.subscribe(i);return n.add(St(this.notifier,new xt(i))),n},t}(),Xe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasValue=!1,e}return i(e,t),e.prototype._next=function(t){this.value=t,this.hasValue=!0},e.prototype.notifyNext=function(){this.emitValue()},e.prototype.notifyComplete=function(){this.emitValue()},e.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))},e}(wt);function Ye(){return new T}function Ze(){return function(t){return E()($e(Ye)(t))}}function Je(t){return function(e){return e.lift(new Ke(t))}}var Ke=function(){function t(t){this.total=t}return t.prototype.call=function(t,e){return e.subscribe(new Qe(t,this.total))},t}(),Qe=function(t){function e(e,i){var n=t.call(this,e)||this;return n.total=i,n.count=0,n}return i(e,t),e.prototype._next=function(t){++this.count>this.total&&this.destination.next(t)},e}(f);function ti(t){return function(e){return e.lift(new ei(t))}}var ei=function(){function t(t){this.predicate=t}return t.prototype.call=function(t,e){return e.subscribe(new ii(t,this.predicate))},t}(),ii=function(t){function e(e,i){var n=t.call(this,e)||this;return n.predicate=i,n.skipping=!0,n.index=0,n}return i(e,t),e.prototype._next=function(t){var e=this.destination;this.skipping&&this.tryCallPredicate(t),this.skipping||e.next(t)},e.prototype.tryCallPredicate=function(t){try{var e=this.predicate(t,this.index++);this.skipping=Boolean(e)}catch(t){this.destination.error(t)}},e}(f);function ni(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=t[t.length-1];return j(i)?(t.pop(),function(e){return At(t,e,i)}):function(e){return At(t,e)}}function ri(t,e){return"function"==typeof e?function(i){return i.pipe(ri((function(i,n){return bt(t(i,n)).pipe(rt((function(t,r){return e(i,t,n,r)})))})))}:function(e){return e.lift(new si(t))}}var si=function(){function t(t){this.project=t}return t.prototype.call=function(t,e){return e.subscribe(new oi(t,this.project))},t}(),oi=function(t){function e(e,i){var n=t.call(this,e)||this;return n.project=i,n.index=0,n}return i(e,t),e.prototype._next=function(t){var e,i=this.index++;try{e=this.project(t,i)}catch(t){return void this.destination.error(t)}this._innerSub(e)},e.prototype._innerSub=function(t){var e=this.innerSubscription;e&&e.unsubscribe();var i=new xt(this),n=this.destination;n.add(i),this.innerSubscription=St(t,i),this.innerSubscription!==i&&n.add(this.innerSubscription)},e.prototype._complete=function(){var e=this.innerSubscription;e&&!e.closed||t.prototype._complete.call(this),this.unsubscribe()},e.prototype._unsubscribe=function(){this.innerSubscription=void 0},e.prototype.notifyComplete=function(){this.innerSubscription=void 0,this.isStopped&&t.prototype._complete.call(this)},e.prototype.notifyNext=function(t){this.destination.next(t)},e}(wt);function ai(t){return function(e){return e.lift(new ci(t))}}var ci=function(){function t(t){this.notifier=t}return t.prototype.call=function(t,e){var i=new hi(t),n=St(this.notifier,new xt(i));return n&&!i.seenValue?(i.add(n),e.subscribe(i)):i},t}(),hi=function(t){function e(e){var i=t.call(this,e)||this;return i.seenValue=!1,i}return i(e,t),e.prototype.notifyNext=function(){this.seenValue=!0,this.complete()},e.prototype.notifyComplete=function(){},e}(wt);function li(t,e){return void 0===e&&(e=!1),function(i){return i.lift(new ui(t,e))}}var ui=function(){function t(t,e){this.predicate=t,this.inclusive=e}return t.prototype.call=function(t,e){return e.subscribe(new di(t,this.predicate,this.inclusive))},t}(),di=function(t){function e(e,i,n){var r=t.call(this,e)||this;return r.predicate=i,r.inclusive=n,r.index=0,r}return i(e,t),e.prototype._next=function(t){var e,i=this.destination;try{e=this.predicate(t,this.index++)}catch(t){return void i.error(t)}this.nextOrComplete(t,e)},e.prototype.nextOrComplete=function(t,e){var i=this.destination;Boolean(e)?i.next(t):(this.inclusive&&i.next(t),i.complete())},e}(f);function pi(t,e,i){return function(n){return n.lift(new fi(t,e,i))}}var fi=function(){function t(t,e,i){this.nextOrObserver=t,this.error=e,this.complete=i}return t.prototype.call=function(t,e){return e.subscribe(new mi(t,this.nextOrObserver,this.error,this.complete))},t}(),mi=function(t){function e(e,i,r,s){var o=t.call(this,e)||this;return o._tapNext=tt,o._tapError=tt,o._tapComplete=tt,o._tapError=r||tt,o._tapComplete=s||tt,n(i)?(o._context=o,o._tapNext=i):i&&(o._context=i,o._tapNext=i.next||tt,o._tapError=i.error||tt,o._tapComplete=i.complete||tt),o}return i(e,t),e.prototype._next=function(t){try{this._tapNext.call(this._context,t)}catch(t){return void this.destination.error(t)}this.destination.next(t)},e.prototype._error=function(t){try{this._tapError.call(this._context,t)}catch(t){return void this.destination.error(t)}this.destination.error(t)},e.prototype._complete=function(){try{this._tapComplete.call(this._context)}catch(t){return void this.destination.error(t)}return this.destination.complete()},e}(f);function gi(t,e,i){return void 0===i&&(i=Q),function(n){var r,s=(r=t)instanceof Date&&!isNaN(+r),o=s?+t-i.now():Math.abs(t);return n.lift(new _i(o,s,e,i))}}var _i=function(){function t(t,e,i,n){this.waitFor=t,this.absoluteTimeout=e,this.withObservable=i,this.scheduler=n}return t.prototype.call=function(t,e){return e.subscribe(new vi(t,this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))},t}(),vi=function(t){function e(e,i,n,r,s){var o=t.call(this,e)||this;return o.absoluteTimeout=i,o.waitFor=n,o.withObservable=r,o.scheduler=s,o.scheduleTimeout(),o}return i(e,t),e.dispatchTimeout=function(t){var e=t.withObservable;t._unsubscribeAndRecycle(),t.add(St(e,new xt(t)))},e.prototype.scheduleTimeout=function(){var t=this.action;t?this.action=t.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(e.dispatchTimeout,this.waitFor,this))},e.prototype._next=function(e){this.absoluteTimeout||this.scheduleTimeout(),t.prototype._next.call(this,e)},e.prototype._unsubscribe=function(){this.action=void 0,this.scheduler=null,this.withObservable=null},e}(wt);function yi(t,e){return void 0===e&&(e=Q),gi(t,q(new nt),e)}function bi(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return function(e){var i;"function"==typeof t[t.length-1]&&(i=t.pop());var n=t;return e.lift(new xi(n,i))}}var xi=function(){function t(t,e){this.observables=t,this.project=e}return t.prototype.call=function(t,e){return e.subscribe(new wi(t,this.observables,this.project))},t}(),wi=function(t){function e(e,i,n){var r=t.call(this,e)||this;r.observables=i,r.project=n,r.toRespond=[];var s=i.length;r.values=new Array(s);for(var o=0;o<s;o++)r.toRespond.push(o);for(o=0;o<s;o++){var a=i[o];r.add(ft(r,a,void 0,o))}return r}return i(e,t),e.prototype.notifyNext=function(t,e,i){this.values[i]=e;var n=this.toRespond;if(n.length>0){var r=n.indexOf(i);-1!==r&&n.splice(r,1)}},e.prototype.notifyComplete=function(){},e.prototype._next=function(t){if(0===this.toRespond.length){var e=[t].concat(this.values);this.project?this._tryProject(e):this.destination.next(e)}},e.prototype._tryProject=function(t){var e;try{e=this.project.apply(this,t)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(at);class Si{createFilter(t){return new Function("node","return "+this._compile(t)+";")}_compile(t){if(null==t||t.length<=1)return"true";const e=t[0];return"("+("=="===e?this._compileComparisonOp("===",t[1],t[2],!1):"!="===e?this._compileComparisonOp("!==",t[1],t[2],!1):">"===e||">="===e||"<"===e||"<="===e?this._compileComparisonOp(e,t[1],t[2],!0):"in"===e?this._compileInOp(t[1],t.slice(2)):"!in"===e?this._compileNegation(this._compileInOp(t[1],t.slice(2))):"all"===e?this._compileLogicalOp(t.slice(1),"&&"):"true")+")"}_compare(t,e){return t<e?-1:t>e?1:0}_compileComparisonOp(t,e,i,n){const r=this._compilePropertyReference(e),s=JSON.stringify(i);return(n?"typeof "+r+"===typeof "+s+"&&":"")+r+t+s}_compileInOp(t,e){const i=this._compare;return JSON.stringify(e.sort(i))+".indexOf("+this._compilePropertyReference(t)+")!==-1"}_compileLogicalOp(t,e){const i=this._compile.bind(this);return t.map(i).join(e)}_compileNegation(t){return"!("+t+")"}_compilePropertyReference(t){return"node["+JSON.stringify(t)+"]"}}const Mi=100,Ti=1e3,Ci=1001,Ei=1002,Ii=1003,Ai=1006,Pi=1008,Ri=1009,Li=1012,Oi=1014,Ni=1015,Di=1016,$i=1020,ki=1022,zi=1023,Fi=1026,Bi=1027,ji=2300,Hi=2301,Ui=2302,Vi=2400,Gi=2401,qi=2402,Wi=2500,Xi=3e3,Yi=7680,Zi=35044,Ji=35048,Ki="300 es";function Qi(){}Object.assign(Qi.prototype,{addEventListener:function(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)},hasEventListener:function(t,e){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)},removeEventListener:function(t,e){if(void 0===this._listeners)return;const i=this._listeners[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}},dispatchEvent:function(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const i=e.slice(0);for(let e=0,n=i.length;e<n;e++)i[e].call(this,t)}}});const tn=[];for(let t=0;t<256;t++)tn[t]=(t<16?"0":"")+t.toString(16);let en=1234567;const nn={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,n=4294967295*Math.random()|0;return(tn[255&t]+tn[t>>8&255]+tn[t>>16&255]+tn[t>>24&255]+"-"+tn[255&e]+tn[e>>8&255]+"-"+tn[e>>16&15|64]+tn[e>>24&255]+"-"+tn[63&i|128]+tn[i>>8&255]+"-"+tn[i>>16&255]+tn[i>>24&255]+tn[255&n]+tn[n>>8&255]+tn[n>>16&255]+tn[n>>24&255]).toUpperCase()},clamp:function(t,e,i){return Math.max(e,Math.min(i,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,i,n,r){return n+(t-e)*(r-n)/(i-e)},lerp:function(t,e,i){return(1-i)*t+i*e},damp:function(t,e,i,n){return nn.lerp(t,e,1-Math.exp(-i*n))},pingpong:function(t,e=1){return e-Math.abs(nn.euclideanModulo(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(en=t%2147483647),en=16807*en%2147483647,(en-1)/2147483646},degToRad:function(t){return t*nn.DEG2RAD},radToDeg:function(t){return t*nn.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,n,r){const s=Math.cos,o=Math.sin,a=s(i/2),c=o(i/2),h=s((e+n)/2),l=o((e+n)/2),u=s((e-n)/2),d=o((e-n)/2),p=s((n-e)/2),f=o((n-e)/2);switch(r){case"XYX":t.set(a*l,c*u,c*d,a*h);break;case"YZY":t.set(c*d,a*l,c*u,a*h);break;case"ZXZ":t.set(c*u,c*d,a*l,a*h);break;case"XZX":t.set(a*l,c*f,c*p,a*h);break;case"YXY":t.set(c*p,a*l,c*f,a*h);break;case"ZYZ":t.set(c*f,c*p,a*l,a*h);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}};class rn{constructor(t=0,e=0){Object.defineProperty(this,"isVector2",{value:!0}),this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}class sn{constructor(){Object.defineProperty(this,"isMatrix3",{value:!0}),this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,o,a,c){const h=this.elements;return h[0]=t,h[1]=n,h[2]=o,h[3]=e,h[4]=r,h[5]=a,h[6]=i,h[7]=s,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}clone(){return(new this.constructor).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],o=i[3],a=i[6],c=i[1],h=i[4],l=i[7],u=i[2],d=i[5],p=i[8],f=n[0],m=n[3],g=n[6],_=n[1],v=n[4],y=n[7],b=n[2],x=n[5],w=n[8];return r[0]=s*f+o*_+a*b,r[3]=s*m+o*v+a*x,r[6]=s*g+o*y+a*w,r[1]=c*f+h*_+l*b,r[4]=c*m+h*v+l*x,r[7]=c*g+h*y+l*w,r[2]=u*f+d*_+p*b,r[5]=u*m+d*v+p*x,r[8]=u*g+d*y+p*w,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],c=t[7],h=t[8];return e*s*h-e*o*c-i*r*h+i*o*a+n*r*c-n*s*a}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=h*s-o*c,u=o*a-h*r,d=c*r-s*a,p=e*l+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=l*f,t[1]=(n*c-h*i)*f,t[2]=(o*i-n*s)*f,t[3]=u*f,t[4]=(h*e-n*a)*f,t[5]=(n*r-o*e)*f,t[6]=d*f,t[7]=(i*a-c*e)*f,t[8]=(s*e-i*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).copy(this).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,n,r,s,o){const a=Math.cos(r),c=Math.sin(r);return this.set(i*a,i*c,-i*(a*s+c*o)+s+t,-n*c,n*a,-n*(-c*s+a*o)+o+e,0,0,1),this}scale(t,e){const i=this.elements;return i[0]*=t,i[3]*=t,i[6]*=t,i[1]*=e,i[4]*=e,i[7]*=e,this}rotate(t){const e=Math.cos(t),i=Math.sin(t),n=this.elements,r=n[0],s=n[3],o=n[6],a=n[1],c=n[4],h=n[7];return n[0]=e*r+i*a,n[3]=e*s+i*c,n[6]=e*o+i*h,n[1]=-i*r+e*a,n[4]=-i*s+e*c,n[7]=-i*o+e*h,this}translate(t,e){const i=this.elements;return i[0]+=t*i[2],i[3]+=t*i[5],i[6]+=t*i[8],i[1]+=e*i[2],i[4]+=e*i[5],i[7]+=e*i[8],this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}}let on;const an={getDataURL:function(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===on&&(on=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),on.width=t.width,on.height=t.height;const i=on.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=on}return e.width>2048||e.height>2048?e.toDataURL("image/jpeg",.6):e.toDataURL("image/png")}};let cn=0;function hn(t=hn.DEFAULT_IMAGE,e=hn.DEFAULT_MAPPING,i=1001,n=1001,r=1006,s=1008,o=1023,a=1009,c=1,h=3e3){Object.defineProperty(this,"id",{value:cn++}),this.uuid=nn.generateUUID(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=i,this.wrapT=n,this.magFilter=r,this.minFilter=s,this.anisotropy=c,this.format=o,this.internalFormat=null,this.type=a,this.offset=new rn(0,0),this.repeat=new rn(1,1),this.center=new rn(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new sn,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=h,this.version=0,this.onUpdate=null}function ln(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?an.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}hn.DEFAULT_IMAGE=void 0,hn.DEFAULT_MAPPING=300,hn.prototype=Object.assign(Object.create(Qi.prototype),{constructor:hn,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this},toJSON:function(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const n=this.image;if(void 0===n.uuid&&(n.uuid=nn.generateUUID()),!e&&void 0===t.images[n.uuid]){let e;if(Array.isArray(n)){e=[];for(let t=0,i=n.length;t<i;t++)n[t].isDataTexture?e.push(ln(n[t].image)):e.push(ln(n[t]))}else e=ln(n);t.images[n.uuid]={uuid:n.uuid,url:e}}i.image=n.uuid}return e||(t.textures[this.uuid]=i),i},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case Ti:t.x=t.x-Math.floor(t.x);break;case Ci:t.x=t.x<0?0:1;break;case Ei:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case Ti:t.y=t.y-Math.floor(t.y);break;case Ci:t.y=t.y<0?0:1;break;case Ei:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}}),Object.defineProperty(hn.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}});class un{constructor(t=0,e=0,i=0,n=1){Object.defineProperty(this,"isVector4",{value:!0}),this.x=t,this.y=e,this.z=i,this.w=n}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,n,r;const s=.01,o=.1,a=t.elements,c=a[0],h=a[4],l=a[8],u=a[1],d=a[5],p=a[9],f=a[2],m=a[6],g=a[10];if(Math.abs(h-u)<s&&Math.abs(l-f)<s&&Math.abs(p-m)<s){if(Math.abs(h+u)<o&&Math.abs(l+f)<o&&Math.abs(p+m)<o&&Math.abs(c+d+g-3)<o)return this.set(1,0,0,0),this;e=Math.PI;const t=(c+1)/2,a=(d+1)/2,_=(g+1)/2,v=(h+u)/4,y=(l+f)/4,b=(p+m)/4;return t>a&&t>_?t<s?(i=0,n=.707106781,r=.707106781):(i=Math.sqrt(t),n=v/i,r=y/i):a>_?a<s?(i=.707106781,n=0,r=.707106781):(n=Math.sqrt(a),i=v/n,r=b/n):_<s?(i=.707106781,n=.707106781,r=0):(r=Math.sqrt(_),i=y/r,n=b/r),this.set(i,n,r,e),this}let _=Math.sqrt((m-p)*(m-p)+(l-f)*(l-f)+(u-h)*(u-h));return Math.abs(_)<.001&&(_=1),this.x=(m-p)/_,this.y=(l-f)/_,this.z=(u-h)/_,this.w=Math.acos((c+d+g-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this.w=t.w+(e.w-t.w)*i,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}}class dn extends Qi{constructor(t,e,i){super(),Object.defineProperty(this,"isWebGLRenderTarget",{value:!0}),this.width=t,this.height=e,this.scissor=new un(0,0,t,e),this.scissorTest=!1,this.viewport=new un(0,0,t,e),i=i||{},this.texture=new hn(void 0,i.mapping,i.wrapS,i.wrapT,i.magFilter,i.minFilter,i.format,i.type,i.anisotropy,i.encoding),this.texture.image={},this.texture.image.width=t,this.texture.image.height=e,this.texture.generateMipmaps=void 0!==i.generateMipmaps&&i.generateMipmaps,this.texture.minFilter=void 0!==i.minFilter?i.minFilter:Ai,this.depthBuffer=void 0===i.depthBuffer||i.depthBuffer,this.stencilBuffer=void 0!==i.stencilBuffer&&i.stencilBuffer,this.depthTexture=void 0!==i.depthTexture?i.depthTexture:null}setSize(t,e){this.width===t&&this.height===e||(this.width=t,this.height=e,this.texture.image.width=t,this.texture.image.height=e,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){return this.width=t.width,this.height=t.height,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}class pn{constructor(t=0,e=0,i=0,n=1){Object.defineProperty(this,"isQuaternion",{value:!0}),this._x=t,this._y=e,this._z=i,this._w=n}static slerp(t,e,i,n){return i.copy(t).slerp(e,n)}static slerpFlat(t,e,i,n,r,s,o){let a=i[n+0],c=i[n+1],h=i[n+2],l=i[n+3];const u=r[s+0],d=r[s+1],p=r[s+2],f=r[s+3];if(l!==f||a!==u||c!==d||h!==p){let t=1-o;const e=a*u+c*d+h*p+l*f,i=e>=0?1:-1,n=1-e*e;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,e*i);t=Math.sin(t*s)/r,o=Math.sin(o*s)/r}const r=o*i;if(a=a*t+u*r,c=c*t+d*r,h=h*t+p*r,l=l*t+f*r,t===1-o){const t=1/Math.sqrt(a*a+c*c+h*h+l*l);a*=t,c*=t,h*=t,l*=t}}t[e]=a,t[e+1]=c,t[e+2]=h,t[e+3]=l}static multiplyQuaternionsFlat(t,e,i,n,r,s){const o=i[n],a=i[n+1],c=i[n+2],h=i[n+3],l=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=o*p+h*l+a*d-c*u,t[e+1]=a*p+h*u+c*l-o*d,t[e+2]=c*p+h*d+o*u-a*l,t[e+3]=h*p-o*l-a*u-c*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const i=t._x,n=t._y,r=t._z,s=t._order,o=Math.cos,a=Math.sin,c=o(i/2),h=o(n/2),l=o(r/2),u=a(i/2),d=a(n/2),p=a(r/2);switch(s){case"XYZ":this._x=u*h*l+c*d*p,this._y=c*d*l-u*h*p,this._z=c*h*p+u*d*l,this._w=c*h*l-u*d*p;break;case"YXZ":this._x=u*h*l+c*d*p,this._y=c*d*l-u*h*p,this._z=c*h*p-u*d*l,this._w=c*h*l+u*d*p;break;case"ZXY":this._x=u*h*l-c*d*p,this._y=c*d*l+u*h*p,this._z=c*h*p+u*d*l,this._w=c*h*l-u*d*p;break;case"ZYX":this._x=u*h*l-c*d*p,this._y=c*d*l+u*h*p,this._z=c*h*p-u*d*l,this._w=c*h*l+u*d*p;break;case"YZX":this._x=u*h*l+c*d*p,this._y=c*d*l+u*h*p,this._z=c*h*p-u*d*l,this._w=c*h*l-u*d*p;break;case"XZY":this._x=u*h*l-c*d*p,this._y=c*d*l-u*h*p,this._z=c*h*p+u*d*l,this._w=c*h*l+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],n=e[4],r=e[8],s=e[1],o=e[5],a=e[9],c=e[2],h=e[6],l=e[10],u=i+o+l;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(h-a)*t,this._y=(r-c)*t,this._z=(s-n)*t}else if(i>o&&i>l){const t=2*Math.sqrt(1+i-o-l);this._w=(h-a)/t,this._x=.25*t,this._y=(n+s)/t,this._z=(r+c)/t}else if(o>l){const t=2*Math.sqrt(1+o-i-l);this._w=(r-c)/t,this._x=(n+s)/t,this._y=.25*t,this._z=(a+h)/t}else{const t=2*Math.sqrt(1+l-i-o);this._w=(s-n)/t,this._x=(r+c)/t,this._y=(a+h)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-6?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(nn.clamp(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const n=Math.min(1,e/i);return this.slerp(t,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,n=t._y,r=t._z,s=t._w,o=e._x,a=e._y,c=e._z,h=e._w;return this._x=i*h+s*o+n*c-r*a,this._y=n*h+s*a+r*o-i*c,this._z=r*h+s*c+i*a-n*o,this._w=s*h-i*o-n*a-r*c,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,n=this._y,r=this._z,s=this._w;let o=s*t._w+i*t._x+n*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*i+e*this._x,this._y=t*n+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const c=Math.sqrt(a),h=Math.atan2(c,o),l=Math.sin((1-e)*h)/c,u=Math.sin(e*h)/c;return this._w=s*l+this._w*u,this._x=i*l+this._x*u,this._y=n*l+this._y*u,this._z=r*l+this._z*u,this._onChangeCallback(),this}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}class fn{constructor(t=0,e=0,i=0){Object.defineProperty(this,"isVector3",{value:!0}),this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(gn.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(gn.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(t){const e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,o=t.z,a=t.w,c=a*e+s*n-o*i,h=a*i+o*e-r*n,l=a*n+r*i-s*e,u=-r*e-s*i-o*n;return this.x=c*a+u*-r+h*-o-l*-s,this.y=h*a+u*-s+l*-r-c*-o,this.z=l*a+u*-o+c*-s-h*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,n=t.y,r=t.z,s=e.x,o=e.y,a=e.z;return this.x=n*a-r*o,this.y=r*s-i*a,this.z=i*o-n*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return mn.copy(this).projectOnVector(t),this.sub(mn)}reflect(t){return this.sub(mn.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(nn.clamp(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}const mn=new fn,gn=new pn;class _n{constructor(t,e){Object.defineProperty(this,"isBox3",{value:!0}),this.min=void 0!==t?t:new fn(1/0,1/0,1/0),this.max=void 0!==e?e:new fn(-1/0,-1/0,-1/0)}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,o=-1/0;for(let a=0,c=t.length;a<c;a+=3){const c=t[a],h=t[a+1],l=t[a+2];c<e&&(e=c),h<i&&(i=h),l<n&&(n=l),c>r&&(r=c),h>s&&(s=h),l>o&&(o=l)}return this.min.set(e,i,n),this.max.set(r,s,o),this}setFromBufferAttribute(t){let e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,o=-1/0;for(let a=0,c=t.count;a<c;a++){const c=t.getX(a),h=t.getY(a),l=t.getZ(a);c<e&&(e=c),h<i&&(i=h),l<n&&(n=l),c>r&&(r=c),h>s&&(s=h),l>o&&(o=l)}return this.min.set(e,i,n),this.max.set(r,s,o),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const i=bn.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this}setFromObject(t){return this.makeEmpty(),this.expandByObject(t)}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return void 0===t&&(console.warn("THREE.Box3: .getCenter() target is now required"),t=new fn),this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box3: .getSize() target is now required"),t=new fn),this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t){t.updateWorldMatrix(!1,!1);const e=t.geometry;void 0!==e&&(null===e.boundingBox&&e.computeBoundingBox(),xn.copy(e.boundingBox),xn.applyMatrix4(t.matrixWorld),this.union(xn));const i=t.children;for(let t=0,e=i.length;t<e;t++)this.expandByObject(i[t]);return this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new fn),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)}intersectsSphere(t){return this.clampPoint(t.center,bn),bn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(In),An.subVectors(this.max,In),wn.subVectors(t.a,In),Sn.subVectors(t.b,In),Mn.subVectors(t.c,In),Tn.subVectors(Sn,wn),Cn.subVectors(Mn,Sn),En.subVectors(wn,Mn);let e=[0,-Tn.z,Tn.y,0,-Cn.z,Cn.y,0,-En.z,En.y,Tn.z,0,-Tn.x,Cn.z,0,-Cn.x,En.z,0,-En.x,-Tn.y,Tn.x,0,-Cn.y,Cn.x,0,-En.y,En.x,0];return!!vn(e,wn,Sn,Mn,An)&&(e=[1,0,0,0,1,0,0,0,1],!!vn(e,wn,Sn,Mn,An)&&(Pn.crossVectors(Tn,Cn),e=[Pn.x,Pn.y,Pn.z],vn(e,wn,Sn,Mn,An)))}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new fn),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return bn.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(bn).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(yn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),yn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),yn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),yn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),yn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),yn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),yn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),yn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(yn)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}function vn(t,e,i,n,r){for(let s=0,o=t.length-3;s<=o;s+=3){Rn.fromArray(t,s);const o=r.x*Math.abs(Rn.x)+r.y*Math.abs(Rn.y)+r.z*Math.abs(Rn.z),a=e.dot(Rn),c=i.dot(Rn),h=n.dot(Rn);if(Math.max(-Math.max(a,c,h),Math.min(a,c,h))>o)return!1}return!0}const yn=[new fn,new fn,new fn,new fn,new fn,new fn,new fn,new fn],bn=new fn,xn=new _n,wn=new fn,Sn=new fn,Mn=new fn,Tn=new fn,Cn=new fn,En=new fn,In=new fn,An=new fn,Pn=new fn,Rn=new fn,Ln=new _n;class On{constructor(t,e){this.center=void 0!==t?t:new fn,this.radius=void 0!==e?e:-1}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ln.setFromPoints(t).getCenter(i);let n=0;for(let e=0,r=t.length;e<r;e++)n=Math.max(n,i.distanceToSquared(t[e]));return this.radius=Math.sqrt(n),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){const e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){const i=this.center.distanceToSquared(t);return void 0===e&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),e=new fn),e.copy(t),i>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new _n),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}}const Nn=new fn,Dn=new fn,$n=new fn,kn=new fn,zn=new fn,Fn=new fn,Bn=new fn;class jn{constructor(t,e){this.origin=void 0!==t?t:new fn,this.direction=void 0!==e?e:new fn(0,0,-1)}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new fn),e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Nn)),this}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new fn),e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Nn.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Nn.copy(this.direction).multiplyScalar(e).add(this.origin),Nn.distanceToSquared(t))}distanceSqToSegment(t,e,i,n){Dn.copy(t).add(e).multiplyScalar(.5),$n.copy(e).sub(t).normalize(),kn.copy(this.origin).sub(Dn);const r=.5*t.distanceTo(e),s=-this.direction.dot($n),o=kn.dot(this.direction),a=-kn.dot($n),c=kn.lengthSq(),h=Math.abs(1-s*s);let l,u,d,p;if(h>0)if(l=s*a-o,u=s*o-a,p=r*h,l>=0)if(u>=-p)if(u<=p){const t=1/h;l*=t,u*=t,d=l*(l+s*u+2*o)+u*(s*l+u+2*a)+c}else u=r,l=Math.max(0,-(s*u+o)),d=-l*l+u*(u+2*a)+c;else u=-r,l=Math.max(0,-(s*u+o)),d=-l*l+u*(u+2*a)+c;else u<=-p?(l=Math.max(0,-(-s*r+o)),u=l>0?-r:Math.min(Math.max(-r,-a),r),d=-l*l+u*(u+2*a)+c):u<=p?(l=0,u=Math.min(Math.max(-r,-a),r),d=u*(u+2*a)+c):(l=Math.max(0,-(s*r+o)),u=l>0?r:Math.min(Math.max(-r,-a),r),d=-l*l+u*(u+2*a)+c);else u=s>0?-r:r,l=Math.max(0,-(s*u+o)),d=-l*l+u*(u+2*a)+c;return i&&i.copy(this.direction).multiplyScalar(l).add(this.origin),n&&n.copy($n).multiplyScalar(u).add(Dn),d}intersectSphere(t,e){Nn.subVectors(t.center,this.origin);const i=Nn.dot(this.direction),n=Nn.dot(Nn)-i*i,r=t.radius*t.radius;if(n>r)return null;const s=Math.sqrt(r-n),o=i-s,a=i+s;return o<0&&a<0?null:o<0?this.at(a,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,n,r,s,o,a;const c=1/this.direction.x,h=1/this.direction.y,l=1/this.direction.z,u=this.origin;return c>=0?(i=(t.min.x-u.x)*c,n=(t.max.x-u.x)*c):(i=(t.max.x-u.x)*c,n=(t.min.x-u.x)*c),h>=0?(r=(t.min.y-u.y)*h,s=(t.max.y-u.y)*h):(r=(t.max.y-u.y)*h,s=(t.min.y-u.y)*h),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s<n||n!=n)&&(n=s),l>=0?(o=(t.min.z-u.z)*l,a=(t.max.z-u.z)*l):(o=(t.max.z-u.z)*l,a=(t.min.z-u.z)*l),i>a||o>n?null:((o>i||i!=i)&&(i=o),(a<n||n!=n)&&(n=a),n<0?null:this.at(i>=0?i:n,e)))}intersectsBox(t){return null!==this.intersectBox(t,Nn)}intersectTriangle(t,e,i,n,r){zn.subVectors(e,t),Fn.subVectors(i,t),Bn.crossVectors(zn,Fn);let s,o=this.direction.dot(Bn);if(o>0){if(n)return null;s=1}else{if(!(o<0))return null;s=-1,o=-o}kn.subVectors(this.origin,t);const a=s*this.direction.dot(Fn.crossVectors(kn,Fn));if(a<0)return null;const c=s*this.direction.dot(zn.cross(kn));if(c<0)return null;if(a+c>o)return null;const h=-s*kn.dot(Bn);return h<0?null:this.at(h/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}}class Hn{constructor(){Object.defineProperty(this,"isMatrix4",{value:!0}),this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,i,n,r,s,o,a,c,h,l,u,d,p,f,m){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=o,g[13]=a,g[2]=c,g[6]=h,g[10]=l,g[14]=u,g[3]=d,g[7]=p,g[11]=f,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Hn).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,n=1/Un.setFromMatrixColumn(t,0).length(),r=1/Un.setFromMatrixColumn(t,1).length(),s=1/Un.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),o=Math.sin(i),a=Math.cos(n),c=Math.sin(n),h=Math.cos(r),l=Math.sin(r);if("XYZ"===t.order){const t=s*h,i=s*l,n=o*h,r=o*l;e[0]=a*h,e[4]=-a*l,e[8]=c,e[1]=i+n*c,e[5]=t-r*c,e[9]=-o*a,e[2]=r-t*c,e[6]=n+i*c,e[10]=s*a}else if("YXZ"===t.order){const t=a*h,i=a*l,n=c*h,r=c*l;e[0]=t+r*o,e[4]=n*o-i,e[8]=s*c,e[1]=s*l,e[5]=s*h,e[9]=-o,e[2]=i*o-n,e[6]=r+t*o,e[10]=s*a}else if("ZXY"===t.order){const t=a*h,i=a*l,n=c*h,r=c*l;e[0]=t-r*o,e[4]=-s*l,e[8]=n+i*o,e[1]=i+n*o,e[5]=s*h,e[9]=r-t*o,e[2]=-s*c,e[6]=o,e[10]=s*a}else if("ZYX"===t.order){const t=s*h,i=s*l,n=o*h,r=o*l;e[0]=a*h,e[4]=n*c-i,e[8]=t*c+r,e[1]=a*l,e[5]=r*c+t,e[9]=i*c-n,e[2]=-c,e[6]=o*a,e[10]=s*a}else if("YZX"===t.order){const t=s*a,i=s*c,n=o*a,r=o*c;e[0]=a*h,e[4]=r-t*l,e[8]=n*l+i,e[1]=l,e[5]=s*h,e[9]=-o*h,e[2]=-c*h,e[6]=i*l+n,e[10]=t-r*l}else if("XZY"===t.order){const t=s*a,i=s*c,n=o*a,r=o*c;e[0]=a*h,e[4]=-l,e[8]=c*h,e[1]=t*l+r,e[5]=s*h,e[9]=i*l-n,e[2]=n*l-i,e[6]=o*h,e[10]=r*l+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Gn,t,qn)}lookAt(t,e,i){const n=this.elements;return Yn.subVectors(t,e),0===Yn.lengthSq()&&(Yn.z=1),Yn.normalize(),Wn.crossVectors(i,Yn),0===Wn.lengthSq()&&(1===Math.abs(i.z)?Yn.x+=1e-4:Yn.z+=1e-4,Yn.normalize(),Wn.crossVectors(i,Yn)),Wn.normalize(),Xn.crossVectors(Yn,Wn),n[0]=Wn.x,n[4]=Xn.x,n[8]=Yn.x,n[1]=Wn.y,n[5]=Xn.y,n[9]=Yn.y,n[2]=Wn.z,n[6]=Xn.z,n[10]=Yn.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,n=e.elements,r=this.elements,s=i[0],o=i[4],a=i[8],c=i[12],h=i[1],l=i[5],u=i[9],d=i[13],p=i[2],f=i[6],m=i[10],g=i[14],_=i[3],v=i[7],y=i[11],b=i[15],x=n[0],w=n[4],S=n[8],M=n[12],T=n[1],C=n[5],E=n[9],I=n[13],A=n[2],P=n[6],R=n[10],L=n[14],O=n[3],N=n[7],D=n[11],$=n[15];return r[0]=s*x+o*T+a*A+c*O,r[4]=s*w+o*C+a*P+c*N,r[8]=s*S+o*E+a*R+c*D,r[12]=s*M+o*I+a*L+c*$,r[1]=h*x+l*T+u*A+d*O,r[5]=h*w+l*C+u*P+d*N,r[9]=h*S+l*E+u*R+d*D,r[13]=h*M+l*I+u*L+d*$,r[2]=p*x+f*T+m*A+g*O,r[6]=p*w+f*C+m*P+g*N,r[10]=p*S+f*E+m*R+g*D,r[14]=p*M+f*I+m*L+g*$,r[3]=_*x+v*T+y*A+b*O,r[7]=_*w+v*C+y*P+b*N,r[11]=_*S+v*E+y*R+b*D,r[15]=_*M+v*I+y*L+b*$,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],o=t[5],a=t[9],c=t[13],h=t[2],l=t[6],u=t[10],d=t[14];return t[3]*(+r*a*l-n*c*l-r*o*u+i*c*u+n*o*d-i*a*d)+t[7]*(+e*a*d-e*c*u+r*s*u-n*s*d+n*c*h-r*a*h)+t[11]*(+e*c*l-e*o*d-r*s*l+i*s*d+r*o*h-i*c*h)+t[15]*(-n*o*h-e*a*l+e*o*u+n*s*l-i*s*u+i*a*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],u=t[10],d=t[11],p=t[12],f=t[13],m=t[14],g=t[15],_=l*m*c-f*u*c+f*a*d-o*m*d-l*a*g+o*u*g,v=p*u*c-h*m*c-p*a*d+s*m*d+h*a*g-s*u*g,y=h*f*c-p*l*c+p*o*d-s*f*d-h*o*g+s*l*g,b=p*l*a-h*f*a-p*o*u+s*f*u+h*o*m-s*l*m,x=e*_+i*v+n*y+r*b;if(0===x)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/x;return t[0]=_*w,t[1]=(f*u*r-l*m*r-f*n*d+i*m*d+l*n*g-i*u*g)*w,t[2]=(o*m*r-f*a*r+f*n*c-i*m*c-o*n*g+i*a*g)*w,t[3]=(l*a*r-o*u*r-l*n*c+i*u*c+o*n*d-i*a*d)*w,t[4]=v*w,t[5]=(h*m*r-p*u*r+p*n*d-e*m*d-h*n*g+e*u*g)*w,t[6]=(p*a*r-s*m*r-p*n*c+e*m*c+s*n*g-e*a*g)*w,t[7]=(s*u*r-h*a*r+h*n*c-e*u*c-s*n*d+e*a*d)*w,t[8]=y*w,t[9]=(p*l*r-h*f*r-p*i*d+e*f*d+h*i*g-e*l*g)*w,t[10]=(s*f*r-p*o*r+p*i*c-e*f*c-s*i*g+e*o*g)*w,t[11]=(h*o*r-s*l*r-h*i*c+e*l*c+s*i*d-e*o*d)*w,t[12]=b*w,t[13]=(h*f*n-p*l*n+p*i*u-e*f*u-h*i*m+e*l*m)*w,t[14]=(p*o*n-s*f*n-p*i*a+e*f*a+s*i*m-e*o*m)*w,t[15]=(s*l*n-h*o*n+h*i*a-e*l*a-s*i*u+e*o*u)*w,this}scale(t){const e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))}makeTranslation(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,o=t.y,a=t.z,c=r*s,h=r*o;return this.set(c*s+i,c*o-n*a,c*a+n*o,0,c*o+n*a,h*o+i,h*a-n*s,0,c*a-n*o,h*a+n*s,r*a*a+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i){return this.set(1,e,i,0,t,1,i,0,t,e,1,0,0,0,0,1),this}compose(t,e,i){const n=this.elements,r=e._x,s=e._y,o=e._z,a=e._w,c=r+r,h=s+s,l=o+o,u=r*c,d=r*h,p=r*l,f=s*h,m=s*l,g=o*l,_=a*c,v=a*h,y=a*l,b=i.x,x=i.y,w=i.z;return n[0]=(1-(f+g))*b,n[1]=(d+y)*b,n[2]=(p-v)*b,n[3]=0,n[4]=(d-y)*x,n[5]=(1-(u+g))*x,n[6]=(m+_)*x,n[7]=0,n[8]=(p+v)*w,n[9]=(m-_)*w,n[10]=(1-(u+f))*w,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this}decompose(t,e,i){const n=this.elements;let r=Un.set(n[0],n[1],n[2]).length();const s=Un.set(n[4],n[5],n[6]).length(),o=Un.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Vn.copy(this);const a=1/r,c=1/s,h=1/o;return Vn.elements[0]*=a,Vn.elements[1]*=a,Vn.elements[2]*=a,Vn.elements[4]*=c,Vn.elements[5]*=c,Vn.elements[6]*=c,Vn.elements[8]*=h,Vn.elements[9]*=h,Vn.elements[10]*=h,e.setFromRotationMatrix(Vn),i.x=r,i.y=s,i.z=o,this}makePerspective(t,e,i,n,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const o=this.elements,a=2*r/(e-t),c=2*r/(i-n),h=(e+t)/(e-t),l=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return o[0]=a,o[4]=0,o[8]=h,o[12]=0,o[1]=0,o[5]=c,o[9]=l,o[13]=0,o[2]=0,o[6]=0,o[10]=u,o[14]=d,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,i,n,r,s){const o=this.elements,a=1/(e-t),c=1/(i-n),h=1/(s-r),l=(e+t)*a,u=(i+n)*c,d=(s+r)*h;return o[0]=2*a,o[4]=0,o[8]=0,o[12]=-l,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-u,o[2]=0,o[6]=0,o[10]=-2*h,o[14]=-d,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Un=new fn,Vn=new Hn,Gn=new fn(0,0,0),qn=new fn(1,1,1),Wn=new fn,Xn=new fn,Yn=new fn;class Zn{constructor(t=0,e=0,i=0,n=Zn.DefaultOrder){Object.defineProperty(this,"isEuler",{value:!0}),this._x=t,this._y=e,this._z=i,this._order=n}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._order=n||this._order,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e,i){const n=nn.clamp,r=t.elements,s=r[0],o=r[4],a=r[8],c=r[1],h=r[5],l=r[9],u=r[2],d=r[6],p=r[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(n(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,p),this._z=Math.atan2(-o,s)):(this._x=Math.atan2(d,h),this._z=0);break;case"YXZ":this._x=Math.asin(-n(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,p),this._z=Math.atan2(c,h)):(this._y=Math.atan2(-u,s),this._z=0);break;case"ZXY":this._x=Math.asin(n(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,p),this._z=Math.atan2(-o,h)):(this._y=0,this._z=Math.atan2(c,s));break;case"ZYX":this._y=Math.asin(-n(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(c,s)):(this._x=0,this._z=Math.atan2(-o,h));break;case"YZX":this._z=Math.asin(n(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-u,s)):(this._x=0,this._y=Math.atan2(a,p));break;case"XZY":this._z=Math.asin(-n(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,h),this._y=Math.atan2(a,s)):(this._x=Math.atan2(-l,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Jn.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Jn,e,i)}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e||this._order)}reorder(t){return Kn.setFromEuler(this),this.setFromQuaternion(Kn,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new fn(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}Zn.DefaultOrder="XYZ",Zn.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];const Jn=new Hn,Kn=new pn;class Qn{constructor(){this.mask=1}set(t){this.mask=1<<t|0}enable(t){this.mask|=1<<t|0}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t|0}disable(t){this.mask&=~(1<<t|0)}disableAll(){this.mask=0}test(t){return 0!=(this.mask&t.mask)}}let tr=0;const er=new fn,ir=new pn,nr=new Hn,rr=new fn,sr=new fn,or=new fn,ar=new pn,cr=new fn(1,0,0),hr=new fn(0,1,0),lr=new fn(0,0,1),ur={type:"added"},dr={type:"removed"};function pr(){Object.defineProperty(this,"id",{value:tr++}),this.uuid=nn.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=pr.DefaultUp.clone();const t=new fn,e=new Zn,i=new pn,n=new fn(1,1,1);e._onChange((function(){i.setFromEuler(e,!1)})),i._onChange((function(){e.setFromQuaternion(i,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:i},scale:{configurable:!0,enumerable:!0,value:n},modelViewMatrix:{value:new Hn},normalMatrix:{value:new sn}}),this.matrix=new Hn,this.matrixWorld=new Hn,this.matrixAutoUpdate=pr.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Qn,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}pr.DefaultUp=new fn(0,1,0),pr.DefaultMatrixAutoUpdate=!0,pr.prototype=Object.assign(Object.create(Qi.prototype),{constructor:pr,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(t){return this.quaternion.premultiply(t),this},setRotationFromAxisAngle:function(t,e){this.quaternion.setFromAxisAngle(t,e)},setRotationFromEuler:function(t){this.quaternion.setFromEuler(t,!0)},setRotationFromMatrix:function(t){this.quaternion.setFromRotationMatrix(t)},setRotationFromQuaternion:function(t){this.quaternion.copy(t)},rotateOnAxis:function(t,e){return ir.setFromAxisAngle(t,e),this.quaternion.multiply(ir),this},rotateOnWorldAxis:function(t,e){return ir.setFromAxisAngle(t,e),this.quaternion.premultiply(ir),this},rotateX:function(t){return this.rotateOnAxis(cr,t)},rotateY:function(t){return this.rotateOnAxis(hr,t)},rotateZ:function(t){return this.rotateOnAxis(lr,t)},translateOnAxis:function(t,e){return er.copy(t).applyQuaternion(this.quaternion),this.position.add(er.multiplyScalar(e)),this},translateX:function(t){return this.translateOnAxis(cr,t)},translateY:function(t){return this.translateOnAxis(hr,t)},translateZ:function(t){return this.translateOnAxis(lr,t)},localToWorld:function(t){return t.applyMatrix4(this.matrixWorld)},worldToLocal:function(t){return t.applyMatrix4(nr.copy(this.matrixWorld).invert())},lookAt:function(t,e,i){t.isVector3?rr.copy(t):rr.set(t,e,i);const n=this.parent;this.updateWorldMatrix(!0,!1),sr.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?nr.lookAt(sr,rr,this.up):nr.lookAt(rr,sr,this.up),this.quaternion.setFromRotationMatrix(nr),n&&(nr.extractRotation(n.matrixWorld),ir.setFromRotationMatrix(nr),this.quaternion.premultiply(ir.invert()))},add:function(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return t===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",t),this):(t&&t.isObject3D?(null!==t.parent&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(ur)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",t),this)},remove:function(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}const e=this.children.indexOf(t);return-1!==e&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(dr)),this},clear:function(){for(let t=0;t<this.children.length;t++){const e=this.children[t];e.parent=null,e.dispatchEvent(dr)}return this.children.length=0,this},attach:function(t){return this.updateWorldMatrix(!0,!1),nr.copy(this.matrixWorld).invert(),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),nr.multiply(t.parent.matrixWorld)),t.applyMatrix4(nr),t.updateWorldMatrix(!1,!1),this.add(t),this},getObjectById:function(t){return this.getObjectByProperty("id",t)},getObjectByName:function(t){return this.getObjectByProperty("name",t)},getObjectByProperty:function(t,e){if(this[t]===e)return this;for(let i=0,n=this.children.length;i<n;i++){const n=this.children[i].getObjectByProperty(t,e);if(void 0!==n)return n}},getWorldPosition:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),t=new fn),this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),t=new pn),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(sr,t,or),t},getWorldScale:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),t=new fn),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(sr,ar,t),t},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),t=new fn),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()},raycast:function(){},traverse:function(t){t(this);const e=this.children;for(let i=0,n=e.length;i<n;i++)e[i].traverse(t)},traverseVisible:function(t){if(!1===this.visible)return;t(this);const e=this.children;for(let i=0,n=e.length;i<n;i++)e[i].traverseVisible(t)},traverseAncestors:function(t){const e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);const e=this.children;for(let i=0,n=e.length;i<n;i++)e[i].updateMatrixWorld(t)},updateWorldMatrix:function(t,e){const i=this.parent;if(!0===t&&null!==i&&i.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===e){const t=this.children;for(let e=0,i=t.length;e<i;e++)t[e].updateWorldMatrix(!1,!0)}},toJSON:function(t){const e=void 0===t||"string"==typeof t,i={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});const n={};function r(e,i){return void 0===e[i.uuid]&&(e[i.uuid]=i.toJSON(t)),i.uuid}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),!0===this.castShadow&&(n.castShadow=!0),!0===this.receiveShadow&&(n.receiveShadow=!0),!1===this.visible&&(n.visible=!1),!1===this.frustumCulled&&(n.frustumCulled=!1),0!==this.renderOrder&&(n.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON()),this.isMesh||this.isLine||this.isPoints){n.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,n=i.length;e<n;e++){const n=i[e];r(t.shapes,n)}else r(t.shapes,i)}}if(this.isSkinnedMesh&&(n.bindMode=this.bindMode,n.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(t.skeletons,this.skeleton),n.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const e=[];for(let i=0,n=this.material.length;i<n;i++)e.push(r(t.materials,this.material[i]));n.material=e}else n.material=r(t.materials,this.material);if(this.children.length>0){n.children=[];for(let e=0;e<this.children.length;e++)n.children.push(this.children[e].toJSON(t).object)}if(this.animations.length>0){n.animations=[];for(let e=0;e<this.animations.length;e++){const i=this.animations[e];n.animations.push(r(t.animations,i))}}if(e){const e=s(t.geometries),n=s(t.materials),r=s(t.textures),o=s(t.images),a=s(t.shapes),c=s(t.skeletons),h=s(t.animations);e.length>0&&(i.geometries=e),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),o.length>0&&(i.images=o),a.length>0&&(i.shapes=a),c.length>0&&(i.skeletons=c),h.length>0&&(i.animations=h)}return i.object=n,i;function s(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e<t.children.length;e++){const i=t.children[e];this.add(i.clone())}return this}});const fr=new fn,mr=new fn,gr=new sn;class _r{constructor(t,e){Object.defineProperty(this,"isPlane",{value:!0}),this.normal=void 0!==t?t:new fn(1,0,0),this.constant=void 0!==e?e:0}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,i){const n=fr.subVectors(i,e).cross(mr.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new fn),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new fn);const i=t.delta(fr),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):void 0;const r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?void 0:e.copy(i).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new fn),t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||gr.getNormalMatrix(t),n=this.coplanarPoint(fr).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}}const vr=new fn,yr=new fn,br=new fn,xr=new fn,wr=new fn,Sr=new fn,Mr=new fn,Tr=new fn,Cr=new fn,Er=new fn;class Ir{constructor(t,e,i){this.a=void 0!==t?t:new fn,this.b=void 0!==e?e:new fn,this.c=void 0!==i?i:new fn}static getNormal(t,e,i,n){void 0===n&&(console.warn("THREE.Triangle: .getNormal() target is now required"),n=new fn),n.subVectors(i,e),vr.subVectors(t,e),n.cross(vr);const r=n.lengthSq();return r>0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(t,e,i,n,r){vr.subVectors(n,e),yr.subVectors(i,e),br.subVectors(t,e);const s=vr.dot(vr),o=vr.dot(yr),a=vr.dot(br),c=yr.dot(yr),h=yr.dot(br),l=s*c-o*o;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new fn),0===l)return r.set(-2,-1,-1);const u=1/l,d=(c*a-o*h)*u,p=(s*h-o*a)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,n){return this.getBarycoord(t,e,i,n,xr),xr.x>=0&&xr.y>=0&&xr.x+xr.y<=1}static getUV(t,e,i,n,r,s,o,a){return this.getBarycoord(t,e,i,n,xr),a.set(0,0),a.addScaledVector(r,xr.x),a.addScaledVector(s,xr.y),a.addScaledVector(o,xr.z),a}static isFrontFacing(t,e,i,n){return vr.subVectors(i,e),yr.subVectors(t,e),vr.cross(yr).dot(n)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return vr.subVectors(this.c,this.b),yr.subVectors(this.a,this.b),.5*vr.cross(yr).length()}getMidpoint(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new fn),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Ir.getNormal(this.a,this.b,this.c,t)}getPlane(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new _r),t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Ir.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,i,n,r){return Ir.getUV(t,this.a,this.b,this.c,e,i,n,r)}containsPoint(t){return Ir.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Ir.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new fn);const i=this.a,n=this.b,r=this.c;let s,o;wr.subVectors(n,i),Sr.subVectors(r,i),Tr.subVectors(t,i);const a=wr.dot(Tr),c=Sr.dot(Tr);if(a<=0&&c<=0)return e.copy(i);Cr.subVectors(t,n);const h=wr.dot(Cr),l=Sr.dot(Cr);if(h>=0&&l<=h)return e.copy(n);const u=a*l-h*c;if(u<=0&&a>=0&&h<=0)return s=a/(a-h),e.copy(i).addScaledVector(wr,s);Er.subVectors(t,r);const d=wr.dot(Er),p=Sr.dot(Er);if(p>=0&&d<=p)return e.copy(r);const f=d*c-a*p;if(f<=0&&c>=0&&p<=0)return o=c/(c-p),e.copy(i).addScaledVector(Sr,o);const m=h*p-d*l;if(m<=0&&l-h>=0&&d-p>=0)return Mr.subVectors(r,n),o=(l-h)/(l-h+(d-p)),e.copy(n).addScaledVector(Mr,o);const g=1/(m+f+u);return s=f*g,o=u*g,e.copy(i).addScaledVector(wr,s).addScaledVector(Sr,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Ar={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Pr={h:0,s:0,l:0},Rr={h:0,s:0,l:0};function Lr(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}function Or(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Nr(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class Dr{constructor(t,e,i){return Object.defineProperty(this,"isColor",{value:!0}),void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,i){return this.r=t,this.g=e,this.b=i,this}setHSL(t,e,i){if(t=nn.euclideanModulo(t,1),e=nn.clamp(e,0,1),i=nn.clamp(i,0,1),0===e)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=Lr(r,n,t+1/3),this.g=Lr(r,n,t),this.b=Lr(r,n,t-1/3)}return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const i=parseFloat(t[1])/360,n=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(i,n,r)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=i[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=Ar[t];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const i=e>0?1/e:1;return this.r=Math.pow(t.r,i),this.g=Math.pow(t.g,i),this.b=Math.pow(t.b,i),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=Or(t.r),this.g=Or(t.g),this.b=Or(t.b),this}copyLinearToSRGB(t){return this.r=Nr(t.r),this.g=Nr(t.g),this.b=Nr(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});const e=this.r,i=this.g,n=this.b,r=Math.max(e,i,n),s=Math.min(e,i,n);let o,a;const c=(s+r)/2;if(s===r)o=0,a=0;else{const t=r-s;switch(a=c<=.5?t/(r+s):t/(2-r-s),r){case e:o=(i-n)/t+(i<n?6:0);break;case i:o=(n-e)/t+2;break;case n:o=(e-i)/t+4}o/=6}return t.h=o,t.s=a,t.l=c,t}getStyle(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"}offsetHSL(t,e,i){return this.getHSL(Pr),Pr.h+=t,Pr.s+=e,Pr.l+=i,this.setHSL(Pr.h,Pr.s,Pr.l),this}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,i){return this.r=t.r+(e.r-t.r)*i,this.g=t.g+(e.g-t.g)*i,this.b=t.b+(e.b-t.b)*i,this}lerpHSL(t,e){this.getHSL(Pr),t.getHSL(Rr);const i=nn.lerp(Pr.h,Rr.h,e),n=nn.lerp(Pr.s,Rr.s,e),r=nn.lerp(Pr.l,Rr.l,e);return this.setHSL(i,n,r),this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),!0===t.normalized&&(this.r/=255,this.g/=255,this.b/=255),this}toJSON(){return this.getHex()}}Dr.NAMES=Ar,Dr.prototype.r=1,Dr.prototype.g=1,Dr.prototype.b=1;class $r{constructor(t,e,i,n,r,s=0){this.a=t,this.b=e,this.c=i,this.normal=n&&n.isVector3?n:new fn,this.vertexNormals=Array.isArray(n)?n:[],this.color=r&&r.isColor?r:new Dr,this.vertexColors=Array.isArray(r)?r:[],this.materialIndex=s}clone(){return(new this.constructor).copy(this)}copy(t){this.a=t.a,this.b=t.b,this.c=t.c,this.normal.copy(t.normal),this.color.copy(t.color),this.materialIndex=t.materialIndex;for(let e=0,i=t.vertexNormals.length;e<i;e++)this.vertexNormals[e]=t.vertexNormals[e].clone();for(let e=0,i=t.vertexColors.length;e<i;e++)this.vertexColors[e]=t.vertexColors[e].clone();return this}}let kr=0;function zr(){Object.defineProperty(this,"id",{value:kr++}),this.uuid=nn.generateUUID(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.flatShading=!1,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=Mi,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Yi,this.stencilZFail=Yi,this.stencilZPass=Yi,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}function Fr(t){zr.call(this),this.type="MeshBasicMaterial",this.color=new Dr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.setValues(t)}zr.prototype=Object.assign(Object.create(Qi.prototype),{constructor:zr,isMaterial:!0,onBeforeCompile:function(){},customProgramCacheKey:function(){return this.onBeforeCompile.toString()},setValues:function(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;continue}const n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}},toJSON:function(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){const e=[];for(const i in t){const n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(i.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,i.reflectivity=this.reflectivity,i.refractionRatio=this.refractionRatio,void 0!==this.combine&&(i.combine=this.combine),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity)),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(i.size=this.size),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),!0===this.flatShading&&(i.flatShading=this.flatShading),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(i.morphTargets=!0),!0===this.morphNormals&&(i.morphNormals=!0),!0===this.skinning&&(i.skinning=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),e){const e=n(t.textures),r=n(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.flatShading=t.flatShading,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let n=0;n!==t;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(zr.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Fr.prototype=Object.create(zr.prototype),Fr.prototype.constructor=Fr,Fr.prototype.isMeshBasicMaterial=!0,Fr.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this};const Br=new fn,jr=new rn;function Hr(t,e,i){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===i,this.usage=Zi,this.updateRange={offset:0,count:-1},this.version=0}function Ur(t,e,i){Hr.call(this,new Int8Array(t),e,i)}function Vr(t,e,i){Hr.call(this,new Uint8Array(t),e,i)}function Gr(t,e,i){Hr.call(this,new Uint8ClampedArray(t),e,i)}function qr(t,e,i){Hr.call(this,new Int16Array(t),e,i)}function Wr(t,e,i){Hr.call(this,new Uint16Array(t),e,i)}function Xr(t,e,i){Hr.call(this,new Int32Array(t),e,i)}function Yr(t,e,i){Hr.call(this,new Uint32Array(t),e,i)}function Zr(t,e,i){Hr.call(this,new Uint16Array(t),e,i)}function Jr(t,e,i){Hr.call(this,new Float32Array(t),e,i)}function Kr(t,e,i){Hr.call(this,new Float64Array(t),e,i)}function Qr(t){if(0===t.length)return-1/0;let e=t[0];for(let i=1,n=t.length;i<n;++i)t[i]>e&&(e=t[i]);return e}Object.defineProperty(Hr.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Hr.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this},copyAt:function(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let n=0,r=this.itemSize;n<r;n++)this.array[t+n]=e.array[i+n];return this},copyArray:function(t){return this.array.set(t),this},copyColorsArray:function(t){const e=this.array;let i=0;for(let n=0,r=t.length;n<r;n++){let r=t[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),r=new Dr),e[i++]=r.r,e[i++]=r.g,e[i++]=r.b}return this},copyVector2sArray:function(t){const e=this.array;let i=0;for(let n=0,r=t.length;n<r;n++){let r=t[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",n),r=new rn),e[i++]=r.x,e[i++]=r.y}return this},copyVector3sArray:function(t){const e=this.array;let i=0;for(let n=0,r=t.length;n<r;n++){let r=t[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),r=new fn),e[i++]=r.x,e[i++]=r.y,e[i++]=r.z}return this},copyVector4sArray:function(t){const e=this.array;let i=0;for(let n=0,r=t.length;n<r;n++){let r=t[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),r=new un),e[i++]=r.x,e[i++]=r.y,e[i++]=r.z,e[i++]=r.w}return this},applyMatrix3:function(t){if(2===this.itemSize)for(let e=0,i=this.count;e<i;e++)jr.fromBufferAttribute(this,e),jr.applyMatrix3(t),this.setXY(e,jr.x,jr.y);else if(3===this.itemSize)for(let e=0,i=this.count;e<i;e++)Br.fromBufferAttribute(this,e),Br.applyMatrix3(t),this.setXYZ(e,Br.x,Br.y,Br.z);return this},applyMatrix4:function(t){for(let e=0,i=this.count;e<i;e++)Br.x=this.getX(e),Br.y=this.getY(e),Br.z=this.getZ(e),Br.applyMatrix4(t),this.setXYZ(e,Br.x,Br.y,Br.z);return this},applyNormalMatrix:function(t){for(let e=0,i=this.count;e<i;e++)Br.x=this.getX(e),Br.y=this.getY(e),Br.z=this.getZ(e),Br.applyNormalMatrix(t),this.setXYZ(e,Br.x,Br.y,Br.z);return this},transformDirection:function(t){for(let e=0,i=this.count;e<i;e++)Br.x=this.getX(e),Br.y=this.getY(e),Br.z=this.getZ(e),Br.transformDirection(t),this.setXYZ(e,Br.x,Br.y,Br.z);return this},set:function(t,e=0){return this.array.set(t,e),this},getX:function(t){return this.array[t*this.itemSize]},setX:function(t,e){return this.array[t*this.itemSize]=e,this},getY:function(t){return this.array[t*this.itemSize+1]},setY:function(t,e){return this.array[t*this.itemSize+1]=e,this},getZ:function(t){return this.array[t*this.itemSize+2]},setZ:function(t,e){return this.array[t*this.itemSize+2]=e,this},getW:function(t){return this.array[t*this.itemSize+3]},setW:function(t,e){return this.array[t*this.itemSize+3]=e,this},setXY:function(t,e,i){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this},setXYZ:function(t,e,i,n){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=n,this},setXYZW:function(t,e,i,n,r){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=n,this.array[t+3]=r,this},onUpload:function(t){return this.onUploadCallback=t,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized}}}),Ur.prototype=Object.create(Hr.prototype),Ur.prototype.constructor=Ur,Vr.prototype=Object.create(Hr.prototype),Vr.prototype.constructor=Vr,Gr.prototype=Object.create(Hr.prototype),Gr.prototype.constructor=Gr,qr.prototype=Object.create(Hr.prototype),qr.prototype.constructor=qr,Wr.prototype=Object.create(Hr.prototype),Wr.prototype.constructor=Wr,Xr.prototype=Object.create(Hr.prototype),Xr.prototype.constructor=Xr,Yr.prototype=Object.create(Hr.prototype),Yr.prototype.constructor=Yr,Zr.prototype=Object.create(Hr.prototype),Zr.prototype.constructor=Zr,Zr.prototype.isFloat16BufferAttribute=!0,Jr.prototype=Object.create(Hr.prototype),Jr.prototype.constructor=Jr,Kr.prototype=Object.create(Hr.prototype),Kr.prototype.constructor=Kr;const ts={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function es(t,e){return new ts[t](e)}let is=0;const ns=new Hn,rs=new pr,ss=new fn,os=new _n,as=new _n,cs=new fn;function hs(){Object.defineProperty(this,"id",{value:is++}),this.uuid=nn.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}hs.prototype=Object.assign(Object.create(Qi.prototype),{constructor:hs,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(t){return Array.isArray(t)?this.index=new(Qr(t)>65535?Yr:Wr)(t,1):this.index=t,this},getAttribute:function(t){return this.attributes[t]},setAttribute:function(t,e){return this.attributes[t]=e,this},deleteAttribute:function(t){return delete this.attributes[t],this},hasAttribute:function(t){return void 0!==this.attributes[t]},addGroup:function(t,e,i=0){this.groups.push({start:t,count:e,materialIndex:i})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix4:function(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const e=(new sn).getNormalMatrix(t);i.applyNormalMatrix(e),i.needsUpdate=!0}const n=this.attributes.tangent;return void 0!==n&&(n.transformDirection(t),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(t){return ns.makeRotationX(t),this.applyMatrix4(ns),this},rotateY:function(t){return ns.makeRotationY(t),this.applyMatrix4(ns),this},rotateZ:function(t){return ns.makeRotationZ(t),this.applyMatrix4(ns),this},translate:function(t,e,i){return ns.makeTranslation(t,e,i),this.applyMatrix4(ns),this},scale:function(t,e,i){return ns.makeScale(t,e,i),this.applyMatrix4(ns),this},lookAt:function(t){return rs.lookAt(t),rs.updateMatrix(),this.applyMatrix4(rs.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(ss).negate(),this.translate(ss.x,ss.y,ss.z),this},setFromPoints:function(t){const e=[];for(let i=0,n=t.length;i<n;i++){const n=t[i];e.push(n.x,n.y,n.z||0)}return this.setAttribute("position",new Jr(e,3)),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new _n);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingBox.set(new fn(-1/0,-1/0,-1/0),new fn(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t<i;t++){const i=e[t];os.setFromBufferAttribute(i),this.morphTargetsRelative?(cs.addVectors(this.boundingBox.min,os.min),this.boundingBox.expandByPoint(cs),cs.addVectors(this.boundingBox.max,os.max),this.boundingBox.expandByPoint(cs)):(this.boundingBox.expandByPoint(os.min),this.boundingBox.expandByPoint(os.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new On);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingSphere.set(new fn,1/0);if(t){const i=this.boundingSphere.center;if(os.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t<i;t++){const i=e[t];as.setFromBufferAttribute(i),this.morphTargetsRelative?(cs.addVectors(os.min,as.min),os.expandByPoint(cs),cs.addVectors(os.max,as.max),os.expandByPoint(cs)):(os.expandByPoint(as.min),os.expandByPoint(as.max))}os.getCenter(i);let n=0;for(let e=0,r=t.count;e<r;e++)cs.fromBufferAttribute(t,e),n=Math.max(n,i.distanceToSquared(cs));if(e)for(let r=0,s=e.length;r<s;r++){const s=e[r],o=this.morphTargetsRelative;for(let e=0,r=s.count;e<r;e++)cs.fromBufferAttribute(s,e),o&&(ss.fromBufferAttribute(t,e),cs.add(ss)),n=Math.max(n,i.distanceToSquared(cs))}this.boundingSphere.radius=Math.sqrt(n),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},computeTangents:function(){const t=this.index,e=this.attributes;if(null===t||void 0===e.position||void 0===e.normal||void 0===e.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const i=t.array,n=e.position.array,r=e.normal.array,s=e.uv.array,o=n.length/3;void 0===e.tangent&&this.setAttribute("tangent",new Hr(new Float32Array(4*o),4));const a=e.tangent.array,c=[],h=[];for(let t=0;t<o;t++)c[t]=new fn,h[t]=new fn;const l=new fn,u=new fn,d=new fn,p=new rn,f=new rn,m=new rn,g=new fn,_=new fn;function v(t,e,i){l.fromArray(n,3*t),u.fromArray(n,3*e),d.fromArray(n,3*i),p.fromArray(s,2*t),f.fromArray(s,2*e),m.fromArray(s,2*i),u.sub(l),d.sub(l),f.sub(p),m.sub(p);const r=1/(f.x*m.y-m.x*f.y);isFinite(r)&&(g.copy(u).multiplyScalar(m.y).addScaledVector(d,-f.y).multiplyScalar(r),_.copy(d).multiplyScalar(f.x).addScaledVector(u,-m.x).multiplyScalar(r),c[t].add(g),c[e].add(g),c[i].add(g),h[t].add(_),h[e].add(_),h[i].add(_))}let y=this.groups;0===y.length&&(y=[{start:0,count:i.length}]);for(let t=0,e=y.length;t<e;++t){const e=y[t],n=e.start;for(let t=n,r=n+e.count;t<r;t+=3)v(i[t+0],i[t+1],i[t+2])}const b=new fn,x=new fn,w=new fn,S=new fn;function M(t){w.fromArray(r,3*t),S.copy(w);const e=c[t];b.copy(e),b.sub(w.multiplyScalar(w.dot(e))).normalize(),x.crossVectors(S,e);const i=x.dot(h[t])<0?-1:1;a[4*t]=b.x,a[4*t+1]=b.y,a[4*t+2]=b.z,a[4*t+3]=i}for(let t=0,e=y.length;t<e;++t){const e=y[t],n=e.start;for(let t=n,r=n+e.count;t<r;t+=3)M(i[t+0]),M(i[t+1]),M(i[t+2])}},computeVertexNormals:function(){const t=this.index,e=this.getAttribute("position");if(void 0!==e){let i=this.getAttribute("normal");if(void 0===i)i=new Hr(new Float32Array(3*e.count),3),this.setAttribute("normal",i);else for(let t=0,e=i.count;t<e;t++)i.setXYZ(t,0,0,0);const n=new fn,r=new fn,s=new fn,o=new fn,a=new fn,c=new fn,h=new fn,l=new fn;if(t)for(let u=0,d=t.count;u<d;u+=3){const d=t.getX(u+0),p=t.getX(u+1),f=t.getX(u+2);n.fromBufferAttribute(e,d),r.fromBufferAttribute(e,p),s.fromBufferAttribute(e,f),h.subVectors(s,r),l.subVectors(n,r),h.cross(l),o.fromBufferAttribute(i,d),a.fromBufferAttribute(i,p),c.fromBufferAttribute(i,f),o.add(h),a.add(h),c.add(h),i.setXYZ(d,o.x,o.y,o.z),i.setXYZ(p,a.x,a.y,a.z),i.setXYZ(f,c.x,c.y,c.z)}else for(let t=0,o=e.count;t<o;t+=3)n.fromBufferAttribute(e,t+0),r.fromBufferAttribute(e,t+1),s.fromBufferAttribute(e,t+2),h.subVectors(s,r),l.subVectors(n,r),h.cross(l),i.setXYZ(t+0,h.x,h.y,h.z),i.setXYZ(t+1,h.x,h.y,h.z),i.setXYZ(t+2,h.x,h.y,h.z);this.normalizeNormals(),i.needsUpdate=!0}},merge:function(t,e){if(!t||!t.isBufferGeometry)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",t);void 0===e&&(e=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));const i=this.attributes;for(const n in i){if(void 0===t.attributes[n])continue;const r=i[n].array,s=t.attributes[n],o=s.array,a=s.itemSize*e,c=Math.min(o.length,r.length-a);for(let t=0,e=a;t<c;t++,e++)r[e]=o[t]}return this},normalizeNormals:function(){const t=this.attributes.normal;for(let e=0,i=t.count;e<i;e++)cs.fromBufferAttribute(t,e),cs.normalize(),t.setXYZ(e,cs.x,cs.y,cs.z)},toNonIndexed:function(){function t(t,e){const i=t.array,n=t.itemSize,r=t.normalized,s=new i.constructor(e.length*n);let o=0,a=0;for(let t=0,r=e.length;t<r;t++){o=e[t]*n;for(let t=0;t<n;t++)s[a++]=i[o++]}return new Hr(s,n,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const e=new hs,i=this.index.array,n=this.attributes;for(const r in n){const s=t(n[r],i);e.setAttribute(r,s)}const r=this.morphAttributes;for(const n in r){const s=[],o=r[n];for(let e=0,n=o.length;e<n;e++){const n=t(o[e],i);s.push(n)}e.morphAttributes[n]=s}e.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let t=0,i=s.length;t<i;t++){const i=s[t];e.addGroup(i.start,i.count,i.materialIndex)}return e},toJSON:function(){const t={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const n=i[e],r=n.toJSON(t.data);""!==n.name&&(r.name=n.name),t.data.attributes[e]=r}const n={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],s=[];for(let e=0,n=i.length;e<n;e++){const n=i[e],r=n.toJSON(t.data);""!==n.name&&(r.name=n.name),s.push(r)}s.length>0&&(n[e]=s,r=!0)}r&&(t.data.morphAttributes=n,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const o=this.boundingSphere;return null!==o&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t},clone:function(){return(new hs).copy(this)},copy:function(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone(e));const n=t.attributes;for(const t in n){const i=n[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],n=r[t];for(let t=0,r=n.length;t<r;t++)i.push(n[t].clone(e));this.morphAttributes[t]=i}this.morphTargetsRelative=t.morphTargetsRelative;const s=t.groups;for(let t=0,e=s.length;t<e;t++){const e=s[t];this.addGroup(e.start,e.count,e.materialIndex)}const o=t.boundingBox;null!==o&&(this.boundingBox=o.clone());const a=t.boundingSphere;return null!==a&&(this.boundingSphere=a.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this},dispose:function(){this.dispatchEvent({type:"dispose"})}});const ls=new Hn,us=new jn,ds=new On,ps=new fn,fs=new fn,ms=new fn,gs=new fn,_s=new fn,vs=new fn,ys=new fn,bs=new fn,xs=new fn,ws=new rn,Ss=new rn,Ms=new rn,Ts=new fn,Cs=new fn;function Es(t=new hs,e=new Fr){pr.call(this),this.type="Mesh",this.geometry=t,this.material=e,this.updateMorphTargets()}function Is(t,e,i,n,r,s,o,a,c,h,l,u){ps.fromBufferAttribute(r,h),fs.fromBufferAttribute(r,l),ms.fromBufferAttribute(r,u);const d=t.morphTargetInfluences;if(e.morphTargets&&s&&d){ys.set(0,0,0),bs.set(0,0,0),xs.set(0,0,0);for(let t=0,e=s.length;t<e;t++){const e=d[t],i=s[t];0!==e&&(gs.fromBufferAttribute(i,h),_s.fromBufferAttribute(i,l),vs.fromBufferAttribute(i,u),o?(ys.addScaledVector(gs,e),bs.addScaledVector(_s,e),xs.addScaledVector(vs,e)):(ys.addScaledVector(gs.sub(ps),e),bs.addScaledVector(_s.sub(fs),e),xs.addScaledVector(vs.sub(ms),e)))}ps.add(ys),fs.add(bs),ms.add(xs)}t.isSkinnedMesh&&(t.boneTransform(h,ps),t.boneTransform(l,fs),t.boneTransform(u,ms));const p=function(t,e,i,n,r,s,o,a){let c;if(c=1===e.side?n.intersectTriangle(o,s,r,!0,a):n.intersectTriangle(r,s,o,2!==e.side,a),null===c)return null;Cs.copy(a),Cs.applyMatrix4(t.matrixWorld);const h=i.ray.origin.distanceTo(Cs);return h<i.near||h>i.far?null:{distance:h,point:Cs.clone(),object:t}}(t,e,i,n,ps,fs,ms,Ts);if(p){a&&(ws.fromBufferAttribute(a,h),Ss.fromBufferAttribute(a,l),Ms.fromBufferAttribute(a,u),p.uv=Ir.getUV(Ts,ps,fs,ms,ws,Ss,Ms,new rn)),c&&(ws.fromBufferAttribute(c,h),Ss.fromBufferAttribute(c,l),Ms.fromBufferAttribute(c,u),p.uv2=Ir.getUV(Ts,ps,fs,ms,ws,Ss,Ms,new rn));const t=new $r(h,l,u);Ir.getNormal(ps,fs,ms,t.normal),p.face=t}return p}Es.prototype=Object.assign(Object.create(pr.prototype),{constructor:Es,isMesh:!0,copy:function(t){return pr.prototype.copy.call(this,t),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=t.material,this.geometry=t.geometry,this},updateMorphTargets:function(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,i=Object.keys(e);if(i.length>0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e<i;e++){const i=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(t,e){const i=this.geometry,n=this.material,r=this.matrixWorld;if(void 0===n)return;if(null===i.boundingSphere&&i.computeBoundingSphere(),ds.copy(i.boundingSphere),ds.applyMatrix4(r),!1===t.ray.intersectsSphere(ds))return;if(ls.copy(r).invert(),us.copy(t.ray).applyMatrix4(ls),null!==i.boundingBox&&!1===us.intersectsBox(i.boundingBox))return;let s;if(i.isBufferGeometry){const r=i.index,o=i.attributes.position,a=i.morphAttributes.position,c=i.morphTargetsRelative,h=i.attributes.uv,l=i.attributes.uv2,u=i.groups,d=i.drawRange;if(null!==r)if(Array.isArray(n))for(let i=0,p=u.length;i<p;i++){const p=u[i],f=n[p.materialIndex];for(let i=Math.max(p.start,d.start),n=Math.min(p.start+p.count,d.start+d.count);i<n;i+=3){const n=r.getX(i),u=r.getX(i+1),d=r.getX(i+2);s=Is(this,f,t,us,o,a,c,h,l,n,u,d),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{for(let i=Math.max(0,d.start),u=Math.min(r.count,d.start+d.count);i<u;i+=3){const u=r.getX(i),d=r.getX(i+1),p=r.getX(i+2);s=Is(this,n,t,us,o,a,c,h,l,u,d,p),s&&(s.faceIndex=Math.floor(i/3),e.push(s))}}else if(void 0!==o)if(Array.isArray(n))for(let i=0,r=u.length;i<r;i++){const r=u[i],p=n[r.materialIndex];for(let i=Math.max(r.start,d.start),n=Math.min(r.start+r.count,d.start+d.count);i<n;i+=3){s=Is(this,p,t,us,o,a,c,h,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=r.materialIndex,e.push(s))}}else{for(let i=Math.max(0,d.start),r=Math.min(o.count,d.start+d.count);i<r;i+=3){s=Is(this,n,t,us,o,a,c,h,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),e.push(s))}}}else i.isGeometry&&console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}});class As extends hs{constructor(t=1,e=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const o=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const a=[],c=[],h=[],l=[];let u=0,d=0;function p(t,e,i,n,r,s,p,f,m,g,_){const v=s/m,y=p/g,b=s/2,x=p/2,w=f/2,S=m+1,M=g+1;let T=0,C=0;const E=new fn;for(let s=0;s<M;s++){const o=s*y-x;for(let a=0;a<S;a++){const u=a*v-b;E[t]=u*n,E[e]=o*r,E[i]=w,c.push(E.x,E.y,E.z),E[t]=0,E[e]=0,E[i]=f>0?1:-1,h.push(E.x,E.y,E.z),l.push(a/m),l.push(1-s/g),T+=1}}for(let t=0;t<g;t++)for(let e=0;e<m;e++){const i=u+e+S*t,n=u+e+S*(t+1),r=u+(e+1)+S*(t+1),s=u+(e+1)+S*t;a.push(i,n,s),a.push(n,r,s),C+=6}o.addGroup(d,C,_),d+=C,u+=T}p("z","y","x",-1,-1,i,e,t,s,r,0),p("z","y","x",1,-1,i,e,-t,s,r,1),p("x","z","y",1,1,t,i,e,n,s,2),p("x","z","y",1,-1,t,i,-e,n,s,3),p("x","y","z",1,-1,t,e,i,n,r,4),p("x","y","z",-1,-1,t,e,-i,n,r,5),this.setIndex(a),this.setAttribute("position",new Jr(c,3)),this.setAttribute("normal",new Jr(h,3)),this.setAttribute("uv",new Jr(l,2))}}function Ps(t){const e={};for(const i in t){e[i]={};for(const n in t[i]){const r=t[i][n];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture)?e[i][n]=r.clone():Array.isArray(r)?e[i][n]=r.slice():e[i][n]=r}}return e}function Rs(t){const e={};for(let i=0;i<t.length;i++){const n=Ps(t[i]);for(const t in n)e[t]=n[t]}return e}const Ls={clone:Ps,merge:Rs};function Os(t){zr.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,void 0!==t&&(void 0!==t.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(t))}function Ns(){pr.call(this),this.type="Camera",this.matrixWorldInverse=new Hn,this.projectionMatrix=new Hn,this.projectionMatrixInverse=new Hn}function Ds(t=50,e=1,i=.1,n=2e3){Ns.call(this),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}Os.prototype=Object.create(zr.prototype),Os.prototype.constructor=Os,Os.prototype.isShaderMaterial=!0,Os.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Ps(t.uniforms),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.lights=t.lights,this.clipping=t.clipping,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this},Os.prototype.toJSON=function(t){const e=zr.prototype.toJSON.call(this,t);e.glslVersion=this.glslVersion,e.uniforms={};for(const i in this.uniforms){const n=this.uniforms[i].value;n&&n.isTexture?e.uniforms[i]={type:"t",value:n.toJSON(t).uuid}:n&&n.isColor?e.uniforms[i]={type:"c",value:n.getHex()}:n&&n.isVector2?e.uniforms[i]={type:"v2",value:n.toArray()}:n&&n.isVector3?e.uniforms[i]={type:"v3",value:n.toArray()}:n&&n.isVector4?e.uniforms[i]={type:"v4",value:n.toArray()}:n&&n.isMatrix3?e.uniforms[i]={type:"m3",value:n.toArray()}:n&&n.isMatrix4?e.uniforms[i]={type:"m4",value:n.toArray()}:e.uniforms[i]={value:n}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e},Ns.prototype=Object.assign(Object.create(pr.prototype),{constructor:Ns,isCamera:!0,copy:function(t,e){return pr.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new fn),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()},updateMatrixWorld:function(t){pr.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()},updateWorldMatrix:function(t,e){pr.prototype.updateWorldMatrix.call(this,t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()},clone:function(){return(new this.constructor).copy(this)}}),Ds.prototype=Object.assign(Object.create(Ns.prototype),{constructor:Ds,isPerspectiveCamera:!0,copy:function(t,e){return Ns.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){const e=.5*this.getFilmHeight()/t;this.fov=2*nn.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){const t=Math.tan(.5*nn.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*nn.RAD2DEG*Math.atan(Math.tan(.5*nn.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){const t=this.near;let e=t*Math.tan(.5*nn.DEG2RAD*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,o=s.fullHeight;r+=s.offsetX*n/t,e-=s.offsetY*i/o,n*=s.width/t,i*=s.height/o}const o=this.filmOffset;0!==o&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()},toJSON:function(t){const e=pr.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}});const $s=90;function ks(t,e,i){if(pr.call(this),this.type="CubeCamera",!0!==i.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=i;const n=new Ds($s,1,t,e);n.layers=this.layers,n.up.set(0,-1,0),n.lookAt(new fn(1,0,0)),this.add(n);const r=new Ds($s,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new fn(-1,0,0)),this.add(r);const s=new Ds($s,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new fn(0,1,0)),this.add(s);const o=new Ds($s,1,t,e);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(new fn(0,-1,0)),this.add(o);const a=new Ds($s,1,t,e);a.layers=this.layers,a.up.set(0,-1,0),a.lookAt(new fn(0,0,1)),this.add(a);const c=new Ds($s,1,t,e);c.layers=this.layers,c.up.set(0,-1,0),c.lookAt(new fn(0,0,-1)),this.add(c),this.update=function(t,e){null===this.parent&&this.updateMatrixWorld();const h=t.xr.enabled,l=t.getRenderTarget();t.xr.enabled=!1;const u=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0),t.render(e,n),t.setRenderTarget(i,1),t.render(e,r),t.setRenderTarget(i,2),t.render(e,s),t.setRenderTarget(i,3),t.render(e,o),t.setRenderTarget(i,4),t.render(e,a),i.texture.generateMipmaps=u,t.setRenderTarget(i,5),t.render(e,c),t.setRenderTarget(l),t.xr.enabled=h}}function zs(t,e,i,n,r,s,o,a,c,h){t=void 0!==t?t:[],e=void 0!==e?e:301,o=void 0!==o?o:ki,hn.call(this,t,e,i,n,r,s,o,a,c,h),this.flipY=!1,this._needsFlipEnvMap=!0}ks.prototype=Object.create(pr.prototype),ks.prototype.constructor=ks,zs.prototype=Object.create(hn.prototype),zs.prototype.constructor=zs,zs.prototype.isCubeTexture=!0,Object.defineProperty(zs.prototype,"images",{get:function(){return this.image},set:function(t){this.image=t}});class Fs extends dn{constructor(t,e,i){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=i),super(t,t,e),Object.defineProperty(this,"isWebGLCubeRenderTarget",{value:!0}),e=e||{},this.texture=new zs(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=zi,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},n=new As(5,5,5),r=new Os({name:"CubemapFromEquirect",uniforms:Ps(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new Es(n,r),o=e.minFilter;e.minFilter===Pi&&(e.minFilter=Ai);return new ks(1,10,this).update(t,s),e.minFilter=o,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,i,n){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,n);t.setRenderTarget(r)}}function Bs(t,e,i,n,r,s,o,a,c,h,l,u){hn.call(this,null,s,o,a,c,h,n,r,l,u),this.image={data:t||null,width:e||1,height:i||1},this.magFilter=void 0!==c?c:Ii,this.minFilter=void 0!==h?h:Ii,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}Bs.prototype=Object.create(hn.prototype),Bs.prototype.constructor=Bs,Bs.prototype.isDataTexture=!0;const js=new On,Hs=new fn;class Us{constructor(t,e,i,n,r,s){this.planes=[void 0!==t?t:new _r,void 0!==e?e:new _r,void 0!==i?i:new _r,void 0!==n?n:new _r,void 0!==r?r:new _r,void 0!==s?s:new _r]}set(t,e,i,n,r,s){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(i),o[3].copy(n),o[4].copy(r),o[5].copy(s),this}clone(){return(new this.constructor).copy(this)}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t){const e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],o=i[3],a=i[4],c=i[5],h=i[6],l=i[7],u=i[8],d=i[9],p=i[10],f=i[11],m=i[12],g=i[13],_=i[14],v=i[15];return e[0].setComponents(o-n,l-a,f-u,v-m).normalize(),e[1].setComponents(o+n,l+a,f+u,v+m).normalize(),e[2].setComponents(o+r,l+c,f+d,v+g).normalize(),e[3].setComponents(o-r,l-c,f-d,v-g).normalize(),e[4].setComponents(o-s,l-h,f-p,v-_).normalize(),e[5].setComponents(o+s,l+h,f+p,v+_).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),js.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(js)}intersectsSprite(t){return js.center.set(0,0,0),js.radius=.7071067811865476,js.applyMatrix4(t.matrixWorld),this.intersectsSphere(js)}intersectsSphere(t){const e=this.planes,i=t.center,n=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)<n)return!1}return!0}intersectsBox(t){const e=this.planes;for(let i=0;i<6;i++){const n=e[i];if(Hs.x=n.normal.x>0?t.max.x:t.min.x,Hs.y=n.normal.y>0?t.max.y:t.min.y,Hs.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(Hs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}}function Vs(){let t=null,e=!1,i=null,n=null;function r(e,s){i(e,s),n=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==i&&(n=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function Gs(t,e){const i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=n.get(e);return void((!t||t.version<e.version)&&n.set(e,{buffer:e.buffer,type:e.type,bytesPerElement:e.elementSize,version:e.version}))}e.isInterleavedBufferAttribute&&(e=e.data);const s=n.get(e);void 0===s?n.set(e,function(e,n){const r=e.array,s=e.usage,o=t.createBuffer();t.bindBuffer(n,o),t.bufferData(n,r,s),e.onUploadCallback();let a=5126;return r instanceof Float32Array?a=5126:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?e.isFloat16BufferAttribute?i?a=5131:console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2."):a=5123:r instanceof Int16Array?a=5122:r instanceof Uint32Array?a=5125:r instanceof Int32Array?a=5124:r instanceof Int8Array?a=5120:r instanceof Uint8Array&&(a=5121),{buffer:o,type:a,bytesPerElement:r.BYTES_PER_ELEMENT,version:e.version}}(e,r)):s.version<e.version&&(!function(e,n,r){const s=n.array,o=n.updateRange;t.bindBuffer(r,e),-1===o.count?t.bufferSubData(r,0,s):(i?t.bufferSubData(r,o.offset*s.BYTES_PER_ELEMENT,s,o.offset,o.count):t.bufferSubData(r,o.offset*s.BYTES_PER_ELEMENT,s.subarray(o.offset,o.offset+o.count)),o.count=-1)}(s.buffer,e,r),s.version=e.version)}}}class qs extends hs{constructor(t=1,e=1,i=1,n=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:i,heightSegments:n};const r=t/2,s=e/2,o=Math.floor(i),a=Math.floor(n),c=o+1,h=a+1,l=t/o,u=e/a,d=[],p=[],f=[],m=[];for(let t=0;t<h;t++){const e=t*u-s;for(let i=0;i<c;i++){const n=i*l-r;p.push(n,-e,0),f.push(0,0,1),m.push(i/o),m.push(1-t/a)}}for(let t=0;t<a;t++)for(let e=0;e<o;e++){const i=e+c*t,n=e+c*(t+1),r=e+1+c*(t+1),s=e+1+c*t;d.push(i,n,s),d.push(n,r,s)}this.setIndex(d),this.setAttribute("position",new Jr(p,3)),this.setAttribute("normal",new Jr(f,3)),this.setAttribute("uv",new Jr(m,2))}}const Ws={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmissionmap_fragment:"#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif",transmissionmap_pars_fragment:"#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <transmissionmap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <transmissionmap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},Xs={common:{diffuse:{value:new Dr(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new sn},uv2Transform:{value:new sn},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new rn(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Dr(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Dr(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new sn}},sprite:{diffuse:{value:new Dr(15658734)},opacity:{value:1},center:{value:new rn(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new sn}}},Ys={basic:{uniforms:Rs([Xs.common,Xs.specularmap,Xs.envmap,Xs.aomap,Xs.lightmap,Xs.fog]),vertexShader:Ws.meshbasic_vert,fragmentShader:Ws.meshbasic_frag},lambert:{uniforms:Rs([Xs.common,Xs.specularmap,Xs.envmap,Xs.aomap,Xs.lightmap,Xs.emissivemap,Xs.fog,Xs.lights,{emissive:{value:new Dr(0)}}]),vertexShader:Ws.meshlambert_vert,fragmentShader:Ws.meshlambert_frag},phong:{uniforms:Rs([Xs.common,Xs.specularmap,Xs.envmap,Xs.aomap,Xs.lightmap,Xs.emissivemap,Xs.bumpmap,Xs.normalmap,Xs.displacementmap,Xs.fog,Xs.lights,{emissive:{value:new Dr(0)},specular:{value:new Dr(1118481)},shininess:{value:30}}]),vertexShader:Ws.meshphong_vert,fragmentShader:Ws.meshphong_frag},standard:{uniforms:Rs([Xs.common,Xs.envmap,Xs.aomap,Xs.lightmap,Xs.emissivemap,Xs.bumpmap,Xs.normalmap,Xs.displacementmap,Xs.roughnessmap,Xs.metalnessmap,Xs.fog,Xs.lights,{emissive:{value:new Dr(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Ws.meshphysical_vert,fragmentShader:Ws.meshphysical_frag},toon:{uniforms:Rs([Xs.common,Xs.aomap,Xs.lightmap,Xs.emissivemap,Xs.bumpmap,Xs.normalmap,Xs.displacementmap,Xs.gradientmap,Xs.fog,Xs.lights,{emissive:{value:new Dr(0)}}]),vertexShader:Ws.meshtoon_vert,fragmentShader:Ws.meshtoon_frag},matcap:{uniforms:Rs([Xs.common,Xs.bumpmap,Xs.normalmap,Xs.displacementmap,Xs.fog,{matcap:{value:null}}]),vertexShader:Ws.meshmatcap_vert,fragmentShader:Ws.meshmatcap_frag},points:{uniforms:Rs([Xs.points,Xs.fog]),vertexShader:Ws.points_vert,fragmentShader:Ws.points_frag},dashed:{uniforms:Rs([Xs.common,Xs.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Ws.linedashed_vert,fragmentShader:Ws.linedashed_frag},depth:{uniforms:Rs([Xs.common,Xs.displacementmap]),vertexShader:Ws.depth_vert,fragmentShader:Ws.depth_frag},normal:{uniforms:Rs([Xs.common,Xs.bumpmap,Xs.normalmap,Xs.displacementmap,{opacity:{value:1}}]),vertexShader:Ws.normal_vert,fragmentShader:Ws.normal_frag},sprite:{uniforms:Rs([Xs.sprite,Xs.fog]),vertexShader:Ws.sprite_vert,fragmentShader:Ws.sprite_frag},background:{uniforms:{uvTransform:{value:new sn},t2D:{value:null}},vertexShader:Ws.background_vert,fragmentShader:Ws.background_frag},cube:{uniforms:Rs([Xs.envmap,{opacity:{value:1}}]),vertexShader:Ws.cube_vert,fragmentShader:Ws.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Ws.equirect_vert,fragmentShader:Ws.equirect_frag},distanceRGBA:{uniforms:Rs([Xs.common,Xs.displacementmap,{referencePosition:{value:new fn},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Ws.distanceRGBA_vert,fragmentShader:Ws.distanceRGBA_frag},shadow:{uniforms:Rs([Xs.lights,Xs.fog,{color:{value:new Dr(0)},opacity:{value:1}}]),vertexShader:Ws.shadow_vert,fragmentShader:Ws.shadow_frag}};function Zs(t,e,i,n,r){const s=new Dr(0);let o,a,c=0,h=null,l=0,u=null;function d(t,e){i.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),c=e,d(s,c)},getClearAlpha:function(){return c},setClearAlpha:function(t){c=t,d(s,c)},render:function(i,r,p,f){let m=!0===r.isScene?r.background:null;m&&m.isTexture&&(m=e.get(m));const g=t.xr,_=g.getSession&&g.getSession();_&&"additive"===_.environmentBlendMode&&(m=null),null===m?d(s,c):m&&m.isColor&&(d(m,1),f=!0),(t.autoClear||f)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),m&&(m.isCubeTexture||m.isWebGLCubeRenderTarget||306===m.mapping)?(void 0===a&&(a=new Es(new As(1,1,1),new Os({name:"BackgroundCubeMaterial",uniforms:Ps(Ys.cube.uniforms),vertexShader:Ys.cube.vertexShader,fragmentShader:Ys.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),a.geometry.deleteAttribute("uv"),a.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(a.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(a)),m.isWebGLCubeRenderTarget&&(m=m.texture),a.material.uniforms.envMap.value=m,a.material.uniforms.flipEnvMap.value=m.isCubeTexture&&m._needsFlipEnvMap?-1:1,h===m&&l===m.version&&u===t.toneMapping||(a.material.needsUpdate=!0,h=m,l=m.version,u=t.toneMapping),i.unshift(a,a.geometry,a.material,0,0,null)):m&&m.isTexture&&(void 0===o&&(o=new Es(new qs(2,2),new Os({name:"BackgroundMaterial",uniforms:Ps(Ys.background.uniforms),vertexShader:Ys.background.vertexShader,fragmentShader:Ys.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),Object.defineProperty(o.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(o)),o.material.uniforms.t2D.value=m,!0===m.matrixAutoUpdate&&m.updateMatrix(),o.material.uniforms.uvTransform.value.copy(m.matrix),h===m&&l===m.version&&u===t.toneMapping||(o.material.needsUpdate=!0,h=m,l=m.version,u=t.toneMapping),i.unshift(o,o.geometry,o.material,0,0,null))}}}function Js(t,e,i,n){const r=t.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),o=n.isWebGL2||null!==s,a={},c=d(null);let h=c;function l(e){return n.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return n.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],i=[],n=[];for(let t=0;t<r;t++)e[t]=0,i[t]=0,n[t]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:e,enabledAttributes:i,attributeDivisors:n,object:t,attributes:{},index:null}}function p(){const t=h.newAttributes;for(let e=0,i=t.length;e<i;e++)t[e]=0}function f(t){m(t,0)}function m(i,r){const s=h.newAttributes,o=h.enabledAttributes,a=h.attributeDivisors;if(s[i]=1,0===o[i]&&(t.enableVertexAttribArray(i),o[i]=1),a[i]!==r){(n.isWebGL2?t:e.get("ANGLE_instanced_arrays"))[n.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](i,r),a[i]=r}}function g(){const e=h.newAttributes,i=h.enabledAttributes;for(let n=0,r=i.length;n<r;n++)i[n]!==e[n]&&(t.disableVertexAttribArray(n),i[n]=0)}function _(e,i,r,s,o,a){!0!==n.isWebGL2||5124!==r&&5125!==r?t.vertexAttribPointer(e,i,r,s,o,a):t.vertexAttribIPointer(e,i,r,o,a)}function v(){y(),h!==c&&(h=c,l(h.object))}function y(){c.geometry=null,c.program=null,c.wireframe=!1}return{setup:function(r,c,u,v,y){let b=!1;if(o){const e=function(e,i,r){const o=!0===r.wireframe;let c=a[e.id];void 0===c&&(c={},a[e.id]=c);let h=c[i.id];void 0===h&&(h={},c[i.id]=h);let l=h[o];void 0===l&&(l=d(n.isWebGL2?t.createVertexArray():s.createVertexArrayOES()),h[o]=l);return l}(v,u,c);h!==e&&(h=e,l(h.object)),b=function(t,e){const i=h.attributes,n=t.attributes;let r=0;for(const t in n){const e=i[t],s=n[t];if(void 0===e)return!0;if(e.attribute!==s)return!0;if(e.data!==s.data)return!0;r++}return h.attributesNum!==r||h.index!==e}(v,y),b&&function(t,e){const i={},n=t.attributes;let r=0;for(const t in n){const e=n[t],s={};s.attribute=e,e.data&&(s.data=e.data),i[t]=s,r++}h.attributes=i,h.attributesNum=r,h.index=e}(v,y)}else{const t=!0===c.wireframe;h.geometry===v.id&&h.program===u.id&&h.wireframe===t||(h.geometry=v.id,h.program=u.id,h.wireframe=t,b=!0)}!0===r.isInstancedMesh&&(b=!0),null!==y&&i.update(y,34963),b&&(!function(r,s,o,a){if(!1===n.isWebGL2&&(r.isInstancedMesh||a.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;p();const c=a.attributes,h=o.getAttributes(),l=s.defaultAttributeValues;for(const e in h){const n=h[e];if(n>=0){const s=c[e];if(void 0!==s){const e=s.normalized,r=s.itemSize,o=i.get(s);if(void 0===o)continue;const c=o.buffer,h=o.type,l=o.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,o=i.stride,u=s.offset;i&&i.isInstancedInterleavedBuffer?(m(n,i.meshPerAttribute),void 0===a._maxInstanceCount&&(a._maxInstanceCount=i.meshPerAttribute*i.count)):f(n),t.bindBuffer(34962,c),_(n,r,h,e,o*l,u*l)}else s.isInstancedBufferAttribute?(m(n,s.meshPerAttribute),void 0===a._maxInstanceCount&&(a._maxInstanceCount=s.meshPerAttribute*s.count)):f(n),t.bindBuffer(34962,c),_(n,r,h,e,0,0)}else if("instanceMatrix"===e){const e=i.get(r.instanceMatrix);if(void 0===e)continue;const s=e.buffer,o=e.type;m(n+0,1),m(n+1,1),m(n+2,1),m(n+3,1),t.bindBuffer(34962,s),t.vertexAttribPointer(n+0,4,o,!1,64,0),t.vertexAttribPointer(n+1,4,o,!1,64,16),t.vertexAttribPointer(n+2,4,o,!1,64,32),t.vertexAttribPointer(n+3,4,o,!1,64,48)}else if("instanceColor"===e){const e=i.get(r.instanceColor);if(void 0===e)continue;const s=e.buffer,o=e.type;m(n,1),t.bindBuffer(34962,s),t.vertexAttribPointer(n,3,o,!1,12,0)}else if(void 0!==l){const i=l[e];if(void 0!==i)switch(i.length){case 2:t.vertexAttrib2fv(n,i);break;case 3:t.vertexAttrib3fv(n,i);break;case 4:t.vertexAttrib4fv(n,i);break;default:t.vertexAttrib1fv(n,i)}}}}g()}(r,c,u,v),null!==y&&t.bindBuffer(34963,i.get(y).buffer))},reset:v,resetDefaultState:y,dispose:function(){v();for(const t in a){const e=a[t];for(const t in e){const i=e[t];for(const t in i)u(i[t].object),delete i[t];delete e[t]}delete a[t]}},releaseStatesOfGeometry:function(t){if(void 0===a[t.id])return;const e=a[t.id];for(const t in e){const i=e[t];for(const t in i)u(i[t].object),delete i[t];delete e[t]}delete a[t.id]},releaseStatesOfProgram:function(t){for(const e in a){const i=a[e];if(void 0===i[t.id])continue;const n=i[t.id];for(const t in n)u(n[t].object),delete n[t];delete i[t.id]}},initAttributes:p,enableAttribute:f,disableUnusedAttributes:g}}function Ks(t,e,i,n){const r=n.isWebGL2;let s;this.setMode=function(t){s=t},this.render=function(e,n){t.drawArrays(s,e,n),i.update(n,s,1)},this.renderInstances=function(n,o,a){if(0===a)return;let c,h;if(r)c=t,h="drawArraysInstanced";else if(c=e.get("ANGLE_instanced_arrays"),h="drawArraysInstancedANGLE",null===c)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");c[h](s,n,o,a),i.update(o,s,a)}}function Qs(t,e,i){let n;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let o=void 0!==i.precision?i.precision:"highp";const a=r(o);a!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",a,"instead."),o=a);const c=!0===i.logarithmicDepthBuffer,h=t.getParameter(34930),l=t.getParameter(35660),u=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),f=t.getParameter(36347),m=t.getParameter(36348),g=t.getParameter(36349),_=l>0,v=s||!!e.get("OES_texture_float");return{isWebGL2:s,getMaxAnisotropy:function(){if(void 0!==n)return n;const i=e.get("EXT_texture_filter_anisotropic");return n=null!==i?t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,n},getMaxPrecision:r,precision:o,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:u,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:g,vertexTextures:_,floatFragmentTextures:v,floatVertexTextures:_&&v,maxSamples:s?t.getParameter(36183):0}}function to(t){const e=this;let i=null,n=0,r=!1,s=!1;const o=new _r,a=new sn,c={value:null,needsUpdate:!1};function h(){c.value!==i&&(c.value=i,c.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function l(t,i,n,r){const s=null!==t?t.length:0;let h=null;if(0!==s){if(h=c.value,!0!==r||null===h){const e=n+4*s,r=i.matrixWorldInverse;a.getNormalMatrix(r),(null===h||h.length<e)&&(h=new Float32Array(e));for(let e=0,i=n;e!==s;++e,i+=4)o.copy(t[e]).applyMatrix4(r,a),o.normal.toArray(h,i),h[i+3]=o.constant}c.value=h,c.needsUpdate=!0}return e.numPlanes=s,e.numIntersection=0,h}this.uniform=c,this.numPlanes=0,this.numIntersection=0,this.init=function(t,e,s){const o=0!==t.length||e||0!==n||r;return r=e,i=l(t,s,0),n=t.length,o},this.beginShadows=function(){s=!0,l(null)},this.endShadows=function(){s=!1,h()},this.setState=function(e,o,a){const u=e.clippingPlanes,d=e.clipIntersection,p=e.clipShadows,f=t.get(e);if(!r||null===u||0===u.length||s&&!p)s?l(null):h();else{const t=s?0:n,e=4*t;let r=f.clippingState||null;c.value=r,r=l(u,o,e,a);for(let t=0;t!==e;++t)r[t]=i[t];f.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=t}}}function eo(t){let e=new WeakMap;function i(t,e){return 303===e?t.mapping=301:304===e&&(t.mapping=302),t}function n(t){const i=t.target;i.removeEventListener("dispose",n);const r=e.get(i);void 0!==r&&(e.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping;if(303===s||304===s){if(e.has(r)){return i(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const o=t.getRenderList(),a=t.getRenderTarget(),c=new Fs(s.height/2);return c.fromEquirectangularTexture(t,r),e.set(r,c),t.setRenderTarget(a),t.setRenderList(o),r.addEventListener("dispose",n),i(c.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}function io(t){const e={};function i(i){if(void 0!==e[i])return e[i];let n;switch(i){case"WEBGL_depth_texture":n=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=t.getExtension(i)}return e[i]=n,n}return{has:function(t){return null!==i(t)},init:function(t){t.isWebGL2?i("EXT_color_buffer_float"):(i("WEBGL_depth_texture"),i("OES_texture_float"),i("OES_texture_half_float"),i("OES_texture_half_float_linear"),i("OES_standard_derivatives"),i("OES_element_index_uint"),i("OES_vertex_array_object"),i("ANGLE_instanced_arrays")),i("OES_texture_float_linear"),i("EXT_color_buffer_half_float")},get:function(t){const e=i(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function no(t,e,i,n){const r={},s=new WeakMap;function o(t){const a=t.target;null!==a.index&&e.remove(a.index);for(const t in a.attributes)e.remove(a.attributes[t]);a.removeEventListener("dispose",o),delete r[a.id];const c=s.get(a);c&&(e.remove(c),s.delete(a)),n.releaseStatesOfGeometry(a),!0===a.isInstancedBufferGeometry&&delete a._maxInstanceCount,i.memory.geometries--}function a(t){const i=[],n=t.index,r=t.attributes.position;let o=0;if(null!==n){const t=n.array;o=n.version;for(let e=0,n=t.length;e<n;e+=3){const n=t[e+0],r=t[e+1],s=t[e+2];i.push(n,r,r,s,s,n)}}else{const t=r.array;o=r.version;for(let e=0,n=t.length/3-1;e<n;e+=3){const t=e+0,n=e+1,r=e+2;i.push(t,n,n,r,r,t)}}const a=new(Qr(i)>65535?Yr:Wr)(i,1);a.version=o;const c=s.get(t);c&&e.remove(c),s.set(t,a)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",o),r[e.id]=!0,i.memory.geometries++),e},update:function(t){const i=t.attributes;for(const t in i)e.update(i[t],34962);const n=t.morphAttributes;for(const t in n){const i=n[t];for(let t=0,n=i.length;t<n;t++)e.update(i[t],34962)}},getWireframeAttribute:function(t){const e=s.get(t);if(e){const i=t.index;null!==i&&e.version<i.version&&a(t)}else a(t);return s.get(t)}}}function ro(t,e,i,n){const r=n.isWebGL2;let s,o,a;this.setMode=function(t){s=t},this.setIndex=function(t){o=t.type,a=t.bytesPerElement},this.render=function(e,n){t.drawElements(s,n,o,e*a),i.update(n,s,1)},this.renderInstances=function(n,c,h){if(0===h)return;let l,u;if(r)l=t,u="drawElementsInstanced";else if(l=e.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===l)return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[u](s,c,o,n*a,h),i.update(c,s,h)}}function so(t){const e={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:e,programs:null,autoReset:!0,reset:function(){e.frame++,e.calls=0,e.triangles=0,e.points=0,e.lines=0},update:function(t,i,n){switch(e.calls++,i){case 4:e.triangles+=n*(t/3);break;case 1:e.lines+=n*(t/2);break;case 3:e.lines+=n*(t-1);break;case 2:e.lines+=n*t;break;case 0:e.points+=n*t;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}function oo(t,e){return t[0]-e[0]}function ao(t,e){return Math.abs(e[1])-Math.abs(t[1])}function co(t){const e={},i=new Float32Array(8),n=[];for(let t=0;t<8;t++)n[t]=[t,0];return{update:function(r,s,o,a){const c=r.morphTargetInfluences,h=void 0===c?0:c.length;let l=e[s.id];if(void 0===l){l=[];for(let t=0;t<h;t++)l[t]=[t,0];e[s.id]=l}for(let t=0;t<h;t++){const e=l[t];e[0]=t,e[1]=c[t]}l.sort(ao);for(let t=0;t<8;t++)t<h&&l[t][1]?(n[t][0]=l[t][0],n[t][1]=l[t][1]):(n[t][0]=Number.MAX_SAFE_INTEGER,n[t][1]=0);n.sort(oo);const u=o.morphTargets&&s.morphAttributes.position,d=o.morphNormals&&s.morphAttributes.normal;let p=0;for(let t=0;t<8;t++){const e=n[t],r=e[0],o=e[1];r!==Number.MAX_SAFE_INTEGER&&o?(u&&s.getAttribute("morphTarget"+t)!==u[r]&&s.setAttribute("morphTarget"+t,u[r]),d&&s.getAttribute("morphNormal"+t)!==d[r]&&s.setAttribute("morphNormal"+t,d[r]),i[t]=o,p+=o):(u&&!0===s.hasAttribute("morphTarget"+t)&&s.deleteAttribute("morphTarget"+t),d&&!0===s.hasAttribute("morphNormal"+t)&&s.deleteAttribute("morphNormal"+t),i[t]=0)}const f=s.morphTargetsRelative?1:1-p;a.getUniforms().setValue(t,"morphTargetBaseInfluence",f),a.getUniforms().setValue(t,"morphTargetInfluences",i)}}}function ho(t,e,i,n){let r=new WeakMap;function s(t){const e=t.target;e.removeEventListener("dispose",s),i.remove(e.instanceMatrix),null!==e.instanceColor&&i.remove(e.instanceColor)}return{update:function(t){const o=n.render.frame,a=t.geometry,c=e.get(t,a);return r.get(c)!==o&&(e.update(c),r.set(c,o)),t.isInstancedMesh&&(!1===t.hasEventListener("dispose",s)&&t.addEventListener("dispose",s),i.update(t.instanceMatrix,34962),null!==t.instanceColor&&i.update(t.instanceColor,34962)),c},dispose:function(){r=new WeakMap}}}function lo(t=null,e=1,i=1,n=1){hn.call(this,null),this.image={data:t,width:e,height:i,depth:n},this.magFilter=Ii,this.minFilter=Ii,this.wrapR=Ci,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}function uo(t=null,e=1,i=1,n=1){hn.call(this,null),this.image={data:t,width:e,height:i,depth:n},this.magFilter=Ii,this.minFilter=Ii,this.wrapR=Ci,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}Ys.physical={uniforms:Rs([Ys.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new rn(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new Dr(0)},transmission:{value:0},transmissionMap:{value:null}}]),vertexShader:Ws.meshphysical_vert,fragmentShader:Ws.meshphysical_frag},lo.prototype=Object.create(hn.prototype),lo.prototype.constructor=lo,lo.prototype.isDataTexture2DArray=!0,uo.prototype=Object.create(hn.prototype),uo.prototype.constructor=uo,uo.prototype.isDataTexture3D=!0;const po=new hn,fo=new lo,mo=new uo,go=new zs,_o=[],vo=[],yo=new Float32Array(16),bo=new Float32Array(9),xo=new Float32Array(4);function wo(t,e,i){const n=t[0];if(n<=0||n>0)return t;const r=e*i;let s=_o[r];if(void 0===s&&(s=new Float32Array(r),_o[r]=s),0!==e){n.toArray(s,0);for(let n=1,r=0;n!==e;++n)r+=i,t[n].toArray(s,r)}return s}function So(t,e){if(t.length!==e.length)return!1;for(let i=0,n=t.length;i<n;i++)if(t[i]!==e[i])return!1;return!0}function Mo(t,e){for(let i=0,n=e.length;i<n;i++)t[i]=e[i]}function To(t,e){let i=vo[e];void 0===i&&(i=new Int32Array(e),vo[e]=i);for(let n=0;n!==e;++n)i[n]=t.allocateTextureUnit();return i}function Co(t,e){const i=this.cache;i[0]!==e&&(t.uniform1f(this.addr,e),i[0]=e)}function Eo(t,e){const i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y||(t.uniform2f(this.addr,e.x,e.y),i[0]=e.x,i[1]=e.y);else{if(So(i,e))return;t.uniform2fv(this.addr,e),Mo(i,e)}}function Io(t,e){const i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z||(t.uniform3f(this.addr,e.x,e.y,e.z),i[0]=e.x,i[1]=e.y,i[2]=e.z);else if(void 0!==e.r)i[0]===e.r&&i[1]===e.g&&i[2]===e.b||(t.uniform3f(this.addr,e.r,e.g,e.b),i[0]=e.r,i[1]=e.g,i[2]=e.b);else{if(So(i,e))return;t.uniform3fv(this.addr,e),Mo(i,e)}}function Ao(t,e){const i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z&&i[3]===e.w||(t.uniform4f(this.addr,e.x,e.y,e.z,e.w),i[0]=e.x,i[1]=e.y,i[2]=e.z,i[3]=e.w);else{if(So(i,e))return;t.uniform4fv(this.addr,e),Mo(i,e)}}function Po(t,e){const i=this.cache,n=e.elements;if(void 0===n){if(So(i,e))return;t.uniformMatrix2fv(this.addr,!1,e),Mo(i,e)}else{if(So(i,n))return;xo.set(n),t.uniformMatrix2fv(this.addr,!1,xo),Mo(i,n)}}function Ro(t,e){const i=this.cache,n=e.elements;if(void 0===n){if(So(i,e))return;t.uniformMatrix3fv(this.addr,!1,e),Mo(i,e)}else{if(So(i,n))return;bo.set(n),t.uniformMatrix3fv(this.addr,!1,bo),Mo(i,n)}}function Lo(t,e){const i=this.cache,n=e.elements;if(void 0===n){if(So(i,e))return;t.uniformMatrix4fv(this.addr,!1,e),Mo(i,e)}else{if(So(i,n))return;yo.set(n),t.uniformMatrix4fv(this.addr,!1,yo),Mo(i,n)}}function Oo(t,e,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.safeSetTexture2D(e||po,r)}function No(t,e,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.setTexture2DArray(e||fo,r)}function Do(t,e,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.setTexture3D(e||mo,r)}function $o(t,e,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.safeSetTextureCube(e||go,r)}function ko(t,e){const i=this.cache;i[0]!==e&&(t.uniform1i(this.addr,e),i[0]=e)}function zo(t,e){const i=this.cache;So(i,e)||(t.uniform2iv(this.addr,e),Mo(i,e))}function Fo(t,e){const i=this.cache;So(i,e)||(t.uniform3iv(this.addr,e),Mo(i,e))}function Bo(t,e){const i=this.cache;So(i,e)||(t.uniform4iv(this.addr,e),Mo(i,e))}function jo(t,e){const i=this.cache;i[0]!==e&&(t.uniform1ui(this.addr,e),i[0]=e)}function Ho(t,e){t.uniform1fv(this.addr,e)}function Uo(t,e){t.uniform1iv(this.addr,e)}function Vo(t,e){t.uniform2iv(this.addr,e)}function Go(t,e){t.uniform3iv(this.addr,e)}function qo(t,e){t.uniform4iv(this.addr,e)}function Wo(t,e){const i=wo(e,this.size,2);t.uniform2fv(this.addr,i)}function Xo(t,e){const i=wo(e,this.size,3);t.uniform3fv(this.addr,i)}function Yo(t,e){const i=wo(e,this.size,4);t.uniform4fv(this.addr,i)}function Zo(t,e){const i=wo(e,this.size,4);t.uniformMatrix2fv(this.addr,!1,i)}function Jo(t,e){const i=wo(e,this.size,9);t.uniformMatrix3fv(this.addr,!1,i)}function Ko(t,e){const i=wo(e,this.size,16);t.uniformMatrix4fv(this.addr,!1,i)}function Qo(t,e,i){const n=e.length,r=To(i,n);t.uniform1iv(this.addr,r);for(let t=0;t!==n;++t)i.safeSetTexture2D(e[t]||po,r[t])}function ta(t,e,i){const n=e.length,r=To(i,n);t.uniform1iv(this.addr,r);for(let t=0;t!==n;++t)i.safeSetTextureCube(e[t]||go,r[t])}function ea(t,e,i){this.id=t,this.addr=i,this.cache=[],this.setValue=function(t){switch(t){case 5126:return Co;case 35664:return Eo;case 35665:return Io;case 35666:return Ao;case 35674:return Po;case 35675:return Ro;case 35676:return Lo;case 5124:case 35670:return ko;case 35667:case 35671:return zo;case 35668:case 35672:return Fo;case 35669:case 35673:return Bo;case 5125:return jo;case 35678:case 36198:case 36298:case 36306:case 35682:return Oo;case 35679:case 36299:case 36307:return Do;case 35680:case 36300:case 36308:case 36293:return $o;case 36289:case 36303:case 36311:case 36292:return No}}(e.type)}function ia(t,e,i){this.id=t,this.addr=i,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return Ho;case 35664:return Wo;case 35665:return Xo;case 35666:return Yo;case 35674:return Zo;case 35675:return Jo;case 35676:return Ko;case 5124:case 35670:return Uo;case 35667:case 35671:return Vo;case 35668:case 35672:return Go;case 35669:case 35673:return qo;case 35678:case 36198:case 36298:case 36306:case 35682:return Qo;case 35680:case 36300:case 36308:case 36293:return ta}}(e.type)}function na(t){this.id=t,this.seq=[],this.map={}}ia.prototype.updateCache=function(t){const e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Mo(e,t)},na.prototype.setValue=function(t,e,i){const n=this.seq;for(let r=0,s=n.length;r!==s;++r){const s=n[r];s.setValue(t,e[s.id],i)}};const ra=/(\w+)(\])?(\[|\.)?/g;function sa(t,e){t.seq.push(e),t.map[e.id]=e}function oa(t,e,i){const n=t.name,r=n.length;for(ra.lastIndex=0;;){const s=ra.exec(n),o=ra.lastIndex;let a=s[1];const c="]"===s[2],h=s[3];if(c&&(a|=0),void 0===h||"["===h&&o+2===r){sa(i,void 0===h?new ea(a,t,e):new ia(a,t,e));break}{let t=i.map[a];void 0===t&&(t=new na(a),sa(i,t)),i=t}}}function aa(t,e){this.seq=[],this.map={};const i=t.getProgramParameter(e,35718);for(let n=0;n<i;++n){const i=t.getActiveUniform(e,n);oa(i,t.getUniformLocation(e,i.name),this)}}function ca(t,e,i){const n=t.createShader(e);return t.shaderSource(n,i),t.compileShader(n),n}aa.prototype.setValue=function(t,e,i,n){const r=this.map[e];void 0!==r&&r.setValue(t,i,n)},aa.prototype.setOptional=function(t,e,i){const n=e[i];void 0!==n&&this.setValue(t,i,n)},aa.upload=function(t,e,i,n){for(let r=0,s=e.length;r!==s;++r){const s=e[r],o=i[s.id];!1!==o.needsUpdate&&s.setValue(t,o.value,n)}},aa.seqWithValue=function(t,e){const i=[];for(let n=0,r=t.length;n!==r;++n){const r=t[n];r.id in e&&i.push(r)}return i};let ha=0;function la(t){switch(t){case Xi:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}function ua(t,e,i){const n=t.getShaderParameter(e,35713),r=t.getShaderInfoLog(e).trim();if(n&&""===r)return"";return"THREE.WebGLShader: gl.getShaderInfoLog() "+i+"\n"+r+function(t){const e=t.split("\n");for(let t=0;t<e.length;t++)e[t]=t+1+": "+e[t];return e.join("\n")}(t.getShaderSource(e))}function da(t,e){const i=la(e);return"vec4 "+t+"( vec4 value ) { return "+i[0]+"ToLinear"+i[1]+"; }"}function pa(t,e){const i=la(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function fa(t,e){let i;switch(e){case 1:i="Linear";break;case 2:i="Reinhard";break;case 3:i="OptimizedCineon";break;case 4:i="ACESFilmic";break;case 5:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),i="Linear"}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function ma(t){return""!==t}function ga(t,e){return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function _a(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const va=/^[ \t]*#include +<([\w\d./]+)>/gm;function ya(t){return t.replace(va,ba)}function ba(t,e){const i=Ws[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return ya(i)}const xa=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,wa=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Sa(t){return t.replace(wa,Ta).replace(xa,Ma)}function Ma(t,e,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Ta(t,e,i,n)}function Ta(t,e,i,n){let r="";for(let t=parseInt(e);t<parseInt(i);t++)r+=n.replace(/\[\s*i\s*\]/g,"[ "+t+" ]").replace(/UNROLLED_LOOP_INDEX/g,t);return r}function Ca(t){let e="precision "+t.precision+" float;\nprecision "+t.precision+" int;";return"highp"===t.precision?e+="\n#define HIGH_PRECISION":"mediump"===t.precision?e+="\n#define MEDIUM_PRECISION":"lowp"===t.precision&&(e+="\n#define LOW_PRECISION"),e}function Ea(t,e,i,n){const r=t.getContext(),s=i.defines;let o=i.vertexShader,a=i.fragmentShader;const c=function(t){let e="SHADOWMAP_TYPE_BASIC";return 1===t.shadowMapType?e="SHADOWMAP_TYPE_PCF":2===t.shadowMapType?e="SHADOWMAP_TYPE_PCF_SOFT":3===t.shadowMapType&&(e="SHADOWMAP_TYPE_VSM"),e}(i),h=function(t){let e="ENVMAP_TYPE_CUBE";if(t.envMap)switch(t.envMapMode){case 301:case 302:e="ENVMAP_TYPE_CUBE";break;case 306:case 307:e="ENVMAP_TYPE_CUBE_UV"}return e}(i),l=function(t){let e="ENVMAP_MODE_REFLECTION";if(t.envMap)switch(t.envMapMode){case 302:case 307:e="ENVMAP_MODE_REFRACTION"}return e}(i),u=function(t){let e="ENVMAP_BLENDING_NONE";if(t.envMap)switch(t.combine){case 0:e="ENVMAP_BLENDING_MULTIPLY";break;case 1:e="ENVMAP_BLENDING_MIX";break;case 2:e="ENVMAP_BLENDING_ADD"}return e}(i),d=t.gammaFactor>0?t.gammaFactor:1,p=i.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(ma).join("\n")}(i),f=function(t){const e=[];for(const i in t){const n=t[i];!1!==n&&e.push("#define "+i+" "+n)}return e.join("\n")}(s),m=r.createProgram();let g,_,v=i.glslVersion?"#version "+i.glslVersion+"\n":"";i.isRawShaderMaterial?(g=[f].filter(ma).join("\n"),g.length>0&&(g+="\n"),_=[p,f].filter(ma).join("\n"),_.length>0&&(_+="\n")):(g=[Ca(i),"#define SHADER_NAME "+i.shaderName,f,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+l:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+c:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(ma).join("\n"),_=[p,Ca(i),"#define SHADER_NAME "+i.shaderName,f,i.alphaTest?"#define ALPHATEST "+i.alphaTest+(i.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+d,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+h:"",i.envMap?"#define "+l:"",i.envMap?"#define "+u:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.sheen?"#define USE_SHEEN":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+c:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(i.extensionShaderTextureLOD||i.envMap)&&i.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?Ws.tonemapping_pars_fragment:"",0!==i.toneMapping?fa("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",Ws.encodings_pars_fragment,i.map?da("mapTexelToLinear",i.mapEncoding):"",i.matcap?da("matcapTexelToLinear",i.matcapEncoding):"",i.envMap?da("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMap?da("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.lightMap?da("lightMapTexelToLinear",i.lightMapEncoding):"",pa("linearToOutputTexel",i.outputEncoding),i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(ma).join("\n")),o=ya(o),o=ga(o,i),o=_a(o,i),a=ya(a),a=ga(a,i),a=_a(a,i),o=Sa(o),a=Sa(a),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(v="#version 300 es\n",g=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,_=["#define varying in",i.glslVersion===Ki?"":"out highp vec4 pc_fragColor;",i.glslVersion===Ki?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+_);const y=v+_+a,b=ca(r,35633,v+g+o),x=ca(r,35632,y);if(r.attachShader(m,b),r.attachShader(m,x),void 0!==i.index0AttributeName?r.bindAttribLocation(m,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(m,0,"position"),r.linkProgram(m),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(m).trim(),e=r.getShaderInfoLog(b).trim(),i=r.getShaderInfoLog(x).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(m,35714)){n=!1;const e=ua(r,b,"vertex"),i=ua(r,x,"fragment");console.error("THREE.WebGLProgram: shader error: ",r.getError(),"35715",r.getProgramParameter(m,35715),"gl.getProgramInfoLog",t,e,i)}else""!==t?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",t):""!==e&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:t,vertexShader:{log:e,prefix:g},fragmentShader:{log:i,prefix:_}})}let w,S;return r.deleteShader(b),r.deleteShader(x),this.getUniforms=function(){return void 0===w&&(w=new aa(r,m)),w},this.getAttributes=function(){return void 0===S&&(S=function(t,e){const i={},n=t.getProgramParameter(e,35721);for(let r=0;r<n;r++){const n=t.getActiveAttrib(e,r).name;i[n]=t.getAttribLocation(e,n)}return i}(r,m)),S},this.destroy=function(){n.releaseStatesOfProgram(this),r.deleteProgram(m),this.program=void 0},this.name=i.shaderName,this.id=ha++,this.cacheKey=e,this.usedTimes=1,this.program=m,this.vertexShader=b,this.fragmentShader=x,this}function Ia(t,e,i,n,r,s){const o=[],a=n.isWebGL2,c=n.logarithmicDepthBuffer,h=n.floatVertexTextures,l=n.maxVertexUniforms,u=n.vertexTextures;let d=n.precision;const p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},f=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","instancingColor","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","sheen","transmissionMap"];function m(t){let e;return t&&t.isTexture?e=t.encoding:t&&t.isWebGLRenderTarget?(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),e=t.texture.encoding):e=Xi,e}return{getParameters:function(r,o,f,g,_){const v=g.fog,y=r.isMeshStandardMaterial?g.environment:null,b=e.get(r.envMap||y),x=p[r.type],w=_.isSkinnedMesh?function(t){const e=t.skeleton.bones;if(h)return 1024;{const t=l,i=Math.floor((t-20)/4),n=Math.min(i,e.length);return n<e.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+e.length+" bones. This GPU supports "+n+"."),0):n}}(_):0;let S,M;if(null!==r.precision&&(d=n.getMaxPrecision(r.precision),d!==r.precision&&console.warn("THREE.WebGLProgram.getParameters:",r.precision,"not supported, using",d,"instead.")),x){const t=Ys[x];S=t.vertexShader,M=t.fragmentShader}else S=r.vertexShader,M=r.fragmentShader;const T=t.getRenderTarget();return{isWebGL2:a,shaderID:x,shaderName:r.type,vertexShader:S,fragmentShader:M,defines:r.defines,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:d,instancing:!0===_.isInstancedMesh,instancingColor:!0===_.isInstancedMesh&&null!==_.instanceColor,supportsVertexTextures:u,outputEncoding:null!==T?m(T.texture):t.outputEncoding,map:!!r.map,mapEncoding:m(r.map),matcap:!!r.matcap,matcapEncoding:m(r.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:m(b),envMapCubeUV:!!b&&(306===b.mapping||307===b.mapping),lightMap:!!r.lightMap,lightMapEncoding:m(r.lightMap),aoMap:!!r.aoMap,emissiveMap:!!r.emissiveMap,emissiveMapEncoding:m(r.emissiveMap),bumpMap:!!r.bumpMap,normalMap:!!r.normalMap,objectSpaceNormalMap:1===r.normalMapType,tangentSpaceNormalMap:0===r.normalMapType,clearcoatMap:!!r.clearcoatMap,clearcoatRoughnessMap:!!r.clearcoatRoughnessMap,clearcoatNormalMap:!!r.clearcoatNormalMap,displacementMap:!!r.displacementMap,roughnessMap:!!r.roughnessMap,metalnessMap:!!r.metalnessMap,specularMap:!!r.specularMap,alphaMap:!!r.alphaMap,gradientMap:!!r.gradientMap,sheen:!!r.sheen,transmissionMap:!!r.transmissionMap,combine:r.combine,vertexTangents:r.normalMap&&r.vertexTangents,vertexColors:r.vertexColors,vertexUvs:!!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatMap||r.clearcoatRoughnessMap||r.clearcoatNormalMap||r.displacementMap||r.transmissionMap),uvsVertexOnly:!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatNormalMap||r.transmissionMap||!r.displacementMap),fog:!!v,useFog:r.fog,fogExp2:v&&v.isFogExp2,flatShading:r.flatShading,sizeAttenuation:r.sizeAttenuation,logarithmicDepthBuffer:c,skinning:r.skinning&&w>0,maxBones:w,useVertexTexture:h,morphTargets:r.morphTargets,morphNormals:r.morphNormals,maxMorphTargets:t.maxMorphTargets,maxMorphNormals:t.maxMorphNormals,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:r.dithering,shadowMapEnabled:t.shadowMap.enabled&&f.length>0,shadowMapType:t.shadowMap.type,toneMapping:r.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:a||i.has("EXT_frag_depth"),rendererExtensionDrawBuffers:a||i.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:a||i.has("EXT_shader_texture_lod"),customProgramCacheKey:r.customProgramCacheKey()}},getProgramCacheKey:function(e){const i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.fragmentShader),i.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)i.push(t),i.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t<f.length;t++)i.push(e[f[t]]);i.push(t.outputEncoding),i.push(t.gammaFactor)}return i.push(e.customProgramCacheKey),i.join()},getUniforms:function(t){const e=p[t.type];let i;if(e){const t=Ys[e];i=Ls.clone(t.uniforms)}else i=t.uniforms;return i},acquireProgram:function(e,i){let n;for(let t=0,e=o.length;t<e;t++){const e=o[t];if(e.cacheKey===i){n=e,++n.usedTimes;break}}return void 0===n&&(n=new Ea(t,i,e,r),o.push(n)),n},releaseProgram:function(t){if(0==--t.usedTimes){const e=o.indexOf(t);o[e]=o[o.length-1],o.pop(),t.destroy()}},programs:o}}function Aa(){let t=new WeakMap;return{get:function(e){let i=t.get(e);return void 0===i&&(i={},t.set(e,i)),i},remove:function(e){t.delete(e)},update:function(e,i,n){t.get(e)[i]=n},dispose:function(){t=new WeakMap}}}function Pa(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program!==e.program?t.program.id-e.program.id:t.material.id!==e.material.id?t.material.id-e.material.id:t.z!==e.z?t.z-e.z:t.id-e.id}function Ra(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function La(t){const e=[];let i=0;const n=[],r=[],s={id:-1};function o(n,r,o,a,c,h){let l=e[i];const u=t.get(o);return void 0===l?(l={id:n.id,object:n,geometry:r,material:o,program:u.program||s,groupOrder:a,renderOrder:n.renderOrder,z:c,group:h},e[i]=l):(l.id=n.id,l.object=n,l.geometry=r,l.material=o,l.program=u.program||s,l.groupOrder=a,l.renderOrder=n.renderOrder,l.z=c,l.group=h),i++,l}return{opaque:n,transparent:r,init:function(){i=0,n.length=0,r.length=0},push:function(t,e,i,s,a,c){const h=o(t,e,i,s,a,c);(!0===i.transparent?r:n).push(h)},unshift:function(t,e,i,s,a,c){const h=o(t,e,i,s,a,c);(!0===i.transparent?r:n).unshift(h)},finish:function(){for(let t=i,n=e.length;t<n;t++){const i=e[t];if(null===i.id)break;i.id=null,i.object=null,i.geometry=null,i.material=null,i.program=null,i.group=null}},sort:function(t,e){n.length>1&&n.sort(t||Pa),r.length>1&&r.sort(e||Ra)}}}function Oa(t){let e=new WeakMap;return{get:function(i,n){const r=e.get(i);let s;return void 0===r?(s=new La(t),e.set(i,new WeakMap),e.get(i).set(n,s)):(s=r.get(n),void 0===s&&(s=new La(t),r.set(n,s))),s},dispose:function(){e=new WeakMap}}}function Na(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":i={direction:new fn,color:new Dr};break;case"SpotLight":i={position:new fn,direction:new fn,color:new Dr,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new fn,color:new Dr,distance:0,decay:0};break;case"HemisphereLight":i={direction:new fn,skyColor:new Dr,groundColor:new Dr};break;case"RectAreaLight":i={color:new Dr,position:new fn,halfWidth:new fn,halfHeight:new fn}}return t[e.id]=i,i}}}let Da=0;function $a(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function ka(t,e){const i=new Na,n=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new rn};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new rn,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new fn);const s=new fn,o=new Hn,a=new Hn;return{setup:function(s){let o=0,a=0,c=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let h=0,l=0,u=0,d=0,p=0,f=0,m=0,g=0;s.sort($a);for(let t=0,e=s.length;t<e;t++){const e=s[t],_=e.color,v=e.intensity,y=e.distance,b=e.shadow&&e.shadow.map?e.shadow.map.texture:null;if(e.isAmbientLight)o+=_.r*v,a+=_.g*v,c+=_.b*v;else if(e.isLightProbe)for(let t=0;t<9;t++)r.probe[t].addScaledVector(e.sh.coefficients[t],v);else if(e.isDirectionalLight){const t=i.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity),e.castShadow){const t=e.shadow,i=n.get(e);i.shadowBias=t.bias,i.shadowNormalBias=t.normalBias,i.shadowRadius=t.radius,i.shadowMapSize=t.mapSize,r.directionalShadow[h]=i,r.directionalShadowMap[h]=b,r.directionalShadowMatrix[h]=e.shadow.matrix,f++}r.directional[h]=t,h++}else if(e.isSpotLight){const t=i.get(e);if(t.position.setFromMatrixPosition(e.matrixWorld),t.color.copy(_).multiplyScalar(v),t.distance=y,t.coneCos=Math.cos(e.angle),t.penumbraCos=Math.cos(e.angle*(1-e.penumbra)),t.decay=e.decay,e.castShadow){const t=e.shadow,i=n.get(e);i.shadowBias=t.bias,i.shadowNormalBias=t.normalBias,i.shadowRadius=t.radius,i.shadowMapSize=t.mapSize,r.spotShadow[u]=i,r.spotShadowMap[u]=b,r.spotShadowMatrix[u]=e.shadow.matrix,g++}r.spot[u]=t,u++}else if(e.isRectAreaLight){const t=i.get(e);t.color.copy(_).multiplyScalar(v),t.halfWidth.set(.5*e.width,0,0),t.halfHeight.set(0,.5*e.height,0),r.rectArea[d]=t,d++}else if(e.isPointLight){const t=i.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity),t.distance=e.distance,t.decay=e.decay,e.castShadow){const t=e.shadow,i=n.get(e);i.shadowBias=t.bias,i.shadowNormalBias=t.normalBias,i.shadowRadius=t.radius,i.shadowMapSize=t.mapSize,i.shadowCameraNear=t.camera.near,i.shadowCameraFar=t.camera.far,r.pointShadow[l]=i,r.pointShadowMap[l]=b,r.pointShadowMatrix[l]=e.shadow.matrix,m++}r.point[l]=t,l++}else if(e.isHemisphereLight){const t=i.get(e);t.skyColor.copy(e.color).multiplyScalar(v),t.groundColor.copy(e.groundColor).multiplyScalar(v),r.hemi[p]=t,p++}}d>0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Xs.LTC_FLOAT_1,r.rectAreaLTC2=Xs.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Xs.LTC_HALF_1,r.rectAreaLTC2=Xs.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=a,r.ambient[2]=c;const _=r.hash;_.directionalLength===h&&_.pointLength===l&&_.spotLength===u&&_.rectAreaLength===d&&_.hemiLength===p&&_.numDirectionalShadows===f&&_.numPointShadows===m&&_.numSpotShadows===g||(r.directional.length=h,r.spot.length=u,r.rectArea.length=d,r.point.length=l,r.hemi.length=p,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=m,r.pointShadowMap.length=m,r.spotShadow.length=g,r.spotShadowMap.length=g,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=m,r.spotShadowMatrix.length=g,_.directionalLength=h,_.pointLength=l,_.spotLength=u,_.rectAreaLength=d,_.hemiLength=p,_.numDirectionalShadows=f,_.numPointShadows=m,_.numSpotShadows=g,r.version=Da++)},setupView:function(t,e){let i=0,n=0,c=0,h=0,l=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e<d;e++){const d=t[e];if(d.isDirectionalLight){const t=r.directional[i];t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),i++}else if(d.isSpotLight){const t=r.spot[c];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),c++}else if(d.isRectAreaLight){const t=r.rectArea[h];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),a.identity(),o.copy(d.matrixWorld),o.premultiply(u),a.extractRotation(o),t.halfWidth.set(.5*d.width,0,0),t.halfHeight.set(0,.5*d.height,0),t.halfWidth.applyMatrix4(a),t.halfHeight.applyMatrix4(a),h++}else if(d.isPointLight){const t=r.point[n];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),n++}else if(d.isHemisphereLight){const t=r.hemi[l];t.direction.setFromMatrixPosition(d.matrixWorld),t.direction.transformDirection(u),t.direction.normalize(),l++}}},state:r}}function za(t,e){const i=new ka(t,e),n=[],r=[];return{init:function(){n.length=0,r.length=0},state:{lightsArray:n,shadowsArray:r,lights:i},setupLights:function(){i.setup(n)},setupLightsView:function(t){i.setupView(n,t)},pushLight:function(t){n.push(t)},pushShadow:function(t){r.push(t)}}}function Fa(t,e){let i=new WeakMap;return{get:function(n,r=0){let s;return!1===i.has(n)?(s=new za(t,e),i.set(n,[]),i.get(n).push(s)):r>=i.get(n).length?(s=new za(t,e),i.get(n).push(s)):s=i.get(n)[r],s},dispose:function(){i=new WeakMap}}}function Ba(t){zr.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}function ja(t){zr.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new fn,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}Ba.prototype=Object.create(zr.prototype),Ba.prototype.constructor=Ba,Ba.prototype.isMeshDepthMaterial=!0,Ba.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this},ja.prototype=Object.create(zr.prototype),ja.prototype.constructor=ja,ja.prototype.isMeshDistanceMaterial=!0,ja.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this};function Ha(t,e,i){let n=new Us;const r=new rn,s=new rn,o=new un,a=[],c=[],h={},l={0:1,1:0,2:2},u=new Os({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new rn},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),d=u.clone();d.defines.HORIZONTAL_PASS=1;const p=new hs;p.setAttribute("position",new Hr(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const f=new Es(p,u),m=this;function g(i,n){const r=e.update(f);u.uniforms.shadow_pass.value=i.map.texture,u.uniforms.resolution.value=i.mapSize,u.uniforms.radius.value=i.radius,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,r,u,f,null),d.uniforms.shadow_pass.value=i.mapPass.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,r,d,f,null)}function _(t,e,i){const n=t<<0|e<<1|i<<2;let r=a[n];return void 0===r&&(r=new Ba({depthPacking:3201,morphTargets:t,skinning:e}),a[n]=r),r}function v(t,e,i){const n=t<<0|e<<1|i<<2;let r=c[n];return void 0===r&&(r=new ja({morphTargets:t,skinning:e}),c[n]=r),r}function y(e,i,n,r,s,o,a){let c=null,u=_,d=e.customDepthMaterial;if(!0===r.isPointLight&&(u=v,d=e.customDistanceMaterial),void 0===d){let t=!1;!0===n.morphTargets&&(t=i.morphAttributes&&i.morphAttributes.position&&i.morphAttributes.position.length>0);let r=!1;!0===e.isSkinnedMesh&&(!0===n.skinning?r=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e));c=u(t,r,!0===e.isInstancedMesh)}else c=d;if(t.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length){const t=c.uuid,e=n.uuid;let i=h[t];void 0===i&&(i={},h[t]=i);let r=i[e];void 0===r&&(r=c.clone(),i[e]=r),c=r}return c.visible=n.visible,c.wireframe=n.wireframe,c.side=3===a?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:l[n.side],c.clipShadows=n.clipShadows,c.clippingPlanes=n.clippingPlanes,c.clipIntersection=n.clipIntersection,c.wireframeLinewidth=n.wireframeLinewidth,c.linewidth=n.linewidth,!0===r.isPointLight&&!0===c.isMeshDistanceMaterial&&(c.referencePosition.setFromMatrixPosition(r.matrixWorld),c.nearDistance=s,c.farDistance=o),c}function b(i,r,s,o,a){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===a)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=e.update(i),r=i.material;if(Array.isArray(r)){const e=n.groups;for(let c=0,h=e.length;c<h;c++){const h=e[c],l=r[h.materialIndex];if(l&&l.visible){const e=y(i,n,l,o,s.near,s.far,a);t.renderBufferDirect(s,null,n,e,i,h)}}}else if(r.visible){const e=y(i,n,r,o,s.near,s.far,a);t.renderBufferDirect(s,null,n,e,i,null)}}const c=i.children;for(let t=0,e=c.length;t<e;t++)b(c[t],r,s,o,a)}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(e,a,c){if(!1===m.enabled)return;if(!1===m.autoUpdate&&!1===m.needsUpdate)return;if(0===e.length)return;const h=t.getRenderTarget(),l=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),d=t.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let h=0,l=e.length;h<l;h++){const l=e[h],u=l.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",l,"has no shadow.");continue}if(!1===u.autoUpdate&&!1===u.needsUpdate)continue;r.copy(u.mapSize);const p=u.getFrameExtents();if(r.multiply(p),s.copy(u.mapSize),(r.x>i||r.y>i)&&(r.x>i&&(s.x=Math.floor(i/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>i&&(s.y=Math.floor(i/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:Ai,magFilter:Ai,format:zi};u.map=new dn(r.x,r.y,t),u.map.texture.name=l.name+".shadowMap",u.mapPass=new dn(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:Ii,magFilter:Ii,format:zi};u.map=new dn(r.x,r.y,t),u.map.texture.name=l.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t<f;t++){const e=u.getViewport(t);o.set(s.x*e.x,s.y*e.y,s.x*e.z,s.y*e.w),d.viewport(o),u.updateMatrices(l,t),n=u.getFrustum(),b(a,c,u.camera,l,this.type)}u.isPointLightShadow||3!==this.type||g(u,c),u.needsUpdate=!1}m.needsUpdate=!1,t.setRenderTarget(h,l,u)}}function Ua(t,e,i){const n=i.isWebGL2;const r=new function(){let e=!1;const i=new un;let n=null;const r=new un(0,0,0,0);return{setMask:function(i){n===i||e||(t.colorMask(i,i,i,i),n=i)},setLocked:function(t){e=t},setClear:function(e,n,s,o,a){!0===a&&(e*=o,n*=o,s*=o),i.set(e,n,s,o),!1===r.equals(i)&&(t.clearColor(e,n,s,o),r.copy(i))},reset:function(){e=!1,n=null,r.set(-1,0,0,0)}}},s=new function(){let e=!1,i=null,n=null,r=null;return{setTest:function(t){t?O(2929):N(2929)},setMask:function(n){i===n||e||(t.depthMask(n),i=n)},setFunc:function(e){if(n!==e){if(e)switch(e){case 0:t.depthFunc(512);break;case 1:t.depthFunc(519);break;case 2:t.depthFunc(513);break;case 3:t.depthFunc(515);break;case 4:t.depthFunc(514);break;case 5:t.depthFunc(518);break;case 6:t.depthFunc(516);break;case 7:t.depthFunc(517);break;default:t.depthFunc(515)}else t.depthFunc(515);n=e}},setLocked:function(t){e=t},setClear:function(e){r!==e&&(t.clearDepth(e),r=e)},reset:function(){e=!1,i=null,n=null,r=null}}},o=new function(){let e=!1,i=null,n=null,r=null,s=null,o=null,a=null,c=null,h=null;return{setTest:function(t){e||(t?O(2960):N(2960))},setMask:function(n){i===n||e||(t.stencilMask(n),i=n)},setFunc:function(e,i,o){n===e&&r===i&&s===o||(t.stencilFunc(e,i,o),n=e,r=i,s=o)},setOp:function(e,i,n){o===e&&a===i&&c===n||(t.stencilOp(e,i,n),o=e,a=i,c=n)},setLocked:function(t){e=t},setClear:function(e){h!==e&&(t.clearStencil(e),h=e)},reset:function(){e=!1,i=null,n=null,r=null,s=null,o=null,a=null,c=null,h=null}}};let a={},c=null,h=null,l=null,u=null,d=null,p=null,f=null,m=null,g=null,_=!1,v=null,y=null,b=null,x=null,w=null;const S=t.getParameter(35661);let M=!1,T=0;const C=t.getParameter(7938);-1!==C.indexOf("WebGL")?(T=parseFloat(/^WebGL (\d)/.exec(C)[1]),M=T>=1):-1!==C.indexOf("OpenGL ES")&&(T=parseFloat(/^OpenGL ES (\d)/.exec(C)[1]),M=T>=2);let E=null,I={};const A=new un,P=new un;function R(e,i,n){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;e<n;e++)t.texImage2D(i+e,0,6408,1,1,0,6408,5121,r);return s}const L={};function O(e){!0!==a[e]&&(t.enable(e),a[e]=!0)}function N(e){!1!==a[e]&&(t.disable(e),a[e]=!1)}L[3553]=R(3553,3553,1),L[34067]=R(34067,34069,6),r.setClear(0,0,0,1),s.setClear(1),o.setClear(0),O(2929),s.setFunc(3),z(!1),F(1),O(2884),k(0);const D={[Mi]:32774,101:32778,102:32779};if(n)D[103]=32775,D[104]=32776;else{const t=e.get("EXT_blend_minmax");null!==t&&(D[103]=t.MIN_EXT,D[104]=t.MAX_EXT)}const $={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function k(e,i,n,r,s,o,a,c){if(0!==e){if(h||(O(3042),h=!0),5===e)s=s||i,o=o||n,a=a||r,i===u&&s===f||(t.blendEquationSeparate(D[i],D[s]),u=i,f=s),n===d&&r===p&&o===m&&a===g||(t.blendFuncSeparate($[n],$[r],$[o],$[a]),d=n,p=r,m=o,g=a),l=e,_=null;else if(e!==l||c!==_){if(u===Mi&&f===Mi||(t.blendEquation(32774),u=Mi,f=Mi),c)switch(e){case 1:t.blendFuncSeparate(1,771,1,771);break;case 2:t.blendFunc(1,1);break;case 3:t.blendFuncSeparate(0,0,769,771);break;case 4:t.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}else switch(e){case 1:t.blendFuncSeparate(770,771,1,771);break;case 2:t.blendFunc(770,1);break;case 3:t.blendFunc(0,769);break;case 4:t.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}d=null,p=null,m=null,g=null,l=e,_=c}}else h&&(N(3042),h=!1)}function z(e){v!==e&&(e?t.frontFace(2304):t.frontFace(2305),v=e)}function F(e){0!==e?(O(2884),e!==y&&(1===e?t.cullFace(1029):2===e?t.cullFace(1028):t.cullFace(1032))):N(2884),y=e}function B(e,i,n){e?(O(32823),x===i&&w===n||(t.polygonOffset(i,n),x=i,w=n)):N(32823)}function j(e){void 0===e&&(e=33984+S-1),E!==e&&(t.activeTexture(e),E=e)}return{buffers:{color:r,depth:s,stencil:o},enable:O,disable:N,useProgram:function(e){return c!==e&&(t.useProgram(e),c=e,!0)},setBlending:k,setMaterial:function(t,e){2===t.side?N(2884):O(2884);let i=1===t.side;e&&(i=!i),z(i),1===t.blending&&!1===t.transparent?k(0):k(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha),s.setFunc(t.depthFunc),s.setTest(t.depthTest),s.setMask(t.depthWrite),r.setMask(t.colorWrite);const n=t.stencilWrite;o.setTest(n),n&&(o.setMask(t.stencilWriteMask),o.setFunc(t.stencilFunc,t.stencilRef,t.stencilFuncMask),o.setOp(t.stencilFail,t.stencilZFail,t.stencilZPass)),B(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits)},setFlipSided:z,setCullFace:F,setLineWidth:function(e){e!==b&&(M&&t.lineWidth(e),b=e)},setPolygonOffset:B,setScissorTest:function(t){t?O(3089):N(3089)},activeTexture:j,bindTexture:function(e,i){null===E&&j();let n=I[E];void 0===n&&(n={type:void 0,texture:void 0},I[E]=n),n.type===e&&n.texture===i||(t.bindTexture(e,i||L[e]),n.type=e,n.texture=i)},unbindTexture:function(){const e=I[E];void 0!==e&&void 0!==e.type&&(t.bindTexture(e.type,null),e.type=void 0,e.texture=void 0)},compressedTexImage2D:function(){try{t.compressedTexImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage2D:function(){try{t.texImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage3D:function(){try{t.texImage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},scissor:function(e){!1===A.equals(e)&&(t.scissor(e.x,e.y,e.z,e.w),A.copy(e))},viewport:function(e){!1===P.equals(e)&&(t.viewport(e.x,e.y,e.z,e.w),P.copy(e))},reset:function(){a={},E=null,I={},c=null,h=null,l=null,u=null,d=null,p=null,f=null,m=null,g=null,_=!1,v=null,y=null,b=null,x=null,w=null,r.reset(),s.reset(),o.reset()}}}function Va(t,e,i,n,r,s,o){const a=r.isWebGL2,c=r.maxTextures,h=r.maxCubemapSize,l=r.maxTextureSize,u=r.maxSamples,d=new WeakMap;let p,f=!1;try{f="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(t){}function m(t,e){return f?new OffscreenCanvas(t,e):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function g(t,e,i,n){let r=1;if((t.width>n||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const n=e?nn.floorPowerOfTwo:Math.floor,s=n(r*t.width),o=n(r*t.height);void 0===p&&(p=m(s,o));const a=i?m(s,o):p;a.width=s,a.height=o;return a.getContext("2d").drawImage(t,0,0,s,o),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+o+")."),a}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function _(t){return nn.isPowerOfTwo(t.width)&&nn.isPowerOfTwo(t.height)}function v(t,e){return t.generateMipmaps&&e&&t.minFilter!==Ii&&t.minFilter!==Ai}function y(e,i,r,s){t.generateMipmap(e);n.get(i).__maxMipLevel=Math.log(Math.max(r,s))*Math.LOG2E}function b(i,n,r){if(!1===a)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let s=n;return 6403===n&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===n&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===n&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function x(t){return t===Ii||1004===t||1005===t?9728:9729}function w(e){const i=e.target;i.removeEventListener("dispose",w),function(e){const i=n.get(e);if(void 0===i.__webglInit)return;t.deleteTexture(i.__webglTexture),n.remove(e)}(i),i.isVideoTexture&&d.delete(i),o.memory.textures--}function S(e){const i=e.target;i.removeEventListener("dispose",S),function(e){const i=n.get(e),r=n.get(e.texture);if(!e)return;void 0!==r.__webglTexture&&t.deleteTexture(r.__webglTexture);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(i.__webglFramebuffer[e]),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer[e]);else t.deleteFramebuffer(i.__webglFramebuffer),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer),i.__webglMultisampledFramebuffer&&t.deleteFramebuffer(i.__webglMultisampledFramebuffer),i.__webglColorRenderbuffer&&t.deleteRenderbuffer(i.__webglColorRenderbuffer),i.__webglDepthRenderbuffer&&t.deleteRenderbuffer(i.__webglDepthRenderbuffer);n.remove(e.texture),n.remove(e)}(i),o.memory.textures--}let M=0;function T(t,e){const r=n.get(t);if(t.isVideoTexture&&function(t){const e=o.render.frame;d.get(t)!==e&&(d.set(t,e),t.update())}(t),t.version>0&&r.__version!==t.version){const i=t.image;if(void 0===i)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==i.complete)return void R(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+e),i.bindTexture(3553,r.__webglTexture)}function C(e,r){const o=n.get(e);e.version>0&&o.__version!==e.version?function(e,n,r){if(6!==n.image.length)return;P(e,n),i.activeTexture(33984+r),i.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment);const o=n&&(n.isCompressedTexture||n.image[0].isCompressedTexture),c=n.image[0]&&n.image[0].isDataTexture,l=[];for(let t=0;t<6;t++)l[t]=o||c?c?n.image[t].image:n.image[t]:g(n.image[t],!1,!0,h);const u=l[0],d=_(u)||a,p=s.convert(n.format),f=s.convert(n.type),m=b(n.internalFormat,p,f);let x;if(A(34067,n,d),o){for(let t=0;t<6;t++){x=l[t].mipmaps;for(let e=0;e<x.length;e++){const r=x[e];n.format!==zi&&n.format!==ki?null!==p?i.compressedTexImage2D(34069+t,e,m,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):i.texImage2D(34069+t,e,m,r.width,r.height,0,p,f,r.data)}}e.__maxMipLevel=x.length-1}else{x=n.mipmaps;for(let t=0;t<6;t++)if(c){i.texImage2D(34069+t,0,m,l[t].width,l[t].height,0,p,f,l[t].data);for(let e=0;e<x.length;e++){const n=x[e].image[t].image;i.texImage2D(34069+t,e+1,m,n.width,n.height,0,p,f,n.data)}}else{i.texImage2D(34069+t,0,m,p,f,l[t]);for(let e=0;e<x.length;e++){const n=x[e];i.texImage2D(34069+t,e+1,m,p,f,n.image[t])}}e.__maxMipLevel=x.length}v(n,d)&&y(34067,n,u.width,u.height);e.__version=n.version,n.onUpdate&&n.onUpdate(n)}(o,e,r):(i.activeTexture(33984+r),i.bindTexture(34067,o.__webglTexture))}const E={[Ti]:10497,[Ci]:33071,[Ei]:33648},I={[Ii]:9728,1004:9984,1005:9986,[Ai]:9729,1007:9985,[Pi]:9987};function A(i,s,o){o?(t.texParameteri(i,10242,E[s.wrapS]),t.texParameteri(i,10243,E[s.wrapT]),32879!==i&&35866!==i||t.texParameteri(i,32882,E[s.wrapR]),t.texParameteri(i,10240,I[s.magFilter]),t.texParameteri(i,10241,I[s.minFilter])):(t.texParameteri(i,10242,33071),t.texParameteri(i,10243,33071),32879!==i&&35866!==i||t.texParameteri(i,32882,33071),s.wrapS===Ci&&s.wrapT===Ci||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(i,10240,x(s.magFilter)),t.texParameteri(i,10241,x(s.minFilter)),s.minFilter!==Ii&&s.minFilter!==Ai&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));const c=e.get("EXT_texture_filter_anisotropic");if(c){if(s.type===Ni&&null===e.get("OES_texture_float_linear"))return;if(s.type===Di&&null===(a||e.get("OES_texture_half_float_linear")))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,c.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function P(e,i){void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",w),e.__webglTexture=t.createTexture(),o.memory.textures++)}function R(e,n,r){let o=3553;n.isDataTexture2DArray&&(o=35866),n.isDataTexture3D&&(o=32879),P(e,n),i.activeTexture(33984+r),i.bindTexture(o,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment);const c=function(t){return!a&&(t.wrapS!==Ci||t.wrapT!==Ci||t.minFilter!==Ii&&t.minFilter!==Ai)}(n)&&!1===_(n.image),h=g(n.image,c,!1,l),u=_(h)||a,d=s.convert(n.format);let p,f=s.convert(n.type),m=b(n.internalFormat,d,f);A(o,n,u);const x=n.mipmaps;if(n.isDepthTexture)m=6402,a?m=n.type===Ni?36012:n.type===Oi?33190:n.type===$i?35056:33189:n.type===Ni&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===Fi&&6402===m&&n.type!==Li&&n.type!==Oi&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=Li,f=s.convert(n.type)),n.format===Bi&&6402===m&&(m=34041,n.type!==$i&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=$i,f=s.convert(n.type))),i.texImage2D(3553,0,m,h.width,h.height,0,d,f,null);else if(n.isDataTexture)if(x.length>0&&u){for(let t=0,e=x.length;t<e;t++)p=x[t],i.texImage2D(3553,t,m,p.width,p.height,0,d,f,p.data);n.generateMipmaps=!1,e.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,m,h.width,h.height,0,d,f,h.data),e.__maxMipLevel=0;else if(n.isCompressedTexture){for(let t=0,e=x.length;t<e;t++)p=x[t],n.format!==zi&&n.format!==ki?null!==d?i.compressedTexImage2D(3553,t,m,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):i.texImage2D(3553,t,m,p.width,p.height,0,d,f,p.data);e.__maxMipLevel=x.length-1}else if(n.isDataTexture2DArray)i.texImage3D(35866,0,m,h.width,h.height,h.depth,0,d,f,h.data),e.__maxMipLevel=0;else if(n.isDataTexture3D)i.texImage3D(32879,0,m,h.width,h.height,h.depth,0,d,f,h.data),e.__maxMipLevel=0;else if(x.length>0&&u){for(let t=0,e=x.length;t<e;t++)p=x[t],i.texImage2D(3553,t,m,d,f,p);n.generateMipmaps=!1,e.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,m,d,f,h),e.__maxMipLevel=0;v(n,u)&&y(o,n,h.width,h.height),e.__version=n.version,n.onUpdate&&n.onUpdate(n)}function L(e,r,o,a){const c=s.convert(r.texture.format),h=s.convert(r.texture.type),l=b(r.texture.internalFormat,c,h);i.texImage2D(a,0,l,r.width,r.height,0,c,h,null),t.bindFramebuffer(36160,e),t.framebufferTexture2D(36160,o,a,n.get(r.texture).__webglTexture,0),t.bindFramebuffer(36160,null)}function O(e,i,n){if(t.bindRenderbuffer(36161,e),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n){const e=i.depthTexture;e&&e.isDepthTexture&&(e.type===Ni?r=36012:e.type===Oi&&(r=33190));const n=D(i);t.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(i.depthBuffer&&i.stencilBuffer){if(n){const e=D(i);t.renderbufferStorageMultisample(36161,e,35056,i.width,i.height)}else t.renderbufferStorage(36161,34041,i.width,i.height);t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=s.convert(i.texture.format),r=s.convert(i.texture.type),o=b(i.texture.internalFormat,e,r);if(n){const e=D(i);t.renderbufferStorageMultisample(36161,e,o,i.width,i.height)}else t.renderbufferStorage(36161,o,i.width,i.height)}t.bindRenderbuffer(36161,null)}function N(e){const i=n.get(e),r=!0===e.isWebGLCubeRenderTarget;if(e.depthTexture){if(r)throw new Error("target.depthTexture not supported in Cube render targets");!function(e,i){if(i&&i.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(t.bindFramebuffer(36160,e),!i.depthTexture||!i.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");n.get(i.depthTexture).__webglTexture&&i.depthTexture.image.width===i.width&&i.depthTexture.image.height===i.height||(i.depthTexture.image.width=i.width,i.depthTexture.image.height=i.height,i.depthTexture.needsUpdate=!0),T(i.depthTexture,0);const r=n.get(i.depthTexture).__webglTexture;if(i.depthTexture.format===Fi)t.framebufferTexture2D(36160,36096,3553,r,0);else{if(i.depthTexture.format!==Bi)throw new Error("Unknown depthTexture format");t.framebufferTexture2D(36160,33306,3553,r,0)}}(i.__webglFramebuffer,e)}else if(r){i.__webglDepthbuffer=[];for(let n=0;n<6;n++)t.bindFramebuffer(36160,i.__webglFramebuffer[n]),i.__webglDepthbuffer[n]=t.createRenderbuffer(),O(i.__webglDepthbuffer[n],e,!1)}else t.bindFramebuffer(36160,i.__webglFramebuffer),i.__webglDepthbuffer=t.createRenderbuffer(),O(i.__webglDepthbuffer,e,!1);t.bindFramebuffer(36160,null)}function D(t){return a&&t.isWebGLMultisampleRenderTarget?Math.min(u,t.samples):0}let $=!1,k=!1;this.allocateTextureUnit=function(){const t=M;return t>=c&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+c),M+=1,t},this.resetTextureUnits=function(){M=0},this.setTexture2D=T,this.setTexture2DArray=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?R(r,t,e):(i.activeTexture(33984+e),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=n.get(t);t.version>0&&r.__version!==t.version?R(r,t,e):(i.activeTexture(33984+e),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=C,this.setupRenderTarget=function(e){const r=n.get(e),c=n.get(e.texture);e.addEventListener("dispose",S),c.__webglTexture=t.createTexture(),o.memory.textures++;const h=!0===e.isWebGLCubeRenderTarget,l=!0===e.isWebGLMultisampleRenderTarget,u=_(e)||a;if(!a||e.texture.format!==ki||e.texture.type!==Ni&&e.texture.type!==Di||(e.texture.format=zi,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),h){r.__webglFramebuffer=[];for(let e=0;e<6;e++)r.__webglFramebuffer[e]=t.createFramebuffer()}else if(r.__webglFramebuffer=t.createFramebuffer(),l)if(a){r.__webglMultisampledFramebuffer=t.createFramebuffer(),r.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,r.__webglColorRenderbuffer);const i=s.convert(e.texture.format),n=s.convert(e.texture.type),o=b(e.texture.internalFormat,i,n),a=D(e);t.renderbufferStorageMultisample(36161,a,o,e.width,e.height),t.bindFramebuffer(36160,r.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,r.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(r.__webglDepthRenderbuffer=t.createRenderbuffer(),O(r.__webglDepthRenderbuffer,e,!0)),t.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(h){i.bindTexture(34067,c.__webglTexture),A(34067,e.texture,u);for(let t=0;t<6;t++)L(r.__webglFramebuffer[t],e,36064,34069+t);v(e.texture,u)&&y(34067,e.texture,e.width,e.height),i.bindTexture(34067,null)}else i.bindTexture(3553,c.__webglTexture),A(3553,e.texture,u),L(r.__webglFramebuffer,e,36064,3553),v(e.texture,u)&&y(3553,e.texture,e.width,e.height),i.bindTexture(3553,null);e.depthBuffer&&N(e)},this.updateRenderTargetMipmap=function(t){const e=t.texture;if(v(e,_(t)||a)){const r=t.isWebGLCubeRenderTarget?34067:3553,s=n.get(e).__webglTexture;i.bindTexture(r,s),y(r,e,t.width,t.height),i.bindTexture(r,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(a){const i=n.get(e);t.bindFramebuffer(36008,i.__webglMultisampledFramebuffer),t.bindFramebuffer(36009,i.__webglFramebuffer);const r=e.width,s=e.height;let o=16384;e.depthBuffer&&(o|=256),e.stencilBuffer&&(o|=1024),t.blitFramebuffer(0,0,r,s,0,0,r,s,o,9728),t.bindFramebuffer(36160,i.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===$&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),$=!0),t=t.texture),T(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===k&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),k=!0),t=t.texture),C(t,e)}}function Ga(t,e,i){const n=i.isWebGL2;return{convert:function(t){let i;if(t===Ri)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(t===Li)return 5123;if(1013===t)return 5124;if(t===Oi)return 5125;if(t===Ni)return 5126;if(t===Di)return n?5131:(i=e.get("OES_texture_half_float"),null!==i?i.HALF_FLOAT_OES:null);if(1021===t)return 6406;if(t===ki)return 6407;if(t===zi)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===Fi)return 6402;if(t===Bi)return 34041;if(1028===t)return 6403;if(1029===t)return 36244;if(1030===t)return 33319;if(1031===t)return 33320;if(1032===t)return 36248;if(1033===t)return 36249;if(33776===t||33777===t||33778===t||33779===t){if(i=e.get("WEBGL_compressed_texture_s3tc"),null===i)return null;if(33776===t)return i.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===t)return i.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===t)return i.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===t)return i.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===t||35841===t||35842===t||35843===t){if(i=e.get("WEBGL_compressed_texture_pvrtc"),null===i)return null;if(35840===t)return i.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===t)return i.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===t)return i.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===t)return i.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t)return i=e.get("WEBGL_compressed_texture_etc1"),null!==i?i.COMPRESSED_RGB_ETC1_WEBGL:null;if((37492===t||37496===t)&&(i=e.get("WEBGL_compressed_texture_etc"),null!==i)){if(37492===t)return i.COMPRESSED_RGB8_ETC2;if(37496===t)return i.COMPRESSED_RGBA8_ETC2_EAC}return 37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t||37840===t||37841===t||37842===t||37843===t||37844===t||37845===t||37846===t||37847===t||37848===t||37849===t||37850===t||37851===t||37852===t||37853===t?(i=e.get("WEBGL_compressed_texture_astc"),null!==i?t:null):36492===t?(i=e.get("EXT_texture_compression_bptc"),null!==i?t:null):t===$i?n?34042:(i=e.get("WEBGL_depth_texture"),null!==i?i.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}function qa(t=[]){Ds.call(this),this.cameras=t}function Wa(){pr.call(this),this.type="Group"}function Xa(){this._targetRay=null,this._grip=null,this._hand=null}function Ya(t,e){const i=this;let n=null,r=1,s=null,o="local-floor",a=null;const c=[],h=new Map,l=new Ds;l.layers.enable(1),l.viewport=new un;const u=new Ds;u.layers.enable(2),u.viewport=new un;const d=[l,u],p=new qa;p.layers.enable(1),p.layers.enable(2);let f=null,m=null;function g(t){const e=h.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function _(){h.forEach((function(t,e){t.disconnect(e)})),h.clear(),f=null,m=null,t.setFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function v(t){const e=n.inputSources;for(let t=0;t<c.length;t++)h.set(e[t],c[t]);for(let e=0;e<t.removed.length;e++){const i=t.removed[e],n=h.get(i);n&&(n.dispatchEvent({type:"disconnected",data:i}),h.delete(i))}for(let e=0;e<t.added.length;e++){const i=t.added[e],n=h.get(i);n&&n.dispatchEvent({type:"connected",data:i})}}this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=c[t];return void 0===e&&(e=new Xa,c[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=c[t];return void 0===e&&(e=new Xa,c[t]=e),e.getGripSpace()},this.getHand=function(t){let e=c[t];return void 0===e&&(e=new Xa,c[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){o=t,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return s},this.getSession=function(){return n},this.setSession=async function(t){if(n=t,null!==n){n.addEventListener("select",g),n.addEventListener("selectstart",g),n.addEventListener("selectend",g),n.addEventListener("squeeze",g),n.addEventListener("squeezestart",g),n.addEventListener("squeezeend",g),n.addEventListener("end",_),n.addEventListener("inputsourceschange",v);const t=e.getContextAttributes();!0!==t.xrCompatible&&await e.makeXRCompatible();const a={antialias:t.antialias,alpha:t.alpha,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:r},c=new XRWebGLLayer(n,e,a);n.updateRenderState({baseLayer:c}),s=await n.requestReferenceSpace(o),S.setContext(n),S.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const y=new fn,b=new fn;function x(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.getCamera=function(t){p.near=u.near=l.near=t.near,p.far=u.far=l.far=t.far,f===p.near&&m===p.far||(n.updateRenderState({depthNear:p.near,depthFar:p.far}),f=p.near,m=p.far);const e=t.parent,i=p.cameras;x(p,e);for(let t=0;t<i.length;t++)x(i[t],e);t.matrixWorld.copy(p.matrixWorld),t.matrix.copy(p.matrix),t.matrix.decompose(t.position,t.quaternion,t.scale);const r=t.children;for(let t=0,e=r.length;t<e;t++)r[t].updateMatrixWorld(!0);return 2===i.length?function(t,e,i){y.setFromMatrixPosition(e.matrixWorld),b.setFromMatrixPosition(i.matrixWorld);const n=y.distanceTo(b),r=e.projectionMatrix.elements,s=i.projectionMatrix.elements,o=r[14]/(r[10]-1),a=r[14]/(r[10]+1),c=(r[9]+1)/r[5],h=(r[9]-1)/r[5],l=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=o*l,p=o*u,f=n/(-l+u),m=f*-l;e.matrixWorld.decompose(t.position,t.quaternion,t.scale),t.translateX(m),t.translateZ(f),t.matrixWorld.compose(t.position,t.quaternion,t.scale),t.matrixWorldInverse.copy(t.matrixWorld).invert();const g=o+f,_=a+f,v=d-m,x=p+(n-m),w=c*a/_*g,S=h*a/_*g;t.projectionMatrix.makePerspective(v,x,w,S,g,_)}(p,l,u):p.projectionMatrix.copy(l.projectionMatrix),p};let w=null;const S=new Vs;S.setAnimationLoop((function(e,i){if(a=i.getViewerPose(s),null!==a){const e=a.views,i=n.renderState.baseLayer;t.setFramebuffer(i.framebuffer);let r=!1;e.length!==p.cameras.length&&(p.cameras.length=0,r=!0);for(let t=0;t<e.length;t++){const n=e[t],s=i.getViewport(n),o=d[t];o.matrix.fromArray(n.transform.matrix),o.projectionMatrix.fromArray(n.projectionMatrix),o.viewport.set(s.x,s.y,s.width,s.height),0===t&&p.matrix.copy(o.matrix),!0===r&&p.cameras.push(o)}}const r=n.inputSources;for(let t=0;t<c.length;t++){const e=c[t],n=r[t];e.update(n,i,s)}w&&w(e,i)})),this.setAnimationLoop=function(t){w=t},this.dispose=function(){}}function Za(t){function e(e,i){e.opacity.value=i.opacity,i.color&&e.diffuse.value.copy(i.color),i.emissive&&e.emissive.value.copy(i.emissive).multiplyScalar(i.emissiveIntensity),i.map&&(e.map.value=i.map),i.alphaMap&&(e.alphaMap.value=i.alphaMap),i.specularMap&&(e.specularMap.value=i.specularMap);const n=t.get(i).envMap;if(n){e.envMap.value=n,e.flipEnvMap.value=n.isCubeTexture&&n._needsFlipEnvMap?-1:1,e.reflectivity.value=i.reflectivity,e.refractionRatio.value=i.refractionRatio;const r=t.get(n).__maxMipLevel;void 0!==r&&(e.maxMipLevel.value=r)}let r,s;i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity),i.map?r=i.map:i.specularMap?r=i.specularMap:i.displacementMap?r=i.displacementMap:i.normalMap?r=i.normalMap:i.bumpMap?r=i.bumpMap:i.roughnessMap?r=i.roughnessMap:i.metalnessMap?r=i.metalnessMap:i.alphaMap?r=i.alphaMap:i.emissiveMap?r=i.emissiveMap:i.clearcoatMap?r=i.clearcoatMap:i.clearcoatNormalMap?r=i.clearcoatNormalMap:i.clearcoatRoughnessMap&&(r=i.clearcoatRoughnessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),i.aoMap?s=i.aoMap:i.lightMap&&(s=i.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),e.uv2Transform.value.copy(s.matrix))}function i(e,i){e.roughness.value=i.roughness,e.metalness.value=i.metalness,i.roughnessMap&&(e.roughnessMap.value=i.roughnessMap),i.metalnessMap&&(e.metalnessMap.value=i.metalnessMap),i.emissiveMap&&(e.emissiveMap.value=i.emissiveMap),i.bumpMap&&(e.bumpMap.value=i.bumpMap,e.bumpScale.value=i.bumpScale,1===i.side&&(e.bumpScale.value*=-1)),i.normalMap&&(e.normalMap.value=i.normalMap,e.normalScale.value.copy(i.normalScale),1===i.side&&e.normalScale.value.negate()),i.displacementMap&&(e.displacementMap.value=i.displacementMap,e.displacementScale.value=i.displacementScale,e.displacementBias.value=i.displacementBias);t.get(i).envMap&&(e.envMapIntensity.value=i.envMapIntensity)}return{refreshFogUniforms:function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)},refreshMaterialUniforms:function(t,n,r,s){n.isMeshBasicMaterial?e(t,n):n.isMeshLambertMaterial?(e(t,n),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(t,n)):n.isMeshToonMaterial?(e(t,n),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap);e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshPhongMaterial?(e(t,n),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshStandardMaterial?(e(t,n),n.isMeshPhysicalMaterial?function(t,e){i(t,e),t.reflectivity.value=e.reflectivity,t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&t.sheen.value.copy(e.sheen);e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap);e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap);e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate());t.transmission.value=e.transmission,e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap)}(t,n):i(t,n)):n.isMeshMatcapMaterial?(e(t,n),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDepthMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isMeshDistanceMaterial?(e(t,n),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,n)):n.isMeshNormalMaterial?(e(t,n),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,n)):n.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,n),n.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,n)):n.isPointsMaterial?function(t,e,i,n){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*i,t.scale.value=.5*n,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,n,r,s):n.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(t,n):n.isShadowMaterial?(t.color.value.copy(n.color),t.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function Ja(t){const e=void 0!==(t=t||{}).canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),i=void 0!==t.context?t.context:null,n=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,o=void 0!==t.antialias&&t.antialias,a=void 0===t.premultipliedAlpha||t.premultipliedAlpha,c=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,h=void 0!==t.powerPreference?t.powerPreference:"default",l=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=Xi,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1,this.maxMorphTargets=8,this.maxMorphNormals=4;const f=this;let m=!1,g=null,_=0,v=0,y=null,b=null,x=-1,w=null;const S=new un,M=new un;let T=null,C=e.width,E=e.height,I=1,A=null,P=null;const R=new un(0,0,C,E),L=new un(0,0,C,E);let O=!1;const N=new Us;let D=!1,$=!1;const k=new Hn,z=new fn,F={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function B(){return null===y?I:1}let j,H,U,V,G,q,W,X,Y,Z,J,K,Q,tt,et,it,nt,rt,st,ot,at,ct=i;function ht(t,i){for(let n=0;n<t.length;n++){const r=t[n],s=e.getContext(r,i);if(null!==s)return s}return null}try{const t={alpha:n,depth:r,stencil:s,antialias:o,premultipliedAlpha:a,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:l};if(e.addEventListener("webglcontextlost",pt,!1),e.addEventListener("webglcontextrestored",ft,!1),null===ct){const e=["webgl2","webgl","experimental-webgl"];if(!0===f.isWebGL1Renderer&&e.shift(),ct=ht(e,t),null===ct)throw ht(e)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===ct.getShaderPrecisionFormat&&(ct.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){throw console.error("THREE.WebGLRenderer: "+t.message),t}function lt(){j=new io(ct),H=new Qs(ct,j,t),j.init(H),ot=new Ga(ct,j,H),U=new Ua(ct,j,H),U.scissor(M.copy(L).multiplyScalar(I).floor()),U.viewport(S.copy(R).multiplyScalar(I).floor()),V=new so(ct),G=new Aa,q=new Va(ct,j,U,G,H,ot,V),W=new eo(f),X=new Gs(ct,H),at=new Js(ct,j,X,H),Y=new no(ct,X,V,at),Z=new ho(ct,Y,X,V),nt=new co(ct),et=new to(G),J=new Ia(f,W,j,H,at,et),K=new Za(G),Q=new Oa(G),tt=new Fa(j,H),it=new Zs(f,W,U,Z,a),rt=new Ks(ct,j,V,H),st=new ro(ct,j,V,H),V.programs=J.programs,f.capabilities=H,f.extensions=j,f.properties=G,f.renderLists=Q,f.state=U,f.info=V}lt();const ut=new Ya(f,ct);this.xr=ut;const dt=new Ha(f,Z,H.maxTextureSize);function pt(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),m=!0}function ft(){console.log("THREE.WebGLRenderer: Context Restored."),m=!1,lt()}function mt(t){const e=t.target;e.removeEventListener("dispose",mt),function(t){gt(t),G.remove(t)}(e)}function gt(t){const e=G.get(t).program;void 0!==e&&J.releaseProgram(e)}this.shadowMap=dt,this.getContext=function(){return ct},this.getContextAttributes=function(){return ct.getContextAttributes()},this.forceContextLoss=function(){const t=j.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){const t=j.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return I},this.setPixelRatio=function(t){void 0!==t&&(I=t,this.setSize(C,E,!1))},this.getSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),t=new rn),t.set(C,E)},this.setSize=function(t,i,n){ut.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(C=t,E=i,e.width=Math.floor(t*I),e.height=Math.floor(i*I),!1!==n&&(e.style.width=t+"px",e.style.height=i+"px"),this.setViewport(0,0,t,i))},this.getDrawingBufferSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),t=new rn),t.set(C*I,E*I).floor()},this.setDrawingBufferSize=function(t,i,n){C=t,E=i,I=n,e.width=Math.floor(t*n),e.height=Math.floor(i*n),this.setViewport(0,0,t,i)},this.getCurrentViewport=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),t=new un),t.copy(S)},this.getViewport=function(t){return t.copy(R)},this.setViewport=function(t,e,i,n){t.isVector4?R.set(t.x,t.y,t.z,t.w):R.set(t,e,i,n),U.viewport(S.copy(R).multiplyScalar(I).floor())},this.getScissor=function(t){return t.copy(L)},this.setScissor=function(t,e,i,n){t.isVector4?L.set(t.x,t.y,t.z,t.w):L.set(t,e,i,n),U.scissor(M.copy(L).multiplyScalar(I).floor())},this.getScissorTest=function(){return O},this.setScissorTest=function(t){U.setScissorTest(O=t)},this.setOpaqueSort=function(t){A=t},this.setTransparentSort=function(t){P=t},this.getClearColor=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getClearColor() now requires a Color as an argument"),t=new Dr),t.copy(it.getClearColor())},this.setClearColor=function(){it.setClearColor.apply(it,arguments)},this.getClearAlpha=function(){return it.getClearAlpha()},this.setClearAlpha=function(){it.setClearAlpha.apply(it,arguments)},this.clear=function(t,e,i){let n=0;(void 0===t||t)&&(n|=16384),(void 0===e||e)&&(n|=256),(void 0===i||i)&&(n|=1024),ct.clear(n)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",pt,!1),e.removeEventListener("webglcontextrestored",ft,!1),Q.dispose(),tt.dispose(),G.dispose(),W.dispose(),Z.dispose(),at.dispose(),ut.dispose(),vt.stop()},this.renderBufferImmediate=function(t,e){at.initAttributes();const i=G.get(t);t.hasPositions&&!i.position&&(i.position=ct.createBuffer()),t.hasNormals&&!i.normal&&(i.normal=ct.createBuffer()),t.hasUvs&&!i.uv&&(i.uv=ct.createBuffer()),t.hasColors&&!i.color&&(i.color=ct.createBuffer());const n=e.getAttributes();t.hasPositions&&(ct.bindBuffer(34962,i.position),ct.bufferData(34962,t.positionArray,35048),at.enableAttribute(n.position),ct.vertexAttribPointer(n.position,3,5126,!1,0,0)),t.hasNormals&&(ct.bindBuffer(34962,i.normal),ct.bufferData(34962,t.normalArray,35048),at.enableAttribute(n.normal),ct.vertexAttribPointer(n.normal,3,5126,!1,0,0)),t.hasUvs&&(ct.bindBuffer(34962,i.uv),ct.bufferData(34962,t.uvArray,35048),at.enableAttribute(n.uv),ct.vertexAttribPointer(n.uv,2,5126,!1,0,0)),t.hasColors&&(ct.bindBuffer(34962,i.color),ct.bufferData(34962,t.colorArray,35048),at.enableAttribute(n.color),ct.vertexAttribPointer(n.color,3,5126,!1,0,0)),at.disableUnusedAttributes(),ct.drawArrays(4,0,t.count),t.count=0},this.renderBufferDirect=function(t,e,i,n,r,s){null===e&&(e=F);const o=r.isMesh&&r.matrixWorld.determinant()<0,a=St(t,e,n,r);U.setMaterial(n,o);let c=i.index;const h=i.attributes.position;if(null===c){if(void 0===h||0===h.count)return}else if(0===c.count)return;let l,u=1;!0===n.wireframe&&(c=Y.getWireframeAttribute(i),u=2),(n.morphTargets||n.morphNormals)&&nt.update(r,i,n,a),at.setup(r,n,a,i,c);let d=rt;null!==c&&(l=X.get(c),d=st,d.setIndex(l));const p=null!==c?c.count:h.count,f=i.drawRange.start*u,m=i.drawRange.count*u,g=null!==s?s.start*u:0,_=null!==s?s.count*u:1/0,v=Math.max(f,g),y=Math.min(p,f+m,g+_)-1,b=Math.max(0,y-v+1);if(0!==b){if(r.isMesh)!0===n.wireframe?(U.setLineWidth(n.wireframeLinewidth*B()),d.setMode(1)):d.setMode(4);else if(r.isLine){let t=n.linewidth;void 0===t&&(t=1),U.setLineWidth(t*B()),r.isLineSegments?d.setMode(1):r.isLineLoop?d.setMode(2):d.setMode(3)}else r.isPoints?d.setMode(0):r.isSprite&&d.setMode(4);if(r.isInstancedMesh)d.renderInstances(v,b,r.count);else if(i.isInstancedBufferGeometry){const t=Math.min(i.instanceCount,i._maxInstanceCount);d.renderInstances(v,b,t)}else d.render(v,b)}},this.compile=function(t,e){d=tt.get(t),d.init(),t.traverseVisible((function(t){t.isLight&&t.layers.test(e.layers)&&(d.pushLight(t),t.castShadow&&d.pushShadow(t))})),d.setupLights();const i=new WeakMap;t.traverse((function(e){const n=e.material;if(n)if(Array.isArray(n))for(let r=0;r<n.length;r++){const s=n[r];!1===i.has(s)&&(wt(s,t,e),i.set(s))}else!1===i.has(n)&&(wt(n,t,e),i.set(n))}))};let _t=null;const vt=new Vs;function yt(t,e,i,n){if(!1===t.visible)return;if(t.layers.test(e.layers))if(t.isGroup)i=t.renderOrder;else if(t.isLOD)!0===t.autoUpdate&&t.update(e);else if(t.isLight)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||N.intersectsSprite(t)){n&&z.setFromMatrixPosition(t.matrixWorld).applyMatrix4(k);const e=Z.update(t),r=t.material;r.visible&&u.push(t,e,r,i,z.z,null)}}else if(t.isImmediateRenderObject)n&&z.setFromMatrixPosition(t.matrixWorld).applyMatrix4(k),u.push(t,null,t.material,i,z.z,null);else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==V.render.frame&&(t.skeleton.update(),t.skeleton.frame=V.render.frame),!t.frustumCulled||N.intersectsObject(t))){n&&z.setFromMatrixPosition(t.matrixWorld).applyMatrix4(k);const e=Z.update(t),r=t.material;if(Array.isArray(r)){const n=e.groups;for(let s=0,o=n.length;s<o;s++){const o=n[s],a=r[o.materialIndex];a&&a.visible&&u.push(t,e,a,i,z.z,o)}}else r.visible&&u.push(t,e,r,i,z.z,null)}const r=t.children;for(let t=0,s=r.length;t<s;t++)yt(r[t],e,i,n)}function bt(t,e,i){const n=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r<s;r++){const s=t[r],o=s.object,a=s.geometry,c=null===n?s.material:n,h=s.group;if(i.isArrayCamera){const t=i.cameras;for(let i=0,n=t.length;i<n;i++){const n=t[i];o.layers.test(n.layers)&&(U.viewport(S.copy(n.viewport)),d.setupLightsView(n),xt(o,e,n,a,c,h))}}else xt(o,e,i,a,c,h)}}function xt(t,e,i,n,r,s){if(t.onBeforeRender(f,e,i,n,r,s),t.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),t.isImmediateRenderObject){const n=St(i,e,r,t);U.setMaterial(r),at.reset(),function(t,e){t.render((function(t){f.renderBufferImmediate(t,e)}))}(t,n)}else f.renderBufferDirect(i,e,n,r,t,s);t.onAfterRender(f,e,i,n,r,s)}function wt(t,e,i){!0!==e.isScene&&(e=F);const n=G.get(t),r=d.state.lights,s=d.state.shadowsArray,o=r.state.version,a=J.getParameters(t,r.state,s,e,i),c=J.getProgramCacheKey(a);let h=n.program,l=!0;if(n.environment=t.isMeshStandardMaterial?e.environment:null,n.fog=e.fog,n.envMap=W.get(t.envMap||n.environment),void 0===h)t.addEventListener("dispose",mt);else if(h.cacheKey!==c)gt(t);else if(n.lightsStateVersion!==o)l=!1;else{if(void 0!==a.shaderID)return;l=!1}l&&(a.uniforms=J.getUniforms(t),t.onBeforeCompile(a,f),h=J.acquireProgram(a,c),n.program=h,n.uniforms=a.uniforms,n.outputEncoding=a.outputEncoding);const u=n.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(n.numClippingPlanes=et.numPlanes,n.numIntersection=et.numIntersection,u.clippingPlanes=et.uniform),n.needsLights=function(t){return t.isMeshLambertMaterial||t.isMeshToonMaterial||t.isMeshPhongMaterial||t.isMeshStandardMaterial||t.isShadowMaterial||t.isShaderMaterial&&!0===t.lights}(t),n.lightsStateVersion=o,n.needsLights&&(u.ambientLightColor.value=r.state.ambient,u.lightProbe.value=r.state.probe,u.directionalLights.value=r.state.directional,u.directionalLightShadows.value=r.state.directionalShadow,u.spotLights.value=r.state.spot,u.spotLightShadows.value=r.state.spotShadow,u.rectAreaLights.value=r.state.rectArea,u.ltc_1.value=r.state.rectAreaLTC1,u.ltc_2.value=r.state.rectAreaLTC2,u.pointLights.value=r.state.point,u.pointLightShadows.value=r.state.pointShadow,u.hemisphereLights.value=r.state.hemi,u.directionalShadowMap.value=r.state.directionalShadowMap,u.directionalShadowMatrix.value=r.state.directionalShadowMatrix,u.spotShadowMap.value=r.state.spotShadowMap,u.spotShadowMatrix.value=r.state.spotShadowMatrix,u.pointShadowMap.value=r.state.pointShadowMap,u.pointShadowMatrix.value=r.state.pointShadowMatrix);const p=n.program.getUniforms(),m=aa.seqWithValue(p.seq,u);n.uniformsList=m}function St(t,e,i,n){!0!==e.isScene&&(e=F),q.resetTextureUnits();const r=e.fog,s=i.isMeshStandardMaterial?e.environment:null,o=null===y?f.outputEncoding:y.texture.encoding,a=W.get(i.envMap||s),c=G.get(i),h=d.state.lights;if(!0===D&&(!0===$||t!==w)){const e=t===w&&i.id===x;et.setState(i,t,e)}i.version===c.__version?i.fog&&c.fog!==r||c.environment!==s||c.needsLights&&c.lightsStateVersion!==h.state.version?wt(i,e,n):void 0===c.numClippingPlanes||c.numClippingPlanes===et.numPlanes&&c.numIntersection===et.numIntersection?(c.outputEncoding!==o||c.envMap!==a)&&wt(i,e,n):wt(i,e,n):(wt(i,e,n),c.__version=i.version);let l=!1,u=!1,p=!1;const m=c.program,g=m.getUniforms(),_=c.uniforms;if(U.useProgram(m.program)&&(l=!0,u=!0,p=!0),i.id!==x&&(x=i.id,u=!0),l||w!==t){if(g.setValue(ct,"projectionMatrix",t.projectionMatrix),H.logarithmicDepthBuffer&&g.setValue(ct,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),w!==t&&(w=t,u=!0,p=!0),i.isShaderMaterial||i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshStandardMaterial||i.envMap){const e=g.map.cameraPosition;void 0!==e&&e.setValue(ct,z.setFromMatrixPosition(t.matrixWorld))}(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&g.setValue(ct,"isOrthographic",!0===t.isOrthographicCamera),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial||i.isShadowMaterial||i.skinning)&&g.setValue(ct,"viewMatrix",t.matrixWorldInverse)}if(i.skinning){g.setOptional(ct,n,"bindMatrix"),g.setOptional(ct,n,"bindMatrixInverse");const t=n.skeleton;if(t){const e=t.bones;if(H.floatVertexTextures){if(null===t.boneTexture){let i=Math.sqrt(4*e.length);i=nn.ceilPowerOfTwo(i),i=Math.max(i,4);const n=new Float32Array(i*i*4);n.set(t.boneMatrices);const r=new Bs(n,i,i,zi,Ni);t.boneMatrices=n,t.boneTexture=r,t.boneTextureSize=i}g.setValue(ct,"boneTexture",t.boneTexture,q),g.setValue(ct,"boneTextureSize",t.boneTextureSize)}else g.setOptional(ct,t,"boneMatrices")}}var v,b;return(u||c.receiveShadow!==n.receiveShadow)&&(c.receiveShadow=n.receiveShadow,g.setValue(ct,"receiveShadow",n.receiveShadow)),u&&(g.setValue(ct,"toneMappingExposure",f.toneMappingExposure),c.needsLights&&(b=p,(v=_).ambientLightColor.needsUpdate=b,v.lightProbe.needsUpdate=b,v.directionalLights.needsUpdate=b,v.directionalLightShadows.needsUpdate=b,v.pointLights.needsUpdate=b,v.pointLightShadows.needsUpdate=b,v.spotLights.needsUpdate=b,v.spotLightShadows.needsUpdate=b,v.rectAreaLights.needsUpdate=b,v.hemisphereLights.needsUpdate=b),r&&i.fog&&K.refreshFogUniforms(_,r),K.refreshMaterialUniforms(_,i,I,E),aa.upload(ct,c.uniformsList,_,q)),i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(aa.upload(ct,c.uniformsList,_,q),i.uniformsNeedUpdate=!1),i.isSpriteMaterial&&g.setValue(ct,"center",n.center),g.setValue(ct,"modelViewMatrix",n.modelViewMatrix),g.setValue(ct,"normalMatrix",n.normalMatrix),g.setValue(ct,"modelMatrix",n.matrixWorld),m}vt.setAnimationLoop((function(t){ut.isPresenting||_t&&_t(t)})),"undefined"!=typeof window&&vt.setContext(window),this.setAnimationLoop=function(t){_t=t,ut.setAnimationLoop(t),null===t?vt.stop():vt.start()},this.render=function(t,e){let i,n;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),i=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),n=arguments[3]),void 0!==e&&!0!==e.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===m)return;at.resetDefaultState(),x=-1,w=null,!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),!0===ut.enabled&&!0===ut.isPresenting&&(e=ut.getCamera(e)),!0===t.isScene&&t.onBeforeRender(f,t,e,i||y),d=tt.get(t,p.length),d.init(),p.push(d),k.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),N.setFromProjectionMatrix(k),$=this.localClippingEnabled,D=et.init(this.clippingPlanes,$,e),u=Q.get(t,e),u.init(),yt(t,e,0,f.sortObjects),u.finish(),!0===f.sortObjects&&u.sort(A,P),!0===D&&et.beginShadows();const r=d.state.shadowsArray;dt.render(r,t,e),d.setupLights(),d.setupLightsView(e),!0===D&&et.endShadows(),!0===this.info.autoReset&&this.info.reset(),void 0!==i&&this.setRenderTarget(i),it.render(u,t,e,n);const s=u.opaque,o=u.transparent;s.length>0&&bt(s,t,e),o.length>0&&bt(o,t,e),!0===t.isScene&&t.onAfterRender(f,t,e),null!==y&&(q.updateRenderTargetMipmap(y),q.updateMultisampleRenderTarget(y)),U.buffers.depth.setTest(!0),U.buffers.depth.setMask(!0),U.buffers.color.setMask(!0),U.setPolygonOffset(!1),p.pop(),d=p.length>0?p[p.length-1]:null,u=null},this.setFramebuffer=function(t){g!==t&&null===y&&ct.bindFramebuffer(36160,t),g=t},this.getActiveCubeFace=function(){return _},this.getActiveMipmapLevel=function(){return v},this.getRenderList=function(){return u},this.setRenderList=function(t){u=t},this.getRenderTarget=function(){return y},this.setRenderTarget=function(t,e=0,i=0){y=t,_=e,v=i,t&&void 0===G.get(t).__webglFramebuffer&&q.setupRenderTarget(t);let n=g,r=!1;if(t){const i=G.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(n=i[e],r=!0):n=t.isWebGLMultisampleRenderTarget?G.get(t).__webglMultisampledFramebuffer:i,S.copy(t.viewport),M.copy(t.scissor),T=t.scissorTest}else S.copy(R).multiplyScalar(I).floor(),M.copy(L).multiplyScalar(I).floor(),T=O;if(b!==n&&(ct.bindFramebuffer(36160,n),b=n),U.viewport(S),U.scissor(M),U.setScissorTest(T),r){const n=G.get(t.texture);ct.framebufferTexture2D(36160,36064,34069+e,n.__webglTexture,i)}},this.readRenderTargetPixels=function(t,e,i,n,r,s,o){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let a=G.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==o&&(a=a[o]),a){let o=!1;a!==b&&(ct.bindFramebuffer(36160,a),o=!0);try{const a=t.texture,c=a.format,h=a.type;if(c!==zi&&ot.convert(c)!==ct.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const l=h===Di&&(j.has("EXT_color_buffer_half_float")||H.isWebGL2&&j.has("EXT_color_buffer_float"));if(!(h===Ri||ot.convert(h)===ct.getParameter(35738)||h===Ni&&(H.isWebGL2||j.has("OES_texture_float")||j.has("WEBGL_color_buffer_float"))||l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===ct.checkFramebufferStatus(36160)?e>=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&ct.readPixels(e,i,n,r,ot.convert(c),ot.convert(h),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{o&&ct.bindFramebuffer(36160,b)}}},this.copyFramebufferToTexture=function(t,e,i=0){const n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n),o=ot.convert(e.format);q.setTexture2D(e,0),ct.copyTexImage2D(3553,i,o,t.x,t.y,r,s,0),U.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n=0){const r=e.image.width,s=e.image.height,o=ot.convert(i.format),a=ot.convert(i.type);q.setTexture2D(i,0),ct.pixelStorei(37440,i.flipY),ct.pixelStorei(37441,i.premultiplyAlpha),ct.pixelStorei(3317,i.unpackAlignment),e.isDataTexture?ct.texSubImage2D(3553,n,t.x,t.y,r,s,o,a,e.image.data):e.isCompressedTexture?ct.compressedTexSubImage2D(3553,n,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,o,e.mipmaps[0].data):ct.texSubImage2D(3553,n,t.x,t.y,o,a,e.image),0===n&&i.generateMipmaps&&ct.generateMipmap(3553),U.unbindTexture()},this.initTexture=function(t){q.setTexture2D(t,0),U.unbindTexture()},this.resetState=function(){U.reset(),at.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Ka(t){Ja.call(this,t)}qa.prototype=Object.assign(Object.create(Ds.prototype),{constructor:qa,isArrayCamera:!0}),Wa.prototype=Object.assign(Object.create(pr.prototype),{constructor:Wa,isGroup:!0}),Object.assign(Xa.prototype,{constructor:Xa,getHandSpace:function(){return null===this._hand&&(this._hand=new Wa,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand},getTargetRaySpace:function(){return null===this._targetRay&&(this._targetRay=new Wa,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1),this._targetRay},getGripSpace:function(){return null===this._grip&&(this._grip=new Wa,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1),this._grip},dispatchEvent:function(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this},disconnect:function(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this},update:function(t,e,i){let n=null,r=null,s=null;const o=this._targetRay,a=this._grip,c=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState)if(c&&t.hand){s=!0;for(const n of t.hand.values()){const t=e.getJointPose(n,i);if(void 0===c.joints[n.jointName]){const t=new Wa;t.matrixAutoUpdate=!1,t.visible=!1,c.joints[n.jointName]=t,c.add(t)}const r=c.joints[n.jointName];null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.jointRadius=t.radius),r.visible=null!==t}const n=c.joints["index-finger-tip"],r=c.joints["thumb-tip"],o=n.position.distanceTo(r.position),a=.02,h=.005;c.inputState.pinching&&o>a+h?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&o<=a-h&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&(n=e.getPose(t.targetRaySpace,i),null!==n&&(o.matrix.fromArray(n.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale))),null!==a&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(a.matrix.fromArray(r.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale)));return null!==o&&(o.visible=null!==n),null!==a&&(a.visible=null!==r),null!==c&&(c.visible=null!==s),this}}),Object.assign(Ya.prototype,Qi.prototype),Ka.prototype=Object.assign(Object.create(Ja.prototype),{constructor:Ka,isWebGL1Renderer:!0});class Qa extends pr{constructor(){super(),Object.defineProperty(this,"isScene",{value:!0}),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}function tc(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=Zi,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=nn.generateUUID()}Object.defineProperty(tc.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(tc.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this},copyAt:function(t,e,i){t*=this.stride,i*=e.stride;for(let n=0,r=this.stride;n<r;n++)this.array[t+n]=e.array[i+n];return this},set:function(t,e=0){return this.array.set(t,e),this},clone:function(t){void 0===t.arrayBuffers&&(t.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=nn.generateUUID()),void 0===t.arrayBuffers[this.array.buffer._uuid]&&(t.arrayBuffers[this.array.buffer._uuid]=this.array.slice(0).buffer);const e=new tc(new this.array.constructor(t.arrayBuffers[this.array.buffer._uuid]),this.stride);return e.setUsage(this.usage),e},onUpload:function(t){return this.onUploadCallback=t,this},toJSON:function(t){return void 0===t.arrayBuffers&&(t.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=nn.generateUUID()),void 0===t.arrayBuffers[this.array.buffer._uuid]&&(t.arrayBuffers[this.array.buffer._uuid]=Array.prototype.slice.call(new Uint32Array(this.array.buffer))),{uuid:this.uuid,buffer:this.array.buffer._uuid,type:this.array.constructor.name,stride:this.stride}}});const ec=new fn;function ic(t,e,i,n){this.name="",this.data=t,this.itemSize=e,this.offset=i,this.normalized=!0===n}function nc(t){zr.call(this),this.type="SpriteMaterial",this.color=new Dr(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(t)}let rc;Object.defineProperties(ic.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}},needsUpdate:{set:function(t){this.data.needsUpdate=t}}}),Object.assign(ic.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(t){for(let e=0,i=this.data.count;e<i;e++)ec.x=this.getX(e),ec.y=this.getY(e),ec.z=this.getZ(e),ec.applyMatrix4(t),this.setXYZ(e,ec.x,ec.y,ec.z);return this},setX:function(t,e){return this.data.array[t*this.data.stride+this.offset]=e,this},setY:function(t,e){return this.data.array[t*this.data.stride+this.offset+1]=e,this},setZ:function(t,e){return this.data.array[t*this.data.stride+this.offset+2]=e,this},setW:function(t,e){return this.data.array[t*this.data.stride+this.offset+3]=e,this},getX:function(t){return this.data.array[t*this.data.stride+this.offset]},getY:function(t){return this.data.array[t*this.data.stride+this.offset+1]},getZ:function(t){return this.data.array[t*this.data.stride+this.offset+2]},getW:function(t){return this.data.array[t*this.data.stride+this.offset+3]},setXY:function(t,e,i){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this},setXYZ:function(t,e,i,n){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=n,this},setXYZW:function(t,e,i,n,r){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=n,this.data.array[t+3]=r,this},clone:function(t){if(void 0===t){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");const t=[];for(let e=0;e<this.count;e++){const i=e*this.data.stride+this.offset;for(let e=0;e<this.itemSize;e++)t.push(this.data.array[i+e])}return new Hr(new this.array.constructor(t),this.itemSize,this.normalized)}return void 0===t.interleavedBuffers&&(t.interleavedBuffers={}),void 0===t.interleavedBuffers[this.data.uuid]&&(t.interleavedBuffers[this.data.uuid]=this.data.clone(t)),new ic(t.interleavedBuffers[this.data.uuid],this.itemSize,this.offset,this.normalized)},toJSON:function(t){if(void 0===t){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");const t=[];for(let e=0;e<this.count;e++){const i=e*this.data.stride+this.offset;for(let e=0;e<this.itemSize;e++)t.push(this.data.array[i+e])}return{itemSize:this.itemSize,type:this.array.constructor.name,array:t,normalized:this.normalized}}return void 0===t.interleavedBuffers&&(t.interleavedBuffers={}),void 0===t.interleavedBuffers[this.data.uuid]&&(t.interleavedBuffers[this.data.uuid]=this.data.toJSON(t)),{isInterleavedBufferAttribute:!0,itemSize:this.itemSize,data:this.data.uuid,offset:this.offset,normalized:this.normalized}}}),nc.prototype=Object.create(zr.prototype),nc.prototype.constructor=nc,nc.prototype.isSpriteMaterial=!0,nc.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.rotation=t.rotation,this.sizeAttenuation=t.sizeAttenuation,this};const sc=new fn,oc=new fn,ac=new fn,cc=new rn,hc=new rn,lc=new Hn,uc=new fn,dc=new fn,pc=new fn,fc=new rn,mc=new rn,gc=new rn;function _c(t){if(pr.call(this),this.type="Sprite",void 0===rc){rc=new hs;const t=new tc(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);rc.setIndex([0,1,2,0,2,3]),rc.setAttribute("position",new ic(t,3,0,!1)),rc.setAttribute("uv",new ic(t,2,3,!1))}this.geometry=rc,this.material=void 0!==t?t:new nc,this.center=new rn(.5,.5)}function vc(t,e,i,n,r,s){cc.subVectors(t,i).addScalar(.5).multiply(n),void 0!==r?(hc.x=s*cc.x-r*cc.y,hc.y=r*cc.x+s*cc.y):hc.copy(cc),t.copy(e),t.x+=hc.x,t.y+=hc.y,t.applyMatrix4(lc)}_c.prototype=Object.assign(Object.create(pr.prototype),{constructor:_c,isSprite:!0,raycast:function(t,e){null===t.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),oc.setFromMatrixScale(this.matrixWorld),lc.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),ac.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&oc.multiplyScalar(-ac.z);const i=this.material.rotation;let n,r;0!==i&&(r=Math.cos(i),n=Math.sin(i));const s=this.center;vc(uc.set(-.5,-.5,0),ac,s,oc,n,r),vc(dc.set(.5,-.5,0),ac,s,oc,n,r),vc(pc.set(.5,.5,0),ac,s,oc,n,r),fc.set(0,0),mc.set(1,0),gc.set(1,1);let o=t.ray.intersectTriangle(uc,dc,pc,!1,sc);if(null===o&&(vc(dc.set(-.5,.5,0),ac,s,oc,n,r),mc.set(0,1),o=t.ray.intersectTriangle(uc,pc,dc,!1,sc),null===o))return;const a=t.ray.origin.distanceTo(sc);a<t.near||a>t.far||e.push({distance:a,point:sc.clone(),uv:Ir.getUV(sc,uc,dc,pc,fc,mc,gc,new rn),face:null,object:this})},copy:function(t){return pr.prototype.copy.call(this,t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}});const yc=new fn,bc=new fn;function xc(){pr.call(this),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}xc.prototype=Object.assign(Object.create(pr.prototype),{constructor:xc,isLOD:!0,copy:function(t){pr.prototype.copy.call(this,t,!1);const e=t.levels;for(let t=0,i=e.length;t<i;t++){const i=e[t];this.addLevel(i.object.clone(),i.distance)}return this.autoUpdate=t.autoUpdate,this},addLevel:function(t,e=0){e=Math.abs(e);const i=this.levels;let n;for(n=0;n<i.length&&!(e<i[n].distance);n++);return i.splice(n,0,{distance:e,object:t}),this.add(t),this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(t){const e=this.levels;if(e.length>0){let i,n;for(i=1,n=e.length;i<n&&!(t<e[i].distance);i++);return e[i-1].object}return null},raycast:function(t,e){if(this.levels.length>0){yc.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(yc);this.getObjectForDistance(i).raycast(t,e)}},update:function(t){const e=this.levels;if(e.length>1){yc.setFromMatrixPosition(t.matrixWorld),bc.setFromMatrixPosition(this.matrixWorld);const i=yc.distanceTo(bc)/t.zoom;let n,r;for(e[0].object.visible=!0,n=1,r=e.length;n<r&&i>=e[n].distance;n++)e[n-1].object.visible=!1,e[n].object.visible=!0;for(this._currentLevel=n-1;n<r;n++)e[n].object.visible=!1}},toJSON:function(t){const e=pr.prototype.toJSON.call(this,t);!1===this.autoUpdate&&(e.object.autoUpdate=!1),e.object.levels=[];const i=this.levels;for(let t=0,n=i.length;t<n;t++){const n=i[t];e.object.levels.push({object:n.object.uuid,distance:n.distance})}return e}});const wc=new fn,Sc=new un,Mc=new un,Tc=new fn,Cc=new Hn;function Ec(t,e){t&&t.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),Es.call(this,t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Hn,this.bindMatrixInverse=new Hn}function Ic(){pr.call(this),this.type="Bone"}Ec.prototype=Object.assign(Object.create(Es.prototype),{constructor:Ec,isSkinnedMesh:!0,copy:function(t){return Es.prototype.copy.call(this,t),this.bindMode=t.bindMode,this.bindMatrix.copy(t.bindMatrix),this.bindMatrixInverse.copy(t.bindMatrixInverse),this.skeleton=t.skeleton,this},bind:function(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.copy(e).invert()},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){const t=new un,e=this.geometry.attributes.skinWeight;for(let i=0,n=e.count;i<n;i++){t.x=e.getX(i),t.y=e.getY(i),t.z=e.getZ(i),t.w=e.getW(i);const n=1/t.manhattanLength();n!==1/0?t.multiplyScalar(n):t.set(1,0,0,0),e.setXYZW(i,t.x,t.y,t.z,t.w)}},updateMatrixWorld:function(t){Es.prototype.updateMatrixWorld.call(this,t),"attached"===this.bindMode?this.bindMatrixInverse.copy(this.matrixWorld).invert():"detached"===this.bindMode?this.bindMatrixInverse.copy(this.bindMatrix).invert():console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},boneTransform:function(t,e){const i=this.skeleton,n=this.geometry;Sc.fromBufferAttribute(n.attributes.skinIndex,t),Mc.fromBufferAttribute(n.attributes.skinWeight,t),wc.fromBufferAttribute(n.attributes.position,t).applyMatrix4(this.bindMatrix),e.set(0,0,0);for(let t=0;t<4;t++){const n=Mc.getComponent(t);if(0!==n){const r=Sc.getComponent(t);Cc.multiplyMatrices(i.bones[r].matrixWorld,i.boneInverses[r]),e.addScaledVector(Tc.copy(wc).applyMatrix4(Cc),n)}}return e.applyMatrix4(this.bindMatrixInverse)}}),Ic.prototype=Object.assign(Object.create(pr.prototype),{constructor:Ic,isBone:!0});const Ac=new Hn,Pc=new Hn;function Rc(t=[],e=[]){this.uuid=nn.generateUUID(),this.bones=t.slice(0),this.boneInverses=e,this.boneMatrices=null,this.boneTexture=null,this.boneTextureSize=0,this.frame=-1,this.init()}Object.assign(Rc.prototype,{init:function(){const t=this.bones,e=this.boneInverses;if(this.boneMatrices=new Float32Array(16*t.length),0===e.length)this.calculateInverses();else if(t.length!==e.length){console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."),this.boneInverses=[];for(let t=0,e=this.bones.length;t<e;t++)this.boneInverses.push(new Hn)}},calculateInverses:function(){this.boneInverses.length=0;for(let t=0,e=this.bones.length;t<e;t++){const e=new Hn;this.bones[t]&&e.copy(this.bones[t].matrixWorld).invert(),this.boneInverses.push(e)}},pose:function(){for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&e.matrixWorld.copy(this.boneInverses[t]).invert()}for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&(e.parent&&e.parent.isBone?(e.matrix.copy(e.parent.matrixWorld).invert(),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))}},update:function(){const t=this.bones,e=this.boneInverses,i=this.boneMatrices,n=this.boneTexture;for(let n=0,r=t.length;n<r;n++){const r=t[n]?t[n].matrixWorld:Pc;Ac.multiplyMatrices(r,e[n]),Ac.toArray(i,16*n)}null!==n&&(n.needsUpdate=!0)},clone:function(){return new Rc(this.bones,this.boneInverses)},getBoneByName:function(t){for(let e=0,i=this.bones.length;e<i;e++){const i=this.bones[e];if(i.name===t)return i}},dispose:function(){null!==this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=null)},fromJSON:function(t,e){this.uuid=t.uuid;for(let i=0,n=t.bones.length;i<n;i++){const n=t.bones[i];let r=e[n];void 0===r&&(console.warn("THREE.Skeleton: No bone found with UUID:",n),r=new Ic),this.bones.push(r),this.boneInverses.push((new Hn).fromArray(t.boneInverses[i]))}return this.init(),this},toJSON:function(){const t={metadata:{version:4.5,type:"Skeleton",generator:"Skeleton.toJSON"},bones:[],boneInverses:[]};t.uuid=this.uuid;const e=this.bones,i=this.boneInverses;for(let n=0,r=e.length;n<r;n++){const r=e[n];t.bones.push(r.uuid);const s=i[n];t.boneInverses.push(s.toArray())}return t}});const Lc=new Hn,Oc=new Hn,Nc=[],Dc=new Es;function $c(t,e,i){Es.call(this,t,e),this.instanceMatrix=new Hr(new Float32Array(16*i),16),this.instanceColor=null,this.count=i,this.frustumCulled=!1}function kc(t){zr.call(this),this.type="LineBasicMaterial",this.color=new Dr(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.morphTargets=!1,this.setValues(t)}$c.prototype=Object.assign(Object.create(Es.prototype),{constructor:$c,isInstancedMesh:!0,copy:function(t){return Es.prototype.copy.call(this,t),this.instanceMatrix.copy(t.instanceMatrix),null!==t.instanceColor&&(this.instanceColor=t.instanceColor.clone()),this.count=t.count,this},getColorAt:function(t,e){e.fromArray(this.instanceColor.array,3*t)},getMatrixAt:function(t,e){e.fromArray(this.instanceMatrix.array,16*t)},raycast:function(t,e){const i=this.matrixWorld,n=this.count;if(Dc.geometry=this.geometry,Dc.material=this.material,void 0!==Dc.material)for(let r=0;r<n;r++){this.getMatrixAt(r,Lc),Oc.multiplyMatrices(i,Lc),Dc.matrixWorld=Oc,Dc.raycast(t,Nc);for(let t=0,i=Nc.length;t<i;t++){const i=Nc[t];i.instanceId=r,i.object=this,e.push(i)}Nc.length=0}},setColorAt:function(t,e){null===this.instanceColor&&(this.instanceColor=new Hr(new Float32Array(3*this.count),3)),e.toArray(this.instanceColor.array,3*t)},setMatrixAt:function(t,e){e.toArray(this.instanceMatrix.array,16*t)},updateMorphTargets:function(){},dispose:function(){this.dispatchEvent({type:"dispose"})}}),kc.prototype=Object.create(zr.prototype),kc.prototype.constructor=kc,kc.prototype.isLineBasicMaterial=!0,kc.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.morphTargets=t.morphTargets,this};const zc=new fn,Fc=new fn,Bc=new Hn,jc=new jn,Hc=new On;function Uc(t=new hs,e=new kc){pr.call(this),this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}Uc.prototype=Object.assign(Object.create(pr.prototype),{constructor:Uc,isLine:!0,copy:function(t){return pr.prototype.copy.call(this,t),this.material=t.material,this.geometry=t.geometry,this},computeLineDistances:function(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,i=[0];for(let t=1,n=e.count;t<n;t++)zc.fromBufferAttribute(e,t-1),Fc.fromBufferAttribute(e,t),i[t]=i[t-1],i[t]+=zc.distanceTo(Fc);t.setAttribute("lineDistance",new Jr(i,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else t.isGeometry&&console.error("THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this},raycast:function(t,e){const i=this.geometry,n=this.matrixWorld,r=t.params.Line.threshold;if(null===i.boundingSphere&&i.computeBoundingSphere(),Hc.copy(i.boundingSphere),Hc.applyMatrix4(n),Hc.radius+=r,!1===t.ray.intersectsSphere(Hc))return;Bc.copy(n).invert(),jc.copy(t.ray).applyMatrix4(Bc);const s=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=s*s,a=new fn,c=new fn,h=new fn,l=new fn,u=this.isLineSegments?2:1;if(i.isBufferGeometry){const n=i.index,r=i.attributes.position;if(null!==n){const i=n.array;for(let n=0,s=i.length-1;n<s;n+=u){const s=i[n],u=i[n+1];a.fromBufferAttribute(r,s),c.fromBufferAttribute(r,u);if(jc.distanceSqToSegment(a,c,l,h)>o)continue;l.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(l);d<t.near||d>t.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}else for(let i=0,n=r.count-1;i<n;i+=u){a.fromBufferAttribute(r,i),c.fromBufferAttribute(r,i+1);if(jc.distanceSqToSegment(a,c,l,h)>o)continue;l.applyMatrix4(this.matrixWorld);const n=t.ray.origin.distanceTo(l);n<t.near||n>t.far||e.push({distance:n,point:h.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else i.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},updateMorphTargets:function(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,i=Object.keys(e);if(i.length>0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e<i;e++){const i=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}});const Vc=new fn,Gc=new fn;function qc(t,e){Uc.call(this,t,e),this.type="LineSegments"}function Wc(t,e){Uc.call(this,t,e),this.type="LineLoop"}function Xc(t){zr.call(this),this.type="PointsMaterial",this.color=new Dr(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(t)}qc.prototype=Object.assign(Object.create(Uc.prototype),{constructor:qc,isLineSegments:!0,computeLineDistances:function(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,n=e.count;t<n;t+=2)Vc.fromBufferAttribute(e,t),Gc.fromBufferAttribute(e,t+1),i[t]=0===t?0:i[t-1],i[t+1]=i[t]+Vc.distanceTo(Gc);t.setAttribute("lineDistance",new Jr(i,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else t.isGeometry&&console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}}),Wc.prototype=Object.assign(Object.create(Uc.prototype),{constructor:Wc,isLineLoop:!0}),Xc.prototype=Object.create(zr.prototype),Xc.prototype.constructor=Xc,Xc.prototype.isPointsMaterial=!0,Xc.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.morphTargets=t.morphTargets,this};const Yc=new Hn,Zc=new jn,Jc=new On,Kc=new fn;function Qc(t=new hs,e=new Xc){pr.call(this),this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}function th(t,e,i,n,r,s,o){const a=Zc.distanceSqToPoint(t);if(a<i){const i=new fn;Zc.closestPointToPoint(t,i),i.applyMatrix4(n);const c=r.ray.origin.distanceTo(i);if(c<r.near||c>r.far)return;s.push({distance:c,distanceToRay:Math.sqrt(a),point:i,index:e,face:null,object:o})}}function eh(t,e,i,n,r,s,o,a,c){hn.call(this,t,e,i,n,r,s,o,a,c),this.format=void 0!==o?o:ki,this.minFilter=void 0!==s?s:Ai,this.magFilter=void 0!==r?r:Ai,this.generateMipmaps=!1;const h=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){h.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}function ih(t,e,i,n,r,s,o,a,c,h,l,u){hn.call(this,null,s,o,a,c,h,n,r,l,u),this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}function nh(t,e,i,n,r,s,o,a,c){hn.call(this,t,e,i,n,r,s,o,a,c),this.needsUpdate=!0}function rh(t,e,i,n,r,s,o,a,c,h){if((h=void 0!==h?h:Fi)!==Fi&&h!==Bi)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&h===Fi&&(i=Li),void 0===i&&h===Bi&&(i=$i),hn.call(this,null,n,r,s,o,a,h,i,c),this.image={width:t,height:e},this.magFilter=void 0!==o?o:Ii,this.minFilter=void 0!==a?a:Ii,this.flipY=!1,this.generateMipmaps=!1}Qc.prototype=Object.assign(Object.create(pr.prototype),{constructor:Qc,isPoints:!0,copy:function(t){return pr.prototype.copy.call(this,t),this.material=t.material,this.geometry=t.geometry,this},raycast:function(t,e){const i=this.geometry,n=this.matrixWorld,r=t.params.Points.threshold;if(null===i.boundingSphere&&i.computeBoundingSphere(),Jc.copy(i.boundingSphere),Jc.applyMatrix4(n),Jc.radius+=r,!1===t.ray.intersectsSphere(Jc))return;Yc.copy(n).invert(),Zc.copy(t.ray).applyMatrix4(Yc);const s=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=s*s;if(i.isBufferGeometry){const r=i.index,s=i.attributes.position;if(null!==r){const i=r.array;for(let r=0,a=i.length;r<a;r++){const a=i[r];Kc.fromBufferAttribute(s,a),th(Kc,a,o,n,t,e,this)}}else for(let i=0,r=s.count;i<r;i++)Kc.fromBufferAttribute(s,i),th(Kc,i,o,n,t,e,this)}else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},updateMorphTargets:function(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,i=Object.keys(e);if(i.length>0){const t=e[i[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,i=t.length;e<i;e++){const i=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}),eh.prototype=Object.assign(Object.create(hn.prototype),{constructor:eh,clone:function(){return new this.constructor(this.image).copy(this)},isVideoTexture:!0,update:function(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),ih.prototype=Object.create(hn.prototype),ih.prototype.constructor=ih,ih.prototype.isCompressedTexture=!0,nh.prototype=Object.create(hn.prototype),nh.prototype.constructor=nh,nh.prototype.isCanvasTexture=!0,rh.prototype=Object.create(hn.prototype),rh.prototype.constructor=rh,rh.prototype.isDepthTexture=!0;class sh extends hs{constructor(t=1,e=8,i=0,n=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:i,thetaLength:n},e=Math.max(3,e);const r=[],s=[],o=[],a=[],c=new fn,h=new rn;s.push(0,0,0),o.push(0,0,1),a.push(.5,.5);for(let r=0,l=3;r<=e;r++,l+=3){const u=i+r/e*n;c.x=t*Math.cos(u),c.y=t*Math.sin(u),s.push(c.x,c.y,c.z),o.push(0,0,1),h.x=(s[l]/t+1)/2,h.y=(s[l+1]/t+1)/2,a.push(h.x,h.y)}for(let t=1;t<=e;t++)r.push(t,t+1,0);this.setIndex(r),this.setAttribute("position",new Jr(s,3)),this.setAttribute("normal",new Jr(o,3)),this.setAttribute("uv",new Jr(a,2))}}new fn,new fn,new fn,new Ir;const oh=function(t,e,i){i=i||2;const n=e&&e.length,r=n?e[0]*i:t.length;let s=ah(t,0,r,i,!0);const o=[];if(!s||s.next===s.prev)return o;let a,c,h,l,u,d,p;if(n&&(s=function(t,e,i,n){const r=[];let s,o,a,c,h;for(s=0,o=e.length;s<o;s++)a=e[s]*n,c=s<o-1?e[s+1]*n:t.length,h=ah(t,a,c,n,!1),h===h.next&&(h.steiner=!0),r.push(vh(h));for(r.sort(fh),s=0;s<r.length;s++)mh(r[s],i),i=ch(i,i.next);return i}(t,e,s,i)),t.length>80*i){a=h=t[0],c=l=t[1];for(let e=i;e<r;e+=i)u=t[e],d=t[e+1],u<a&&(a=u),d<c&&(c=d),u>h&&(h=u),d>l&&(l=d);p=Math.max(h-a,l-c),p=0!==p?1/p:0}return hh(s,o,i,a,c,p),o};function ah(t,e,i,n,r){let s,o;if(r===function(t,e,i,n){let r=0;for(let s=e,o=i-n;s<i;s+=n)r+=(t[o]-t[s])*(t[s+1]+t[o+1]),o=s;return r}(t,e,i,n)>0)for(s=e;s<i;s+=n)o=Ih(s,t[s],t[s+1],o);else for(s=i-n;s>=e;s-=n)o=Ih(s,t[s],t[s+1],o);return o&&wh(o,o.next)&&(Ah(o),o=o.next),o}function ch(t,e){if(!t)return t;e||(e=t);let i,n=t;do{if(i=!1,n.steiner||!wh(n,n.next)&&0!==xh(n.prev,n,n.next))n=n.next;else{if(Ah(n),n=e=n.prev,n===n.next)break;i=!0}}while(i||n!==e);return e}function hh(t,e,i,n,r,s,o){if(!t)return;!o&&s&&function(t,e,i,n){let r=t;do{null===r.z&&(r.z=_h(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i,n,r,s,o,a,c,h=1;do{for(i=t,t=null,s=null,o=0;i;){for(o++,n=i,a=0,e=0;e<h&&(a++,n=n.nextZ,n);e++);for(c=h;a>0||c>0&&n;)0!==a&&(0===c||!n||i.z<=n.z)?(r=i,i=i.nextZ,a--):(r=n,n=n.nextZ,c--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,h*=2}while(o>1)}(r)}(t,n,r,s);let a,c,h=t;for(;t.prev!==t.next;)if(a=t.prev,c=t.next,s?uh(t,n,r,s):lh(t))e.push(a.i/i),e.push(t.i/i),e.push(c.i/i),Ah(t),t=c.next,h=c.next;else if((t=c)===h){o?1===o?hh(t=dh(ch(t),e,i),e,i,n,r,s,2):2===o&&ph(t,e,i,n,r,s):hh(ch(t),e,i,n,r,s,1);break}}function lh(t){const e=t.prev,i=t,n=t.next;if(xh(e,i,n)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(yh(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&xh(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function uh(t,e,i,n){const r=t.prev,s=t,o=t.next;if(xh(r,s,o)>=0)return!1;const a=r.x<s.x?r.x<o.x?r.x:o.x:s.x<o.x?s.x:o.x,c=r.y<s.y?r.y<o.y?r.y:o.y:s.y<o.y?s.y:o.y,h=r.x>s.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,l=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,u=_h(a,c,e,i,n),d=_h(h,l,e,i,n);let p=t.prevZ,f=t.nextZ;for(;p&&p.z>=u&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&yh(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&xh(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&yh(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&xh(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&yh(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&xh(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&yh(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&xh(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function dh(t,e,i){let n=t;do{const r=n.prev,s=n.next.next;!wh(r,s)&&Sh(r,n,n.next,s)&&Ch(r,s)&&Ch(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),Ah(n),Ah(n.next),n=t=s),n=n.next}while(n!==t);return ch(n)}function ph(t,e,i,n,r,s){let o=t;do{let t=o.next.next;for(;t!==o.prev;){if(o.i!==t.i&&bh(o,t)){let a=Eh(o,t);return o=ch(o,o.next),a=ch(a,a.next),hh(o,e,i,n,r,s),void hh(a,e,i,n,r,s)}t=t.next}o=o.next}while(o!==t)}function fh(t,e){return t.x-e.x}function mh(t,e){if(e=function(t,e){let i=e;const n=t.x,r=t.y;let s,o=-1/0;do{if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=n&&t>o){if(o=t,t===n){if(r===i.y)return i;if(r===i.next.y)return i.next}s=i.x<i.next.x?i:i.next}}i=i.next}while(i!==e);if(!s)return null;if(n===o)return s;const a=s,c=s.x,h=s.y;let l,u=1/0;i=s;do{n>=i.x&&i.x>=c&&n!==i.x&&yh(r<h?n:o,r,c,h,r<h?o:n,r,i.x,i.y)&&(l=Math.abs(r-i.y)/(n-i.x),Ch(i,t)&&(l<u||l===u&&(i.x>s.x||i.x===s.x&&gh(s,i)))&&(s=i,u=l)),i=i.next}while(i!==a);return s}(t,e)){const i=Eh(e,t);ch(e,e.next),ch(i,i.next)}}function gh(t,e){return xh(t.prev,t,e.prev)<0&&xh(e.next,t,t.next)<0}function _h(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function vh(t){let e=t,i=t;do{(e.x<i.x||e.x===i.x&&e.y<i.y)&&(i=e),e=e.next}while(e!==t);return i}function yh(t,e,i,n,r,s,o,a){return(r-o)*(e-a)-(t-o)*(s-a)>=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(s-a)-(r-o)*(n-a)>=0}function bh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Sh(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(Ch(t,e)&&Ch(e,t)&&function(t,e){let i=t,n=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(xh(t.prev,t,e.prev)||xh(t,e.prev,e))||wh(t,e)&&xh(t.prev,t,t.next)>0&&xh(e.prev,e,e.next)>0)}function xh(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function wh(t,e){return t.x===e.x&&t.y===e.y}function Sh(t,e,i,n){const r=Th(xh(t,e,i)),s=Th(xh(t,e,n)),o=Th(xh(i,n,t)),a=Th(xh(i,n,e));return r!==s&&o!==a||(!(0!==r||!Mh(t,i,e))||(!(0!==s||!Mh(t,n,e))||(!(0!==o||!Mh(i,t,n))||!(0!==a||!Mh(i,e,n)))))}function Mh(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Th(t){return t>0?1:t<0?-1:0}function Ch(t,e){return xh(t.prev,t,t.next)<0?xh(t,e,t.next)>=0&&xh(t,t.prev,e)>=0:xh(t,e,t.prev)<0||xh(t,t.next,e)<0}function Eh(t,e){const i=new Ph(t.i,t.x,t.y),n=new Ph(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Ih(t,e,i,n){const r=new Ph(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Ah(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Ph(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}const Rh={area:function(t){const e=t.length;let i=0;for(let n=e-1,r=0;r<e;n=r++)i+=t[n].x*t[r].y-t[r].x*t[n].y;return.5*i},isClockWise:function(t){return Rh.area(t)<0},triangulateShape:function(t,e){const i=[],n=[],r=[];Lh(t),Oh(i,t);let s=t.length;e.forEach(Lh);for(let t=0;t<e.length;t++)n.push(s),s+=e[t].length,Oh(i,e[t]);const o=oh(i,n);for(let t=0;t<o.length;t+=3)r.push(o.slice(t,t+3));return r}};function Lh(t){const e=t.length;e>2&&t[e-1].equals(t[0])&&t.pop()}function Oh(t,e){for(let i=0;i<e.length;i++)t.push(e[i].x),t.push(e[i].y)}class Nh extends hs{constructor(t,e){super(),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:e},t=Array.isArray(t)?t:[t];const i=this,n=[],r=[];for(let e=0,i=t.length;e<i;e++){s(t[e])}function s(t){const s=[],o=void 0!==e.curveSegments?e.curveSegments:12,a=void 0!==e.steps?e.steps:1;let c=void 0!==e.depth?e.depth:100,h=void 0===e.bevelEnabled||e.bevelEnabled,l=void 0!==e.bevelThickness?e.bevelThickness:6,u=void 0!==e.bevelSize?e.bevelSize:l-2,d=void 0!==e.bevelOffset?e.bevelOffset:0,p=void 0!==e.bevelSegments?e.bevelSegments:3;const f=e.extrudePath,m=void 0!==e.UVGenerator?e.UVGenerator:Dh;void 0!==e.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),c=e.amount);let g,_,v,y,b,x=!1;f&&(g=f.getSpacedPoints(a),x=!0,h=!1,_=f.computeFrenetFrames(a,!1),v=new fn,y=new fn,b=new fn),h||(p=0,l=0,u=0,d=0);const w=t.extractPoints(o);let S=w.shape;const M=w.holes;if(!Rh.isClockWise(S)){S=S.reverse();for(let t=0,e=M.length;t<e;t++){const e=M[t];Rh.isClockWise(e)&&(M[t]=e.reverse())}}const T=Rh.triangulateShape(S,M),C=S;for(let t=0,e=M.length;t<e;t++){const e=M[t];S=S.concat(e)}function E(t,e,i){return e||console.error("THREE.ExtrudeGeometry: vec does not exist"),e.clone().multiplyScalar(i).add(t)}const I=S.length,A=T.length;function P(t,e,i){let n,r,s;const o=t.x-e.x,a=t.y-e.y,c=i.x-t.x,h=i.y-t.y,l=o*o+a*a,u=o*h-a*c;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(l),d=Math.sqrt(c*c+h*h),p=e.x-a/u,f=e.y+o/u,m=((i.x-h/d-p)*h-(i.y+c/d-f)*c)/(o*h-a*c);n=p+o*m-t.x,r=f+a*m-t.y;const g=n*n+r*r;if(g<=2)return new rn(n,r);s=Math.sqrt(g/2)}else{let t=!1;o>Number.EPSILON?c>Number.EPSILON&&(t=!0):o<-Number.EPSILON?c<-Number.EPSILON&&(t=!0):Math.sign(a)===Math.sign(h)&&(t=!0),t?(n=-a,r=o,s=Math.sqrt(l)):(n=o,r=a,s=Math.sqrt(l/2))}return new rn(n/s,r/s)}const R=[];for(let t=0,e=C.length,i=e-1,n=t+1;t<e;t++,i++,n++)i===e&&(i=0),n===e&&(n=0),R[t]=P(C[t],C[i],C[n]);const L=[];let O,N=R.concat();for(let t=0,e=M.length;t<e;t++){const e=M[t];O=[];for(let t=0,i=e.length,n=i-1,r=t+1;t<i;t++,n++,r++)n===i&&(n=0),r===i&&(r=0),O[t]=P(e[t],e[n],e[r]);L.push(O),N=N.concat(O)}for(let t=0;t<p;t++){const e=t/p,i=l*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=C.length;t<e;t++){const e=E(C[t],R[t],n);k(e.x,e.y,-i)}for(let t=0,e=M.length;t<e;t++){const e=M[t];O=L[t];for(let t=0,r=e.length;t<r;t++){const r=E(e[t],O[t],n);k(r.x,r.y,-i)}}}const D=u+d;for(let t=0;t<I;t++){const e=h?E(S[t],N[t],D):S[t];x?(y.copy(_.normals[0]).multiplyScalar(e.x),v.copy(_.binormals[0]).multiplyScalar(e.y),b.copy(g[0]).add(y).add(v),k(b.x,b.y,b.z)):k(e.x,e.y,0)}for(let t=1;t<=a;t++)for(let e=0;e<I;e++){const i=h?E(S[e],N[e],D):S[e];x?(y.copy(_.normals[t]).multiplyScalar(i.x),v.copy(_.binormals[t]).multiplyScalar(i.y),b.copy(g[t]).add(y).add(v),k(b.x,b.y,b.z)):k(i.x,i.y,c/a*t)}for(let t=p-1;t>=0;t--){const e=t/p,i=l*Math.cos(e*Math.PI/2),n=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=C.length;t<e;t++){const e=E(C[t],R[t],n);k(e.x,e.y,c+i)}for(let t=0,e=M.length;t<e;t++){const e=M[t];O=L[t];for(let t=0,r=e.length;t<r;t++){const r=E(e[t],O[t],n);x?k(r.x,r.y+g[a-1].y,g[a-1].x+i):k(r.x,r.y,c+i)}}}function $(t,e){let i=t.length;for(;--i>=0;){const n=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=a+2*p;t<i;t++){const i=I*t,s=I*(t+1);F(e+n+i,e+r+i,e+r+s,e+n+s)}}}function k(t,e,i){s.push(t),s.push(e),s.push(i)}function z(t,e,r){B(t),B(e),B(r);const s=n.length/3,o=m.generateTopUV(i,n,s-3,s-2,s-1);j(o[0]),j(o[1]),j(o[2])}function F(t,e,r,s){B(t),B(e),B(s),B(e),B(r),B(s);const o=n.length/3,a=m.generateSideWallUV(i,n,o-6,o-3,o-2,o-1);j(a[0]),j(a[1]),j(a[3]),j(a[1]),j(a[2]),j(a[3])}function B(t){n.push(s[3*t+0]),n.push(s[3*t+1]),n.push(s[3*t+2])}function j(t){r.push(t.x),r.push(t.y)}!function(){const t=n.length/3;if(h){let t=0,e=I*t;for(let t=0;t<A;t++){const i=T[t];z(i[2]+e,i[1]+e,i[0]+e)}t=a+2*p,e=I*t;for(let t=0;t<A;t++){const i=T[t];z(i[0]+e,i[1]+e,i[2]+e)}}else{for(let t=0;t<A;t++){const e=T[t];z(e[2],e[1],e[0])}for(let t=0;t<A;t++){const e=T[t];z(e[0]+I*a,e[1]+I*a,e[2]+I*a)}}i.addGroup(t,n.length/3-t,0)}(),function(){const t=n.length/3;let e=0;$(C,e),e+=C.length;for(let t=0,i=M.length;t<i;t++){const i=M[t];$(i,e),e+=i.length}i.addGroup(t,n.length/3-t,1)}()}this.setAttribute("position",new Jr(n,3)),this.setAttribute("uv",new Jr(r,2)),this.computeVertexNormals()}toJSON(){const t=hs.prototype.toJSON.call(this);return function(t,e,i){if(i.shapes=[],Array.isArray(t))for(let e=0,n=t.length;e<n;e++){const n=t[e];i.shapes.push(n.uuid)}else i.shapes.push(t.uuid);void 0!==e.extrudePath&&(i.options.extrudePath=e.extrudePath.toJSON());return i}(this.parameters.shapes,this.parameters.options,t)}}const Dh={generateTopUV:function(t,e,i,n,r){const s=e[3*i],o=e[3*i+1],a=e[3*n],c=e[3*n+1],h=e[3*r],l=e[3*r+1];return[new rn(s,o),new rn(a,c),new rn(h,l)]},generateSideWallUV:function(t,e,i,n,r,s){const o=e[3*i],a=e[3*i+1],c=e[3*i+2],h=e[3*n],l=e[3*n+1],u=e[3*n+2],d=e[3*r],p=e[3*r+1],f=e[3*r+2],m=e[3*s],g=e[3*s+1],_=e[3*s+2];return Math.abs(a-l)<.01?[new rn(o,1-c),new rn(h,1-u),new rn(d,1-f),new rn(m,1-_)]:[new rn(a,1-c),new rn(l,1-u),new rn(p,1-f),new rn(g,1-_)]}};function $h(t,e,i){hs.call(this),this.type="ParametricGeometry",this.parameters={func:t,slices:e,stacks:i};const n=[],r=[],s=[],o=[],a=1e-5,c=new fn,h=new fn,l=new fn,u=new fn,d=new fn;t.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");const p=e+1;for(let n=0;n<=i;n++){const p=n/i;for(let i=0;i<=e;i++){const n=i/e;t(n,p,h),r.push(h.x,h.y,h.z),n-a>=0?(t(n-a,p,l),u.subVectors(h,l)):(t(n+a,p,l),u.subVectors(l,h)),p-a>=0?(t(n,p-a,l),d.subVectors(h,l)):(t(n,p+a,l),d.subVectors(l,h)),c.crossVectors(u,d).normalize(),s.push(c.x,c.y,c.z),o.push(n,p)}}for(let t=0;t<i;t++)for(let i=0;i<e;i++){const e=t*p+i,r=t*p+i+1,s=(t+1)*p+i+1,o=(t+1)*p+i;n.push(e,r,o),n.push(r,s,o)}this.setIndex(n),this.setAttribute("position",new Jr(r,3)),this.setAttribute("normal",new Jr(s,3)),this.setAttribute("uv",new Jr(o,2))}$h.prototype=Object.create(hs.prototype),$h.prototype.constructor=$h;class kh extends hs{constructor(t,e=12){super(),this.type="ShapeGeometry",this.parameters={shapes:t,curveSegments:e};const i=[],n=[],r=[],s=[];let o=0,a=0;if(!1===Array.isArray(t))c(t);else for(let e=0;e<t.length;e++)c(t[e]),this.addGroup(o,a,e),o+=a,a=0;function c(t){const o=n.length/3,c=t.extractPoints(e);let h=c.shape;const l=c.holes;!1===Rh.isClockWise(h)&&(h=h.reverse());for(let t=0,e=l.length;t<e;t++){const e=l[t];!0===Rh.isClockWise(e)&&(l[t]=e.reverse())}const u=Rh.triangulateShape(h,l);for(let t=0,e=l.length;t<e;t++){const e=l[t];h=h.concat(e)}for(let t=0,e=h.length;t<e;t++){const e=h[t];n.push(e.x,e.y,0),r.push(0,0,1),s.push(e.x,e.y)}for(let t=0,e=u.length;t<e;t++){const e=u[t],n=e[0]+o,r=e[1]+o,s=e[2]+o;i.push(n,r,s),a+=3}}this.setIndex(i),this.setAttribute("position",new Jr(n,3)),this.setAttribute("normal",new Jr(r,3)),this.setAttribute("uv",new Jr(s,2))}toJSON(){const t=hs.prototype.toJSON.call(this);return function(t,e){if(e.shapes=[],Array.isArray(t))for(let i=0,n=t.length;i<n;i++){const n=t[i];e.shapes.push(n.uuid)}else e.shapes.push(t.uuid);return e}(this.parameters.shapes,t)}}class zh extends hs{constructor(t=1,e=8,i=6,n=0,r=2*Math.PI,s=0,o=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:i,phiStart:n,phiLength:r,thetaStart:s,thetaLength:o},e=Math.max(3,Math.floor(e)),i=Math.max(2,Math.floor(i));const a=Math.min(s+o,Math.PI);let c=0;const h=[],l=new fn,u=new fn,d=[],p=[],f=[],m=[];for(let d=0;d<=i;d++){const g=[],_=d/i;let v=0;0==d&&0==s?v=.5/e:d==i&&a==Math.PI&&(v=-.5/e);for(let i=0;i<=e;i++){const a=i/e;l.x=-t*Math.cos(n+a*r)*Math.sin(s+_*o),l.y=t*Math.cos(s+_*o),l.z=t*Math.sin(n+a*r)*Math.sin(s+_*o),p.push(l.x,l.y,l.z),u.copy(l).normalize(),f.push(u.x,u.y,u.z),m.push(a+v,1-_),g.push(c++)}h.push(g)}for(let t=0;t<i;t++)for(let n=0;n<e;n++){const e=h[t][n+1],r=h[t][n],o=h[t+1][n],c=h[t+1][n+1];(0!==t||s>0)&&d.push(e,r,c),(t!==i-1||a<Math.PI)&&d.push(r,o,c)}this.setIndex(d),this.setAttribute("position",new Jr(p,3)),this.setAttribute("normal",new Jr(f,3)),this.setAttribute("uv",new Jr(m,2))}}function Fh(t){zr.call(this),this.type="ShadowMaterial",this.color=new Dr(0),this.transparent=!0,this.setValues(t)}function Bh(t){Os.call(this,t),this.type="RawShaderMaterial"}function jh(t){zr.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new Dr(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Dr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new rn(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.vertexTangents=!1,this.setValues(t)}function Hh(t){jh.call(this),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoat=0,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new rn(1,1),this.clearcoatNormalMap=null,this.reflectivity=.5,Object.defineProperty(this,"ior",{get:function(){return(1+.4*this.reflectivity)/(1-.4*this.reflectivity)},set:function(t){this.reflectivity=nn.clamp(2.5*(t-1)/(t+1),0,1)}}),this.sheen=null,this.transmission=0,this.transmissionMap=null,this.setValues(t)}function Uh(t){zr.call(this),this.type="MeshPhongMaterial",this.color=new Dr(16777215),this.specular=new Dr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Dr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new rn(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Vh(t){zr.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Dr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Dr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new rn(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Gh(t){zr.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new rn(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function qh(t){zr.call(this),this.type="MeshLambertMaterial",this.color=new Dr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Dr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Wh(t){zr.call(this),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Dr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new rn(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Xh(t){kc.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}Fh.prototype=Object.create(zr.prototype),Fh.prototype.constructor=Fh,Fh.prototype.isShadowMaterial=!0,Fh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this},Bh.prototype=Object.create(Os.prototype),Bh.prototype.constructor=Bh,Bh.prototype.isRawShaderMaterial=!0,jh.prototype=Object.create(zr.prototype),jh.prototype.constructor=jh,jh.prototype.isMeshStandardMaterial=!0,jh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.vertexTangents=t.vertexTangents,this},Hh.prototype=Object.create(jh.prototype),Hh.prototype.constructor=Hh,Hh.prototype.isMeshPhysicalMaterial=!0,Hh.prototype.copy=function(t){return jh.prototype.copy.call(this,t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.reflectivity=t.reflectivity,t.sheen?this.sheen=(this.sheen||new Dr).copy(t.sheen):this.sheen=null,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this},Uh.prototype=Object.create(zr.prototype),Uh.prototype.constructor=Uh,Uh.prototype.isMeshPhongMaterial=!0,Uh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Vh.prototype=Object.create(zr.prototype),Vh.prototype.constructor=Vh,Vh.prototype.isMeshToonMaterial=!0,Vh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Gh.prototype=Object.create(zr.prototype),Gh.prototype.constructor=Gh,Gh.prototype.isMeshNormalMaterial=!0,Gh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},qh.prototype=Object.create(zr.prototype),qh.prototype.constructor=qh,qh.prototype.isMeshLambertMaterial=!0,qh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Wh.prototype=Object.create(zr.prototype),Wh.prototype.constructor=Wh,Wh.prototype.isMeshMatcapMaterial=!0,Wh.prototype.copy=function(t){return zr.prototype.copy.call(this,t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Xh.prototype=Object.create(kc.prototype),Xh.prototype.constructor=Xh,Xh.prototype.isLineDashedMaterial=!0,Xh.prototype.copy=function(t){return kc.prototype.copy.call(this,t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this};var Yh=Object.freeze({__proto__:null,ShadowMaterial:Fh,SpriteMaterial:nc,RawShaderMaterial:Bh,ShaderMaterial:Os,PointsMaterial:Xc,MeshPhysicalMaterial:Hh,MeshStandardMaterial:jh,MeshPhongMaterial:Uh,MeshToonMaterial:Vh,MeshNormalMaterial:Gh,MeshLambertMaterial:qh,MeshDepthMaterial:Ba,MeshDistanceMaterial:ja,MeshBasicMaterial:Fr,MeshMatcapMaterial:Wh,LineDashedMaterial:Xh,LineBasicMaterial:kc,Material:zr});const Zh={arraySlice:function(t,e,i){return Zh.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)},convertArray:function(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i},sortedArray:function(t,e,i){const n=t.length,r=new t.constructor(n);for(let s=0,o=0;o!==n;++s){const n=i[s]*e;for(let i=0;i!==e;++i)r[o++]=t[n+i]}return r},flattenJSON:function(t,e,i,n){let r=1,s=t[0];for(;void 0!==s&&void 0===s[n];)s=t[r++];if(void 0===s)return;let o=s[n];if(void 0!==o)if(Array.isArray(o))do{o=s[n],void 0!==o&&(e.push(s.time),i.push.apply(i,o)),s=t[r++]}while(void 0!==s);else if(void 0!==o.toArray)do{o=s[n],void 0!==o&&(e.push(s.time),o.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{o=s[n],void 0!==o&&(e.push(s.time),i.push(o)),s=t[r++]}while(void 0!==s)},subclip:function(t,e,i,n,r=30){const s=t.clone();s.name=e;const o=[];for(let t=0;t<s.tracks.length;++t){const e=s.tracks[t],a=e.getValueSize(),c=[],h=[];for(let t=0;t<e.times.length;++t){const s=e.times[t]*r;if(!(s<i||s>=n)){c.push(e.times[t]);for(let i=0;i<a;++i)h.push(e.values[t*a+i])}}0!==c.length&&(e.times=Zh.convertArray(c,e.times.constructor),e.values=Zh.convertArray(h,e.values.constructor),o.push(e))}s.tracks=o;let a=1/0;for(let t=0;t<s.tracks.length;++t)a>s.tracks[t].times[0]&&(a=s.tracks[t].times[0]);for(let t=0;t<s.tracks.length;++t)s.tracks[t].shift(-1*a);return s.resetDuration(),s},makeClipAdditive:function(t,e=0,i=t,n=30){n<=0&&(n=30);const r=i.tracks.length,s=e/n;for(let e=0;e<r;++e){const n=i.tracks[e],r=n.ValueTypeName;if("bool"===r||"string"===r)continue;const o=t.tracks.find((function(t){return t.name===n.name&&t.ValueTypeName===r}));if(void 0===o)continue;let a=0;const c=n.getValueSize();n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(a=c/3);let h=0;const l=o.getValueSize();o.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(h=l/3);const u=n.times.length-1;let d;if(s<=n.times[0]){const t=a,e=c-a;d=Zh.arraySlice(n.values,t,e)}else if(s>=n.times[u]){const t=u*c+a,e=t+c-a;d=Zh.arraySlice(n.values,t,e)}else{const t=n.createInterpolant(),e=a,i=c-a;t.evaluate(s),d=Zh.arraySlice(t.resultBuffer,e,i)}if("quaternion"===r){(new pn).fromArray(d).normalize().conjugate().toArray(d)}const p=o.times.length;for(let t=0;t<p;++t){const e=t*l+h;if("quaternion"===r)pn.multiplyQuaternionsFlat(o.values,e,d,0,o.values,e);else{const t=l-2*h;for(let i=0;i<t;++i)o.values[e+i]-=d[i]}}}return t.blendMode=2501,t}};function Jh(t,e,i,n){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new e.constructor(i),this.sampleValues=e,this.valueSize=i}function Kh(t,e,i,n){Jh.call(this,t,e,i,n),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0}function Qh(t,e,i,n){Jh.call(this,t,e,i,n)}function tl(t,e,i,n){Jh.call(this,t,e,i,n)}function el(t,e,i,n){if(void 0===t)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===e||0===e.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+t);this.name=t,this.times=Zh.convertArray(e,this.TimeBufferType),this.values=Zh.convertArray(i,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation)}function il(t,e,i){el.call(this,t,e,i)}function nl(t,e,i,n){el.call(this,t,e,i,n)}function rl(t,e,i,n){el.call(this,t,e,i,n)}function sl(t,e,i,n){Jh.call(this,t,e,i,n)}function ol(t,e,i,n){el.call(this,t,e,i,n)}function al(t,e,i,n){el.call(this,t,e,i,n)}function cl(t,e,i,n){el.call(this,t,e,i,n)}function hl(t,e=-1,i,n=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=n,this.uuid=nn.generateUUID(),this.duration<0&&this.resetDuration()}function ll(t){if(void 0===t.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");const e=function(t){switch(t.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return rl;case"vector":case"vector2":case"vector3":case"vector4":return cl;case"color":return nl;case"quaternion":return ol;case"bool":case"boolean":return il;case"string":return al}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){const e=[],i=[];Zh.flattenJSON(t.keys,e,i,"value"),t.times=e,t.values=i}return void 0!==e.parse?e.parse(t):new e(t.name,t.times,t.values,t.interpolation)}Object.assign(Jh.prototype,{evaluate:function(t){const e=this.parameterPositions;let i=this._cachedIndex,n=e[i],r=e[i-1];t:{e:{let s;i:{n:if(!(t<n)){for(let s=i+2;;){if(void 0===n){if(t<r)break n;return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,t,r)}if(i===s)break;if(r=n,n=e[++i],t<n)break e}s=e.length;break i}if(t>=r)break t;{const o=e[1];t<o&&(i=2,r=o);for(let s=i-2;;){if(void 0===r)return this._cachedIndex=0,this.beforeStart_(0,t,n);if(i===s)break;if(n=r,r=e[--i-1],t>=r)break e}s=i,i=0}}for(;i<s;){const n=i+s>>>1;t<e[n]?s=n:i=n+1}if(n=e[i],r=e[i-1],void 0===r)return this._cachedIndex=0,this.beforeStart_(0,t,n);if(void 0===n)return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,r,t)}this._cachedIndex=i,this.intervalChanged_(i,r,n)}return this.interpolate_(i,r,t,n)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(t){const e=this.resultBuffer,i=this.sampleValues,n=this.valueSize,r=t*n;for(let t=0;t!==n;++t)e[t]=i[r+t];return e},interpolate_:function(){throw new Error("call to abstract method")},intervalChanged_:function(){}}),Object.assign(Jh.prototype,{beforeStart_:Jh.prototype.copySampleValue_,afterEnd_:Jh.prototype.copySampleValue_}),Kh.prototype=Object.assign(Object.create(Jh.prototype),{constructor:Kh,DefaultSettings_:{endingStart:Vi,endingEnd:Vi},intervalChanged_:function(t,e,i){const n=this.parameterPositions;let r=t-2,s=t+1,o=n[r],a=n[s];if(void 0===o)switch(this.getSettings_().endingStart){case Gi:r=t,o=2*e-i;break;case qi:r=n.length-2,o=e+n[r]-n[r+1];break;default:r=t,o=i}if(void 0===a)switch(this.getSettings_().endingEnd){case Gi:s=t,a=2*i-e;break;case qi:s=1,a=i+n[1]-n[0];break;default:s=t-1,a=e}const c=.5*(i-e),h=this.valueSize;this._weightPrev=c/(e-o),this._weightNext=c/(a-i),this._offsetPrev=r*h,this._offsetNext=s*h},interpolate_:function(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=t*o,c=a-o,h=this._offsetPrev,l=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(i-e)/(n-e),f=p*p,m=f*p,g=-u*m+2*u*f-u*p,_=(1+u)*m+(-1.5-2*u)*f+(-.5+u)*p+1,v=(-1-d)*m+(1.5+d)*f+.5*p,y=d*m-d*f;for(let t=0;t!==o;++t)r[t]=g*s[h+t]+_*s[c+t]+v*s[a+t]+y*s[l+t];return r}}),Qh.prototype=Object.assign(Object.create(Jh.prototype),{constructor:Qh,interpolate_:function(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=t*o,c=a-o,h=(i-e)/(n-e),l=1-h;for(let t=0;t!==o;++t)r[t]=s[c+t]*l+s[a+t]*h;return r}}),tl.prototype=Object.assign(Object.create(Jh.prototype),{constructor:tl,interpolate_:function(t){return this.copySampleValue_(t-1)}}),Object.assign(el,{toJSON:function(t){const e=t.constructor;let i;if(void 0!==e.toJSON)i=e.toJSON(t);else{i={name:t.name,times:Zh.convertArray(t.times,Array),values:Zh.convertArray(t.values,Array)};const e=t.getInterpolation();e!==t.DefaultInterpolation&&(i.interpolation=e)}return i.type=t.ValueTypeName,i}}),Object.assign(el.prototype,{constructor:el,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:Hi,InterpolantFactoryMethodDiscrete:function(t){return new tl(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodLinear:function(t){return new Qh(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:function(t){return new Kh(this.times,this.values,this.getValueSize(),t)},setInterpolation:function(t){let e;switch(t){case ji:e=this.InterpolantFactoryMethodDiscrete;break;case Hi:e=this.InterpolantFactoryMethodLinear;break;case Ui:e=this.InterpolantFactoryMethodSmooth}if(void 0===e){const e="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(t===this.DefaultInterpolation)throw new Error(e);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",e),this}return this.createInterpolant=e,this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return ji;case this.InterpolantFactoryMethodLinear:return Hi;case this.InterpolantFactoryMethodSmooth:return Ui}},getValueSize:function(){return this.values.length/this.times.length},shift:function(t){if(0!==t){const e=this.times;for(let i=0,n=e.length;i!==n;++i)e[i]+=t}return this},scale:function(t){if(1!==t){const e=this.times;for(let i=0,n=e.length;i!==n;++i)e[i]*=t}return this},trim:function(t,e){const i=this.times,n=i.length;let r=0,s=n-1;for(;r!==n&&i[r]<t;)++r;for(;-1!==s&&i[s]>e;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Zh.arraySlice(i,r,s),this.values=Zh.arraySlice(this.values,r*t,s*t)}return this},validate:function(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const n=i[e];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,n),t=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,n,s),t=!1;break}s=n}if(void 0!==n&&Zh.isTypedArray(n))for(let e=0,i=n.length;e!==i;++e){const i=n[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t},optimize:function(){const t=Zh.arraySlice(this.times),e=Zh.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===Ui,r=t.length-1;let s=1;for(let o=1;o<r;++o){let r=!1;const a=t[o];if(a!==t[o+1]&&(1!==o||a!==t[0]))if(n)r=!0;else{const t=o*i,n=t-i,s=t+i;for(let o=0;o!==i;++o){const i=e[t+o];if(i!==e[n+o]||i!==e[s+o]){r=!0;break}}}if(r){if(o!==s){t[s]=t[o];const n=o*i,r=s*i;for(let t=0;t!==i;++t)e[r+t]=e[n+t]}++s}}if(r>0){t[s]=t[r];for(let t=r*i,n=s*i,o=0;o!==i;++o)e[n+o]=e[t+o];++s}return s!==t.length?(this.times=Zh.arraySlice(t,0,s),this.values=Zh.arraySlice(e,0,s*i)):(this.times=t,this.values=e),this},clone:function(){const t=Zh.arraySlice(this.times,0),e=Zh.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}),il.prototype=Object.assign(Object.create(el.prototype),{constructor:il,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:ji,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),nl.prototype=Object.assign(Object.create(el.prototype),{constructor:nl,ValueTypeName:"color"}),rl.prototype=Object.assign(Object.create(el.prototype),{constructor:rl,ValueTypeName:"number"}),sl.prototype=Object.assign(Object.create(Jh.prototype),{constructor:sl,interpolate_:function(t,e,i,n){const r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=(i-e)/(n-e);let c=t*o;for(let t=c+o;c!==t;c+=4)pn.slerpFlat(r,0,s,c-o,s,c,a);return r}}),ol.prototype=Object.assign(Object.create(el.prototype),{constructor:ol,ValueTypeName:"quaternion",DefaultInterpolation:Hi,InterpolantFactoryMethodLinear:function(t){return new sl(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:void 0}),al.prototype=Object.assign(Object.create(el.prototype),{constructor:al,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:ji,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),cl.prototype=Object.assign(Object.create(el.prototype),{constructor:cl,ValueTypeName:"vector"}),Object.assign(hl,{parse:function(t){const e=[],i=t.tracks,n=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(ll(i[t]).scale(n));const r=new hl(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r},toJSON:function(t){const e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,n=i.length;t!==n;++t)e.push(el.toJSON(i[t]));return n},CreateFromMorphTargetSequence:function(t,e,i,n){const r=e.length,s=[];for(let t=0;t<r;t++){let o=[],a=[];o.push((t+r-1)%r,t,(t+1)%r),a.push(0,1,0);const c=Zh.getKeyframeOrder(o);o=Zh.sortedArray(o,1,c),a=Zh.sortedArray(a,1,c),n||0!==o[0]||(o.push(r),a.push(a[0])),s.push(new rl(".morphTargetInfluences["+e[t].name+"]",o,a).scale(1/i))}return new hl(t,-1,s)},findByName:function(t,e){let i=t;if(!Array.isArray(t)){const e=t;i=e.geometry&&e.geometry.animations||e.animations}for(let t=0;t<i.length;t++)if(i[t].name===e)return i[t];return null},CreateClipsFromMorphTargetSequences:function(t,e,i){const n={},r=/^([\w-]*?)([\d]+)$/;for(let e=0,i=t.length;e<i;e++){const i=t[e],s=i.name.match(r);if(s&&s.length>1){const t=s[1];let e=n[t];e||(n[t]=e=[]),e.push(i)}}const s=[];for(const t in n)s.push(hl.CreateFromMorphTargetSequence(t,n[t],e,i));return s},parseAnimation:function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,n,r){if(0!==i.length){const s=[],o=[];Zh.flattenJSON(i,s,o,n),0!==s.length&&r.push(new t(e,s,o))}},n=[],r=t.name||"default",s=t.fps||30,o=t.blendMode;let a=t.length||-1;const c=t.hierarchy||[];for(let t=0;t<c.length;t++){const r=c[t].keys;if(r&&0!==r.length)if(r[0].morphTargets){const t={};let e;for(e=0;e<r.length;e++)if(r[e].morphTargets)for(let i=0;i<r[e].morphTargets.length;i++)t[r[e].morphTargets[i]]=-1;for(const i in t){const t=[],s=[];for(let n=0;n!==r[e].morphTargets.length;++n){const n=r[e];t.push(n.time),s.push(n.morphTarget===i?1:0)}n.push(new rl(".morphTargetInfluence["+i+"]",t,s))}a=t.length*(s||1)}else{const s=".bones["+e[t].name+"]";i(cl,s+".position",r,"pos",n),i(ol,s+".quaternion",r,"rot",n),i(cl,s+".scale",r,"scl",n)}}if(0===n.length)return null;return new hl(r,a,n,o)}}),Object.assign(hl.prototype,{resetDuration:function(){let t=0;for(let e=0,i=this.tracks.length;e!==i;++e){const i=this.tracks[e];t=Math.max(t,i.times[i.times.length-1])}return this.duration=t,this},trim:function(){for(let t=0;t<this.tracks.length;t++)this.tracks[t].trim(0,this.duration);return this},validate:function(){let t=!0;for(let e=0;e<this.tracks.length;e++)t=t&&this.tracks[e].validate();return t},optimize:function(){for(let t=0;t<this.tracks.length;t++)this.tracks[t].optimize();return this},clone:function(){const t=[];for(let e=0;e<this.tracks.length;e++)t.push(this.tracks[e].clone());return new hl(this.name,this.duration,t,this.blendMode)},toJSON:function(){return hl.toJSON(this)}});const ul={enabled:!1,files:{},add:function(t,e){!1!==this.enabled&&(this.files[t]=e)},get:function(t){if(!1!==this.enabled)return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};const dl=new function(t,e,i){const n=this;let r,s=!1,o=0,a=0;const c=[];this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=i,this.itemStart=function(t){a++,!1===s&&void 0!==n.onStart&&n.onStart(t,o,a),s=!0},this.itemEnd=function(t){o++,void 0!==n.onProgress&&n.onProgress(t,o,a),o===a&&(s=!1,void 0!==n.onLoad&&n.onLoad())},this.itemError=function(t){void 0!==n.onError&&n.onError(t)},this.resolveURL=function(t){return r?r(t):t},this.setURLModifier=function(t){return r=t,this},this.addHandler=function(t,e){return c.push(t,e),this},this.removeHandler=function(t){const e=c.indexOf(t);return-1!==e&&c.splice(e,2),this},this.getHandler=function(t){for(let e=0,i=c.length;e<i;e+=2){const i=c[e],n=c[e+1];if(i.global&&(i.lastIndex=0),i.test(t))return n}return null}};function pl(t){this.manager=void 0!==t?t:dl,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}Object.assign(pl.prototype,{load:function(){},loadAsync:function(t,e){const i=this;return new Promise((function(n,r){i.load(t,n,e,r)}))},parse:function(){},setCrossOrigin:function(t){return this.crossOrigin=t,this},setWithCredentials:function(t){return this.withCredentials=t,this},setPath:function(t){return this.path=t,this},setResourcePath:function(t){return this.resourcePath=t,this},setRequestHeader:function(t){return this.requestHeader=t,this}});const fl={};function ml(t){pl.call(this,t)}function gl(t){pl.call(this,t)}function _l(t){pl.call(this,t)}function vl(t){pl.call(this,t)}function yl(t){pl.call(this,t)}function bl(t){pl.call(this,t)}function xl(t){pl.call(this,t)}function wl(){this.type="Curve",this.arcLengthDivisions=200}function Sl(t,e,i,n,r,s,o,a){wl.call(this),this.type="EllipseCurve",this.aX=t||0,this.aY=e||0,this.xRadius=i||1,this.yRadius=n||1,this.aStartAngle=r||0,this.aEndAngle=s||2*Math.PI,this.aClockwise=o||!1,this.aRotation=a||0}function Ml(t,e,i,n,r,s){Sl.call(this,t,e,i,i,n,r,s),this.type="ArcCurve"}function Tl(){let t=0,e=0,i=0,n=0;function r(r,s,o,a){t=r,e=o,i=-3*r+3*s-2*o-a,n=2*r-2*s+o+a}return{initCatmullRom:function(t,e,i,n,s){r(e,i,s*(i-t),s*(n-e))},initNonuniformCatmullRom:function(t,e,i,n,s,o,a){let c=(e-t)/s-(i-t)/(s+o)+(i-e)/o,h=(i-e)/o-(n-e)/(o+a)+(n-i)/a;c*=o,h*=o,r(e,i,c,h)},calc:function(r){const s=r*r;return t+e*r+i*s+n*(s*r)}}}ml.prototype=Object.assign(Object.create(pl.prototype),{constructor:ml,load:function(t,e,i,n){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=ul.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;if(void 0!==fl[t])return void fl[t].push({onLoad:e,onProgress:i,onError:n});const o=t.match(/^data:(.*?)(;base64)?,(.*)$/);let a;if(o){const i=o[1],s=!!o[2];let a=o[3];a=decodeURIComponent(a),s&&(a=atob(a));try{let n;const s=(this.responseType||"").toLowerCase();switch(s){case"arraybuffer":case"blob":const t=new Uint8Array(a.length);for(let e=0;e<a.length;e++)t[e]=a.charCodeAt(e);n="blob"===s?new Blob([t.buffer],{type:i}):t.buffer;break;case"document":const e=new DOMParser;n=e.parseFromString(a,i);break;case"json":n=JSON.parse(a);break;default:n=a}setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0)}catch(e){setTimeout((function(){n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}),0)}}else{fl[t]=[],fl[t].push({onLoad:e,onProgress:i,onError:n}),a=new XMLHttpRequest,a.open("GET",t,!0),a.addEventListener("load",(function(e){const i=this.response,n=fl[t];if(delete fl[t],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),ul.add(t,i);for(let t=0,e=n.length;t<e;t++){const e=n[t];e.onLoad&&e.onLoad(i)}r.manager.itemEnd(t)}else{for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onError&&i.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}}),!1),a.addEventListener("progress",(function(e){const i=fl[t];for(let t=0,n=i.length;t<n;t++){const n=i[t];n.onProgress&&n.onProgress(e)}}),!1),a.addEventListener("error",(function(e){const i=fl[t];delete fl[t];for(let t=0,n=i.length;t<n;t++){const n=i[t];n.onError&&n.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),a.addEventListener("abort",(function(e){const i=fl[t];delete fl[t];for(let t=0,n=i.length;t<n;t++){const n=i[t];n.onError&&n.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),void 0!==this.responseType&&(a.responseType=this.responseType),void 0!==this.withCredentials&&(a.withCredentials=this.withCredentials),a.overrideMimeType&&a.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(const t in this.requestHeader)a.setRequestHeader(t,this.requestHeader[t]);a.send(null)}return r.manager.itemStart(t),a},setResponseType:function(t){return this.responseType=t,this},setMimeType:function(t){return this.mimeType=t,this}}),gl.prototype=Object.assign(Object.create(pl.prototype),{constructor:gl,load:function(t,e,i,n){const r=this,s=new ml(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)},parse:function(t){const e=[];for(let i=0;i<t.length;i++){const n=hl.parse(t[i]);e.push(n)}return e}}),_l.prototype=Object.assign(Object.create(pl.prototype),{constructor:_l,load:function(t,e,i,n){const r=this,s=[],o=new ih,a=new ml(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setWithCredentials(r.withCredentials);let c=0;function h(h){a.load(t[h],(function(t){const i=r.parse(t,!0);s[h]={width:i.width,height:i.height,format:i.format,mipmaps:i.mipmaps},c+=1,6===c&&(1===i.mipmapCount&&(o.minFilter=Ai),o.image=s,o.format=i.format,o.needsUpdate=!0,e&&e(o))}),i,n)}if(Array.isArray(t))for(let e=0,i=t.length;e<i;++e)h(e);else a.load(t,(function(t){const i=r.parse(t,!0);if(i.isCubemap){const t=i.mipmaps.length/i.mipmapCount;for(let e=0;e<t;e++){s[e]={mipmaps:[]};for(let t=0;t<i.mipmapCount;t++)s[e].mipmaps.push(i.mipmaps[e*i.mipmapCount+t]),s[e].format=i.format,s[e].width=i.width,s[e].height=i.height}o.image=s}else o.image.width=i.width,o.image.height=i.height,o.mipmaps=i.mipmaps;1===i.mipmapCount&&(o.minFilter=Ai),o.format=i.format,o.needsUpdate=!0,e&&e(o)}),i,n);return o}}),vl.prototype=Object.assign(Object.create(pl.prototype),{constructor:vl,load:function(t,e,i,n){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=ul.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const o=document.createElementNS("http://www.w3.org/1999/xhtml","img");function a(){o.removeEventListener("load",a,!1),o.removeEventListener("error",c,!1),ul.add(t,this),e&&e(this),r.manager.itemEnd(t)}function c(e){o.removeEventListener("load",a,!1),o.removeEventListener("error",c,!1),n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}return o.addEventListener("load",a,!1),o.addEventListener("error",c,!1),"data:"!==t.substr(0,5)&&void 0!==this.crossOrigin&&(o.crossOrigin=this.crossOrigin),r.manager.itemStart(t),o.src=t,o}}),yl.prototype=Object.assign(Object.create(pl.prototype),{constructor:yl,load:function(t,e,i,n){const r=new zs,s=new vl(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);let o=0;function a(i){s.load(t[i],(function(t){r.images[i]=t,o++,6===o&&(r.needsUpdate=!0,e&&e(r))}),void 0,n)}for(let e=0;e<t.length;++e)a(e);return r}}),bl.prototype=Object.assign(Object.create(pl.prototype),{constructor:bl,load:function(t,e,i,n){const r=this,s=new Bs,o=new ml(this.manager);return o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setPath(this.path),o.setWithCredentials(r.withCredentials),o.load(t,(function(t){const i=r.parse(t);i&&(void 0!==i.image?s.image=i.image:void 0!==i.data&&(s.image.width=i.width,s.image.height=i.height,s.image.data=i.data),s.wrapS=void 0!==i.wrapS?i.wrapS:Ci,s.wrapT=void 0!==i.wrapT?i.wrapT:Ci,s.magFilter=void 0!==i.magFilter?i.magFilter:Ai,s.minFilter=void 0!==i.minFilter?i.minFilter:Ai,s.anisotropy=void 0!==i.anisotropy?i.anisotropy:1,void 0!==i.encoding&&(s.encoding=i.encoding),void 0!==i.flipY&&(s.flipY=i.flipY),void 0!==i.format&&(s.format=i.format),void 0!==i.type&&(s.type=i.type),void 0!==i.mipmaps&&(s.mipmaps=i.mipmaps,s.minFilter=Pi),1===i.mipmapCount&&(s.minFilter=Ai),s.needsUpdate=!0,e&&e(s,i))}),i,n),s}}),xl.prototype=Object.assign(Object.create(pl.prototype),{constructor:xl,load:function(t,e,i,n){const r=new hn,s=new vl(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(t,(function(i){r.image=i;const n=t.search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/);r.format=n?ki:zi,r.needsUpdate=!0,void 0!==e&&e(r)}),i,n),r}}),Object.assign(wl.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e},getSpacedPoints:function(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e},getLength:function(){const t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,n=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)i=this.getPoint(s/t),r+=i.distanceTo(n),e.push(r),n=i;return this.cacheArcLengths=e,e},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){const i=this.getLengths();let n=0;const r=i.length;let s;s=e||t*i[r-1];let o,a=0,c=r-1;for(;a<=c;)if(n=Math.floor(a+(c-a)/2),o=i[n]-s,o<0)a=n+1;else{if(!(o>0)){c=n;break}c=n-1}if(n=c,i[n]===s)return n/(r-1);const h=i[n];return(n+(s-h)/(i[n+1]-h))/(r-1)},getTangent:function(t,e){const i=1e-4;let n=t-i,r=t+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),o=this.getPoint(r),a=e||(s.isVector2?new rn:new fn);return a.copy(o).sub(s).normalize(),a},getTangentAt:function(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)},computeFrenetFrames:function(t,e){const i=new fn,n=[],r=[],s=[],o=new fn,a=new Hn;for(let e=0;e<=t;e++){const i=e/t;n[e]=this.getTangentAt(i,new fn),n[e].normalize()}r[0]=new fn,s[0]=new fn;let c=Number.MAX_VALUE;const h=Math.abs(n[0].x),l=Math.abs(n[0].y),u=Math.abs(n[0].z);h<=c&&(c=h,i.set(1,0,0)),l<=c&&(c=l,i.set(0,1,0)),u<=c&&i.set(0,0,1),o.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],o),s[0].crossVectors(n[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),o.crossVectors(n[e-1],n[e]),o.length()>Number.EPSILON){o.normalize();const t=Math.acos(nn.clamp(n[e-1].dot(n[e]),-1,1));r[e].applyMatrix4(a.makeRotationAxis(o,t))}s[e].crossVectors(n[e],r[e])}if(!0===e){let e=Math.acos(nn.clamp(r[0].dot(r[t]),-1,1));e/=t,n[0].dot(o.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(a.makeRotationAxis(n[i],e*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}),Sl.prototype=Object.create(wl.prototype),Sl.prototype.constructor=Sl,Sl.prototype.isEllipseCurve=!0,Sl.prototype.getPoint=function(t,e){const i=e||new rn,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)<Number.EPSILON;for(;r<0;)r+=n;for(;r>n;)r-=n;r<Number.EPSILON&&(r=s?0:n),!0!==this.aClockwise||s||(r===n?r=-n:r-=n);const o=this.aStartAngle+t*r;let a=this.aX+this.xRadius*Math.cos(o),c=this.aY+this.yRadius*Math.sin(o);if(0!==this.aRotation){const t=Math.cos(this.aRotation),e=Math.sin(this.aRotation),i=a-this.aX,n=c-this.aY;a=i*t-n*e+this.aX,c=i*e+n*t+this.aY}return i.set(a,c)},Sl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},Sl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.aX=this.aX,t.aY=this.aY,t.xRadius=this.xRadius,t.yRadius=this.yRadius,t.aStartAngle=this.aStartAngle,t.aEndAngle=this.aEndAngle,t.aClockwise=this.aClockwise,t.aRotation=this.aRotation,t},Sl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},Ml.prototype=Object.create(Sl.prototype),Ml.prototype.constructor=Ml,Ml.prototype.isArcCurve=!0;const Cl=new fn,El=new Tl,Il=new Tl,Al=new Tl;function Pl(t=[],e=!1,i="centripetal",n=.5){wl.call(this),this.type="CatmullRomCurve3",this.points=t,this.closed=e,this.curveType=i,this.tension=n}function Rl(t,e,i,n,r){const s=.5*(n-e),o=.5*(r-i),a=t*t;return(2*i-2*n+s+o)*(t*a)+(-3*i+3*n-2*s-o)*a+s*t+i}function Ll(t,e,i,n){return function(t,e){const i=1-t;return i*i*e}(t,e)+function(t,e){return 2*(1-t)*t*e}(t,i)+function(t,e){return t*t*e}(t,n)}function Ol(t,e,i,n,r){return function(t,e){const i=1-t;return i*i*i*e}(t,e)+function(t,e){const i=1-t;return 3*i*i*t*e}(t,i)+function(t,e){return 3*(1-t)*t*t*e}(t,n)+function(t,e){return t*t*t*e}(t,r)}function Nl(t=new rn,e=new rn,i=new rn,n=new rn){wl.call(this),this.type="CubicBezierCurve",this.v0=t,this.v1=e,this.v2=i,this.v3=n}function Dl(t=new fn,e=new fn,i=new fn,n=new fn){wl.call(this),this.type="CubicBezierCurve3",this.v0=t,this.v1=e,this.v2=i,this.v3=n}function $l(t=new rn,e=new rn){wl.call(this),this.type="LineCurve",this.v1=t,this.v2=e}function kl(t=new fn,e=new fn){wl.call(this),this.type="LineCurve3",this.v1=t,this.v2=e}function zl(t=new rn,e=new rn,i=new rn){wl.call(this),this.type="QuadraticBezierCurve",this.v0=t,this.v1=e,this.v2=i}function Fl(t=new fn,e=new fn,i=new fn){wl.call(this),this.type="QuadraticBezierCurve3",this.v0=t,this.v1=e,this.v2=i}function Bl(t=[]){wl.call(this),this.type="SplineCurve",this.points=t}Pl.prototype=Object.create(wl.prototype),Pl.prototype.constructor=Pl,Pl.prototype.isCatmullRomCurve3=!0,Pl.prototype.getPoint=function(t,e=new fn){const i=e,n=this.points,r=n.length,s=(r-(this.closed?0:1))*t;let o,a,c=Math.floor(s),h=s-c;this.closed?c+=c>0?0:(Math.floor(Math.abs(c)/r)+1)*r:0===h&&c===r-1&&(c=r-2,h=1),this.closed||c>0?o=n[(c-1)%r]:(Cl.subVectors(n[0],n[1]).add(n[0]),o=Cl);const l=n[c%r],u=n[(c+1)%r];if(this.closed||c+2<r?a=n[(c+2)%r]:(Cl.subVectors(n[r-1],n[r-2]).add(n[r-1]),a=Cl),"centripetal"===this.curveType||"chordal"===this.curveType){const t="chordal"===this.curveType?.5:.25;let e=Math.pow(o.distanceToSquared(l),t),i=Math.pow(l.distanceToSquared(u),t),n=Math.pow(u.distanceToSquared(a),t);i<1e-4&&(i=1),e<1e-4&&(e=i),n<1e-4&&(n=i),El.initNonuniformCatmullRom(o.x,l.x,u.x,a.x,e,i,n),Il.initNonuniformCatmullRom(o.y,l.y,u.y,a.y,e,i,n),Al.initNonuniformCatmullRom(o.z,l.z,u.z,a.z,e,i,n)}else"catmullrom"===this.curveType&&(El.initCatmullRom(o.x,l.x,u.x,a.x,this.tension),Il.initCatmullRom(o.y,l.y,u.y,a.y,this.tension),Al.initCatmullRom(o.z,l.z,u.z,a.z,this.tension));return i.set(El.calc(h),Il.calc(h),Al.calc(h)),i},Pl.prototype.copy=function(t){wl.prototype.copy.call(this,t),this.points=[];for(let e=0,i=t.points.length;e<i;e++){const i=t.points[e];this.points.push(i.clone())}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},Pl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);t.points=[];for(let e=0,i=this.points.length;e<i;e++){const i=this.points[e];t.points.push(i.toArray())}return t.closed=this.closed,t.curveType=this.curveType,t.tension=this.tension,t},Pl.prototype.fromJSON=function(t){wl.prototype.fromJSON.call(this,t),this.points=[];for(let e=0,i=t.points.length;e<i;e++){const i=t.points[e];this.points.push((new fn).fromArray(i))}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},Nl.prototype=Object.create(wl.prototype),Nl.prototype.constructor=Nl,Nl.prototype.isCubicBezierCurve=!0,Nl.prototype.getPoint=function(t,e=new rn){const i=e,n=this.v0,r=this.v1,s=this.v2,o=this.v3;return i.set(Ol(t,n.x,r.x,s.x,o.x),Ol(t,n.y,r.y,s.y,o.y)),i},Nl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},Nl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},Nl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},Dl.prototype=Object.create(wl.prototype),Dl.prototype.constructor=Dl,Dl.prototype.isCubicBezierCurve3=!0,Dl.prototype.getPoint=function(t,e=new fn){const i=e,n=this.v0,r=this.v1,s=this.v2,o=this.v3;return i.set(Ol(t,n.x,r.x,s.x,o.x),Ol(t,n.y,r.y,s.y,o.y),Ol(t,n.z,r.z,s.z,o.z)),i},Dl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},Dl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},Dl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},$l.prototype=Object.create(wl.prototype),$l.prototype.constructor=$l,$l.prototype.isLineCurve=!0,$l.prototype.getPoint=function(t,e=new rn){const i=e;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},$l.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},$l.prototype.getTangent=function(t,e){const i=e||new rn;return i.copy(this.v2).sub(this.v1).normalize(),i},$l.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},$l.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},$l.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},kl.prototype=Object.create(wl.prototype),kl.prototype.constructor=kl,kl.prototype.isLineCurve3=!0,kl.prototype.getPoint=function(t,e=new fn){const i=e;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},kl.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},kl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},kl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},kl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},zl.prototype=Object.create(wl.prototype),zl.prototype.constructor=zl,zl.prototype.isQuadraticBezierCurve=!0,zl.prototype.getPoint=function(t,e=new rn){const i=e,n=this.v0,r=this.v1,s=this.v2;return i.set(Ll(t,n.x,r.x,s.x),Ll(t,n.y,r.y,s.y)),i},zl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},zl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},zl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},Fl.prototype=Object.create(wl.prototype),Fl.prototype.constructor=Fl,Fl.prototype.isQuadraticBezierCurve3=!0,Fl.prototype.getPoint=function(t,e=new fn){const i=e,n=this.v0,r=this.v1,s=this.v2;return i.set(Ll(t,n.x,r.x,s.x),Ll(t,n.y,r.y,s.y),Ll(t,n.z,r.z,s.z)),i},Fl.prototype.copy=function(t){return wl.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},Fl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},Fl.prototype.fromJSON=function(t){return wl.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},Bl.prototype=Object.create(wl.prototype),Bl.prototype.constructor=Bl,Bl.prototype.isSplineCurve=!0,Bl.prototype.getPoint=function(t,e=new rn){const i=e,n=this.points,r=(n.length-1)*t,s=Math.floor(r),o=r-s,a=n[0===s?s:s-1],c=n[s],h=n[s>n.length-2?n.length-1:s+1],l=n[s>n.length-3?n.length-1:s+2];return i.set(Rl(o,a.x,c.x,h.x,l.x),Rl(o,a.y,c.y,h.y,l.y)),i},Bl.prototype.copy=function(t){wl.prototype.copy.call(this,t),this.points=[];for(let e=0,i=t.points.length;e<i;e++){const i=t.points[e];this.points.push(i.clone())}return this},Bl.prototype.toJSON=function(){const t=wl.prototype.toJSON.call(this);t.points=[];for(let e=0,i=this.points.length;e<i;e++){const i=this.points[e];t.points.push(i.toArray())}return t},Bl.prototype.fromJSON=function(t){wl.prototype.fromJSON.call(this,t),this.points=[];for(let e=0,i=t.points.length;e<i;e++){const i=t.points[e];this.points.push((new rn).fromArray(i))}return this};var jl=Object.freeze({__proto__:null,ArcCurve:Ml,CatmullRomCurve3:Pl,CubicBezierCurve:Nl,CubicBezierCurve3:Dl,EllipseCurve:Sl,LineCurve:$l,LineCurve3:kl,QuadraticBezierCurve:zl,QuadraticBezierCurve3:Fl,SplineCurve:Bl});function Hl(){wl.call(this),this.type="CurvePath",this.curves=[],this.autoClose=!1}function Ul(t){Hl.call(this),this.type="Path",this.currentPoint=new rn,t&&this.setFromPoints(t)}function Vl(t){Ul.call(this,t),this.uuid=nn.generateUUID(),this.type="Shape",this.holes=[]}function Gl(t,e=1){pr.call(this),this.type="Light",this.color=new Dr(t),this.intensity=e}function ql(t,e,i){Gl.call(this,t,i),this.type="HemisphereLight",this.position.copy(pr.DefaultUp),this.updateMatrix(),this.groundColor=new Dr(e)}function Wl(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.mapSize=new rn(512,512),this.map=null,this.mapPass=null,this.matrix=new Hn,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Us,this._frameExtents=new rn(1,1),this._viewportCount=1,this._viewports=[new un(0,0,1,1)]}function Xl(){Wl.call(this,new Ds(50,1,.5,500)),this.focus=1}function Yl(t,e,i,n,r,s){Gl.call(this,t,e),this.type="SpotLight",this.position.copy(pr.DefaultUp),this.updateMatrix(),this.target=new pr,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(t){this.intensity=t/Math.PI}}),this.distance=void 0!==i?i:0,this.angle=void 0!==n?n:Math.PI/3,this.penumbra=void 0!==r?r:0,this.decay=void 0!==s?s:1,this.shadow=new Xl}function Zl(){Wl.call(this,new Ds(90,1,.5,500)),this._frameExtents=new rn(4,2),this._viewportCount=6,this._viewports=[new un(2,1,1,1),new un(0,1,1,1),new un(3,1,1,1),new un(1,1,1,1),new un(3,0,1,1),new un(1,0,1,1)],this._cubeDirections=[new fn(1,0,0),new fn(-1,0,0),new fn(0,0,1),new fn(0,0,-1),new fn(0,1,0),new fn(0,-1,0)],this._cubeUps=[new fn(0,1,0),new fn(0,1,0),new fn(0,1,0),new fn(0,1,0),new fn(0,0,1),new fn(0,0,-1)]}function Jl(t,e,i,n){Gl.call(this,t,e),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(t){this.intensity=t/(4*Math.PI)}}),this.distance=void 0!==i?i:0,this.decay=void 0!==n?n:1,this.shadow=new Zl}function Kl(t=-1,e=1,i=1,n=-1,r=.1,s=2e3){Ns.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}function Ql(){Wl.call(this,new Kl(-5,5,5,-5,.5,500))}function tu(t,e){Gl.call(this,t,e),this.type="DirectionalLight",this.position.copy(pr.DefaultUp),this.updateMatrix(),this.target=new pr,this.shadow=new Ql}function eu(t,e){Gl.call(this,t,e),this.type="AmbientLight"}function iu(t,e,i,n){Gl.call(this,t,e),this.type="RectAreaLight",this.width=void 0!==i?i:10,this.height=void 0!==n?n:10}Hl.prototype=Object.assign(Object.create(wl.prototype),{constructor:Hl,add:function(t){this.curves.push(t)},closePath:function(){const t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new $l(e,t))},getPoint:function(t){const e=t*this.getLength(),i=this.getCurveLengths();let n=0;for(;n<i.length;){if(i[n]>=e){const t=i[n]-e,r=this.curves[n],s=r.getLength(),o=0===s?0:1-t/s;return r.getPointAt(o)}n++}return null},getLength:function(){const t=this.getCurveLengths();return t[t.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,n=this.curves.length;i<n;i++)e+=this.curves[i].getLength(),t.push(e);return this.cacheLengths=t,t},getSpacedPoints:function(t=40){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return this.autoClose&&e.push(e[0]),e},getPoints:function(t=12){const e=[];let i;for(let n=0,r=this.curves;n<r.length;n++){const s=r[n],o=s&&s.isEllipseCurve?2*t:s&&(s.isLineCurve||s.isLineCurve3)?1:s&&s.isSplineCurve?t*s.points.length:t,a=s.getPoints(o);for(let t=0;t<a.length;t++){const n=a[t];i&&i.equals(n)||(e.push(n),i=n)}}return this.autoClose&&e.length>1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e},copy:function(t){wl.prototype.copy.call(this,t),this.curves=[];for(let e=0,i=t.curves.length;e<i;e++){const i=t.curves[e];this.curves.push(i.clone())}return this.autoClose=t.autoClose,this},toJSON:function(){const t=wl.prototype.toJSON.call(this);t.autoClose=this.autoClose,t.curves=[];for(let e=0,i=this.curves.length;e<i;e++){const i=this.curves[e];t.curves.push(i.toJSON())}return t},fromJSON:function(t){wl.prototype.fromJSON.call(this,t),this.autoClose=t.autoClose,this.curves=[];for(let e=0,i=t.curves.length;e<i;e++){const i=t.curves[e];this.curves.push((new jl[i.type]).fromJSON(i))}return this}}),Ul.prototype=Object.assign(Object.create(Hl.prototype),{constructor:Ul,setFromPoints:function(t){this.moveTo(t[0].x,t[0].y);for(let e=1,i=t.length;e<i;e++)this.lineTo(t[e].x,t[e].y);return this},moveTo:function(t,e){return this.currentPoint.set(t,e),this},lineTo:function(t,e){const i=new $l(this.currentPoint.clone(),new rn(t,e));return this.curves.push(i),this.currentPoint.set(t,e),this},quadraticCurveTo:function(t,e,i,n){const r=new zl(this.currentPoint.clone(),new rn(t,e),new rn(i,n));return this.curves.push(r),this.currentPoint.set(i,n),this},bezierCurveTo:function(t,e,i,n,r,s){const o=new Nl(this.currentPoint.clone(),new rn(t,e),new rn(i,n),new rn(r,s));return this.curves.push(o),this.currentPoint.set(r,s),this},splineThru:function(t){const e=new Bl([this.currentPoint.clone()].concat(t));return this.curves.push(e),this.currentPoint.copy(t[t.length-1]),this},arc:function(t,e,i,n,r,s){const o=this.currentPoint.x,a=this.currentPoint.y;return this.absarc(t+o,e+a,i,n,r,s),this},absarc:function(t,e,i,n,r,s){return this.absellipse(t,e,i,i,n,r,s),this},ellipse:function(t,e,i,n,r,s,o,a){const c=this.currentPoint.x,h=this.currentPoint.y;return this.absellipse(t+c,e+h,i,n,r,s,o,a),this},absellipse:function(t,e,i,n,r,s,o,a){const c=new Sl(t,e,i,n,r,s,o,a);if(this.curves.length>0){const t=c.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this},copy:function(t){return Hl.prototype.copy.call(this,t),this.currentPoint.copy(t.currentPoint),this},toJSON:function(){const t=Hl.prototype.toJSON.call(this);return t.currentPoint=this.currentPoint.toArray(),t},fromJSON:function(t){return Hl.prototype.fromJSON.call(this,t),this.currentPoint.fromArray(t.currentPoint),this}}),Vl.prototype=Object.assign(Object.create(Ul.prototype),{constructor:Vl,getPointsHoles:function(t){const e=[];for(let i=0,n=this.holes.length;i<n;i++)e[i]=this.holes[i].getPoints(t);return e},extractPoints:function(t){return{shape:this.getPoints(t),holes:this.getPointsHoles(t)}},copy:function(t){Ul.prototype.copy.call(this,t),this.holes=[];for(let e=0,i=t.holes.length;e<i;e++){const i=t.holes[e];this.holes.push(i.clone())}return this},toJSON:function(){const t=Ul.prototype.toJSON.call(this);t.uuid=this.uuid,t.holes=[];for(let e=0,i=this.holes.length;e<i;e++){const i=this.holes[e];t.holes.push(i.toJSON())}return t},fromJSON:function(t){Ul.prototype.fromJSON.call(this,t),this.uuid=t.uuid,this.holes=[];for(let e=0,i=t.holes.length;e<i;e++){const i=t.holes[e];this.holes.push((new Ul).fromJSON(i))}return this}}),Gl.prototype=Object.assign(Object.create(pr.prototype),{constructor:Gl,isLight:!0,copy:function(t){return pr.prototype.copy.call(this,t),this.color.copy(t.color),this.intensity=t.intensity,this},toJSON:function(t){const e=pr.prototype.toJSON.call(this,t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}),ql.prototype=Object.assign(Object.create(Gl.prototype),{constructor:ql,isHemisphereLight:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.groundColor.copy(t.groundColor),this}}),Object.assign(Wl.prototype,{_projScreenMatrix:new Hn,_lightPositionWorld:new fn,_lookTarget:new fn,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(t){const e=this.camera,i=this.matrix,n=this._projScreenMatrix,r=this._lookTarget,s=this._lightPositionWorld;s.setFromMatrixPosition(t.matrixWorld),e.position.copy(s),r.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(r),e.updateMatrixWorld(),n.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(n),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(e.projectionMatrix),i.multiply(e.matrixWorldInverse)},getViewport:function(t){return this._viewports[t]},getFrameExtents:function(){return this._frameExtents},copy:function(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){const t={};return 0!==this.bias&&(t.bias=this.bias),0!==this.normalBias&&(t.normalBias=this.normalBias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}),Xl.prototype=Object.assign(Object.create(Wl.prototype),{constructor:Xl,isSpotLightShadow:!0,updateMatrices:function(t){const e=this.camera,i=2*nn.RAD2DEG*t.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;i===e.fov&&n===e.aspect&&r===e.far||(e.fov=i,e.aspect=n,e.far=r,e.updateProjectionMatrix()),Wl.prototype.updateMatrices.call(this,t)}}),Yl.prototype=Object.assign(Object.create(Gl.prototype),{constructor:Yl,isSpotLight:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),Zl.prototype=Object.assign(Object.create(Wl.prototype),{constructor:Zl,isPointLightShadow:!0,updateMatrices:function(t,e=0){const i=this.camera,n=this.matrix,r=this._lightPositionWorld,s=this._lookTarget,o=this._projScreenMatrix;r.setFromMatrixPosition(t.matrixWorld),i.position.copy(r),s.copy(i.position),s.add(this._cubeDirections[e]),i.up.copy(this._cubeUps[e]),i.lookAt(s),i.updateMatrixWorld(),n.makeTranslation(-r.x,-r.y,-r.z),o.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(o)}}),Jl.prototype=Object.assign(Object.create(Gl.prototype),{constructor:Jl,isPointLight:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}),Kl.prototype=Object.assign(Object.create(Ns.prototype),{constructor:Kl,isOrthographicCamera:!0,copy:function(t,e){return Ns.prototype.copy.call(this,t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this},setViewOffset:function(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-t,s=i+t,o=n+e,a=n-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,o-=e*this.view.offsetY,a=o-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,o,a,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()},toJSON:function(t){const e=pr.prototype.toJSON.call(this,t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}),Ql.prototype=Object.assign(Object.create(Wl.prototype),{constructor:Ql,isDirectionalLightShadow:!0,updateMatrices:function(t){Wl.prototype.updateMatrices.call(this,t)}}),tu.prototype=Object.assign(Object.create(Gl.prototype),{constructor:tu,isDirectionalLight:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),eu.prototype=Object.assign(Object.create(Gl.prototype),{constructor:eu,isAmbientLight:!0}),iu.prototype=Object.assign(Object.create(Gl.prototype),{constructor:iu,isRectAreaLight:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.width=t.width,this.height=t.height,this},toJSON:function(t){const e=Gl.prototype.toJSON.call(this,t);return e.object.width=this.width,e.object.height=this.height,e}});class nu{constructor(){Object.defineProperty(this,"isSphericalHarmonics3",{value:!0}),this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new fn)}set(t){for(let e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this}zero(){for(let t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this}getAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*n),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*i),e.addScaledVector(s[4],i*n*1.092548),e.addScaledVector(s[5],n*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],i*r*1.092548),e.addScaledVector(s[8],.546274*(i*i-n*n)),e}getIrradianceAt(t,e){const i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*n),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*i),e.addScaledVector(s[4],.858086*i*n),e.addScaledVector(s[5],.858086*n*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*i*r),e.addScaledVector(s[8],.429043*(i*i-n*n)),e}add(t){for(let e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this}addScaledSH(t,e){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(t.coefficients[i],e);return this}scale(t){for(let e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this}lerp(t,e){for(let i=0;i<9;i++)this.coefficients[i].lerp(t.coefficients[i],e);return this}equals(t){for(let e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0}copy(t){return this.set(t.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(t,e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(t,e+3*n);return this}toArray(t=[],e=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(t,e+3*n);return t}static getBasisAt(t,e){const i=t.x,n=t.y,r=t.z;e[0]=.282095,e[1]=.488603*n,e[2]=.488603*r,e[3]=.488603*i,e[4]=1.092548*i*n,e[5]=1.092548*n*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*i*r,e[8]=.546274*(i*i-n*n)}}function ru(t,e){Gl.call(this,void 0,e),this.type="LightProbe",this.sh=void 0!==t?t:new nu}function su(t){pl.call(this,t),this.textures={}}ru.prototype=Object.assign(Object.create(Gl.prototype),{constructor:ru,isLightProbe:!0,copy:function(t){return Gl.prototype.copy.call(this,t),this.sh.copy(t.sh),this},fromJSON:function(t){return this.intensity=t.intensity,this.sh.fromArray(t.sh),this},toJSON:function(t){const e=Gl.prototype.toJSON.call(this,t);return e.object.sh=this.sh.toArray(),e}}),su.prototype=Object.assign(Object.create(pl.prototype),{constructor:su,load:function(t,e,i,n){const r=this,s=new ml(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)},parse:function(t){const e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const n=new Yh[t.type];if(void 0!==t.uuid&&(n.uuid=t.uuid),void 0!==t.name&&(n.name=t.name),void 0!==t.color&&void 0!==n.color&&n.color.setHex(t.color),void 0!==t.roughness&&(n.roughness=t.roughness),void 0!==t.metalness&&(n.metalness=t.metalness),void 0!==t.sheen&&(n.sheen=(new Dr).setHex(t.sheen)),void 0!==t.emissive&&void 0!==n.emissive&&n.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==n.specular&&n.specular.setHex(t.specular),void 0!==t.shininess&&(n.shininess=t.shininess),void 0!==t.clearcoat&&(n.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(n.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.fog&&(n.fog=t.fog),void 0!==t.flatShading&&(n.flatShading=t.flatShading),void 0!==t.blending&&(n.blending=t.blending),void 0!==t.combine&&(n.combine=t.combine),void 0!==t.side&&(n.side=t.side),void 0!==t.opacity&&(n.opacity=t.opacity),void 0!==t.transparent&&(n.transparent=t.transparent),void 0!==t.alphaTest&&(n.alphaTest=t.alphaTest),void 0!==t.depthTest&&(n.depthTest=t.depthTest),void 0!==t.depthWrite&&(n.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(n.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(n.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(n.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(n.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(n.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(n.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(n.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(n.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(n.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(n.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(n.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(n.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(n.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(n.rotation=t.rotation),1!==t.linewidth&&(n.linewidth=t.linewidth),void 0!==t.dashSize&&(n.dashSize=t.dashSize),void 0!==t.gapSize&&(n.gapSize=t.gapSize),void 0!==t.scale&&(n.scale=t.scale),void 0!==t.polygonOffset&&(n.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(n.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(n.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.skinning&&(n.skinning=t.skinning),void 0!==t.morphTargets&&(n.morphTargets=t.morphTargets),void 0!==t.morphNormals&&(n.morphNormals=t.morphNormals),void 0!==t.dithering&&(n.dithering=t.dithering),void 0!==t.vertexTangents&&(n.vertexTangents=t.vertexTangents),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.toneMapped&&(n.toneMapped=t.toneMapped),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?n.vertexColors=t.vertexColors>0:n.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(n.uniforms[e]={},r.type){case"t":n.uniforms[e].value=i(r.value);break;case"c":n.uniforms[e].value=(new Dr).setHex(r.value);break;case"v2":n.uniforms[e].value=(new rn).fromArray(r.value);break;case"v3":n.uniforms[e].value=(new fn).fromArray(r.value);break;case"v4":n.uniforms[e].value=(new un).fromArray(r.value);break;case"m3":n.uniforms[e].value=(new sn).fromArray(r.value);break;case"m4":n.uniforms[e].value=(new Hn).fromArray(r.value);break;default:n.uniforms[e].value=r.value}}if(void 0!==t.defines&&(n.defines=t.defines),void 0!==t.vertexShader&&(n.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(n.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(const e in t.extensions)n.extensions[e]=t.extensions[e];if(void 0!==t.shading&&(n.flatShading=1===t.shading),void 0!==t.size&&(n.size=t.size),void 0!==t.sizeAttenuation&&(n.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(n.map=i(t.map)),void 0!==t.matcap&&(n.matcap=i(t.matcap)),void 0!==t.alphaMap&&(n.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(n.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(n.bumpScale=t.bumpScale),void 0!==t.normalMap&&(n.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(n.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),n.normalScale=(new rn).fromArray(e)}return void 0!==t.displacementMap&&(n.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(n.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(n.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(n.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(n.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(n.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(n.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(n.specularMap=i(t.specularMap)),void 0!==t.envMap&&(n.envMap=i(t.envMap)),void 0!==t.envMapIntensity&&(n.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(n.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(n.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(n.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(n.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(n.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(n.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(n.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(n.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(n.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(n.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(n.clearcoatNormalScale=(new rn).fromArray(t.clearcoatNormalScale)),void 0!==t.transmission&&(n.transmission=t.transmission),void 0!==t.transmissionMap&&(n.transmissionMap=i(t.transmissionMap)),n},setTextures:function(t){return this.textures=t,this}});const ou=function(t){const e=t.lastIndexOf("/");return-1===e?"./":t.substr(0,e+1)};function au(){hs.call(this),this.type="InstancedBufferGeometry",this.instanceCount=1/0}function cu(t,e,i,n){"number"==typeof i&&(n=i,i=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),Hr.call(this,t,e,i),this.meshPerAttribute=n||1}function hu(t){pl.call(this,t)}function lu(t){"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),pl.call(this,t),this.options={premultiplyAlpha:"none"}}function uu(){this.type="ShapePath",this.color=new Dr,this.subPaths=[],this.currentPath=null}au.prototype=Object.assign(Object.create(hs.prototype),{constructor:au,isInstancedBufferGeometry:!0,copy:function(t){return hs.prototype.copy.call(this,t),this.instanceCount=t.instanceCount,this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){const t=hs.prototype.toJSON.call(this);return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}),cu.prototype=Object.assign(Object.create(Hr.prototype),{constructor:cu,isInstancedBufferAttribute:!0,copy:function(t){return Hr.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this},toJSON:function(){const t=Hr.prototype.toJSON.call(this);return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}),hu.prototype=Object.assign(Object.create(pl.prototype),{constructor:hu,load:function(t,e,i,n){const r=this,s=new ml(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)},parse:function(t){const e={},i={};function n(t,n){if(void 0!==e[n])return e[n];const r=t.interleavedBuffers[n],s=function(t,e){if(void 0!==i[e])return i[e];const n=t.arrayBuffers[e],r=new Uint32Array(n).buffer;return i[e]=r,r}(t,r.buffer),o=new tc(es(r.type,s),r.stride);return o.uuid=r.uuid,e[n]=o,o}const r=t.isInstancedBufferGeometry?new au:new hs,s=t.data.index;if(void 0!==s){const t=es(s.type,s.array);r.setIndex(new Hr(t,1))}const o=t.data.attributes;for(const e in o){const i=o[e];let s;if(i.isInterleavedBufferAttribute){s=new ic(n(t.data,i.data),i.itemSize,i.offset,i.normalized)}else{const t=es(i.type,i.array);s=new(i.isInstancedBufferAttribute?cu:Hr)(t,i.itemSize,i.normalized)}void 0!==i.name&&(s.name=i.name),r.setAttribute(e,s)}const a=t.data.morphAttributes;if(a)for(const e in a){const i=a[e],s=[];for(let e=0,r=i.length;e<r;e++){const r=i[e];let o;if(r.isInterleavedBufferAttribute){o=new ic(n(t.data,r.data),r.itemSize,r.offset,r.normalized)}else{o=new Hr(es(r.type,r.array),r.itemSize,r.normalized)}void 0!==r.name&&(o.name=r.name),s.push(o)}r.morphAttributes[e]=s}t.data.morphTargetsRelative&&(r.morphTargetsRelative=!0);const c=t.data.groups||t.data.drawcalls||t.data.offsets;if(void 0!==c)for(let t=0,e=c.length;t!==e;++t){const e=c[t];r.addGroup(e.start,e.count,e.materialIndex)}const h=t.data.boundingSphere;if(void 0!==h){const t=new fn;void 0!==h.center&&t.fromArray(h.center),r.boundingSphere=new On(t,h.radius)}return t.name&&(r.name=t.name),t.userData&&(r.userData=t.userData),r}}),lu.prototype=Object.assign(Object.create(pl.prototype),{constructor:lu,isImageBitmapLoader:!0,setOptions:function(t){return this.options=t,this},load:function(t,e,i,n){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=ul.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const o={};o.credentials="anonymous"===this.crossOrigin?"same-origin":"include",fetch(t,o).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,r.options)})).then((function(i){ul.add(t,i),e&&e(i),r.manager.itemEnd(t)})).catch((function(e){n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)})),r.manager.itemStart(t)}}),Object.assign(uu.prototype,{moveTo:function(t,e){return this.currentPath=new Ul,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this},lineTo:function(t,e){return this.currentPath.lineTo(t,e),this},quadraticCurveTo:function(t,e,i,n){return this.currentPath.quadraticCurveTo(t,e,i,n),this},bezierCurveTo:function(t,e,i,n,r,s){return this.currentPath.bezierCurveTo(t,e,i,n,r,s),this},splineThru:function(t){return this.currentPath.splineThru(t),this},toShapes:function(t,e){function i(t){const e=[];for(let i=0,n=t.length;i<n;i++){const n=t[i],r=new Vl;r.curves=n.curves,e.push(r)}return e}function n(t,e){const i=e.length;let n=!1;for(let r=i-1,s=0;s<i;r=s++){let i=e[r],o=e[s],a=o.x-i.x,c=o.y-i.y;if(Math.abs(c)>Number.EPSILON){if(c<0&&(i=e[s],a=-a,o=e[r],c=-c),t.y<i.y||t.y>o.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=c*(t.x-i.x)-a*(t.y-i.y);if(0===e)return!0;if(e<0)continue;n=!n}}else{if(t.y!==i.y)continue;if(o.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=o.x)return!0}}return n}const r=Rh.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return i(s);let o,a,c;const h=[];if(1===s.length)return a=s[0],c=new Vl,c.curves=a.curves,h.push(c),h;let l=!r(s[0].getPoints());l=t?!l:l;const u=[],d=[];let p,f,m=[],g=0;d[g]=void 0,m[g]=[];for(let e=0,i=s.length;e<i;e++)a=s[e],p=a.getPoints(),o=r(p),o=t?!o:o,o?(!l&&d[g]&&g++,d[g]={s:new Vl,p:p},d[g].s.curves=a.curves,l&&g++,m[g]=[]):m[g].push({h:a,p:p[0]});if(!d[0])return i(s);if(d.length>1){let t=!1;const e=[];for(let t=0,e=d.length;t<e;t++)u[t]=[];for(let i=0,r=d.length;i<r;i++){const r=m[i];for(let s=0;s<r.length;s++){const o=r[s];let a=!0;for(let r=0;r<d.length;r++)n(o.p,d[r].p)&&(i!==r&&e.push({froms:i,tos:r,hole:s}),a?(a=!1,u[r].push(o)):t=!0);a&&u[i].push(o)}}e.length>0&&(t||(m=u))}for(let t=0,e=d.length;t<e;t++){c=d[t].s,h.push(c),f=m[t];for(let t=0,e=f.length;t<e;t++)c.holes.push(f[t].h)}return h}});class du{constructor(t){Object.defineProperty(this,"isFont",{value:!0}),this.type="Font",this.data=t}generateShapes(t,e=100){const i=[],n=function(t,e,i){const n=Array.from?Array.from(t):String(t).split(""),r=e/i.resolution,s=(i.boundingBox.yMax-i.boundingBox.yMin+i.underlineThickness)*r,o=[];let a=0,c=0;for(let t=0;t<n.length;t++){const e=n[t];if("\n"===e)a=0,c-=s;else{const t=pu(e,r,a,c,i);a+=t.offsetX,o.push(t.path)}}return o}(t,e,this.data);for(let t=0,e=n.length;t<e;t++)Array.prototype.push.apply(i,n[t].toShapes());return i}}function pu(t,e,i,n,r){const s=r.glyphs[t]||r.glyphs["?"];if(!s)return void console.error('THREE.Font: character "'+t+'" does not exists in font family '+r.familyName+".");const o=new uu;let a,c,h,l,u,d,p,f;if(s.o){const t=s._cachedOutline||(s._cachedOutline=s.o.split(" "));for(let r=0,s=t.length;r<s;){switch(t[r++]){case"m":a=t[r++]*e+i,c=t[r++]*e+n,o.moveTo(a,c);break;case"l":a=t[r++]*e+i,c=t[r++]*e+n,o.lineTo(a,c);break;case"q":h=t[r++]*e+i,l=t[r++]*e+n,u=t[r++]*e+i,d=t[r++]*e+n,o.quadraticCurveTo(u,d,h,l);break;case"b":h=t[r++]*e+i,l=t[r++]*e+n,u=t[r++]*e+i,d=t[r++]*e+n,p=t[r++]*e+i,f=t[r++]*e+n,o.bezierCurveTo(u,d,p,f,h,l)}}}return{offsetX:s.ha*e,path:o}}function fu(t){pl.call(this,t)}let mu;fu.prototype=Object.assign(Object.create(pl.prototype),{constructor:fu,load:function(t,e,i,n){const r=this,s=new ml(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(t){let i;try{i=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),i=JSON.parse(t.substring(65,t.length-2))}const n=r.parse(i);e&&e(n)}),i,n)},parse:function(t){return new du(t)}});const gu=function(){return void 0===mu&&(mu=new(window.AudioContext||window.webkitAudioContext)),mu};function _u(t){pl.call(this,t)}function vu(t,e,i){ru.call(this,void 0,i);const n=(new Dr).set(t),r=(new Dr).set(e),s=new fn(n.r,n.g,n.b),o=new fn(r.r,r.g,r.b),a=Math.sqrt(Math.PI),c=a*Math.sqrt(.75);this.sh.coefficients[0].copy(s).add(o).multiplyScalar(a),this.sh.coefficients[1].copy(s).sub(o).multiplyScalar(c)}function yu(t,e){ru.call(this,void 0,e);const i=(new Dr).set(t);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}_u.prototype=Object.assign(Object.create(pl.prototype),{constructor:_u,load:function(t,e,i,n){const r=this,s=new ml(r.manager);s.setResponseType("arraybuffer"),s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(i){try{const t=i.slice(0);gu().decodeAudioData(t,(function(t){e(t)}))}catch(e){n?n(e):console.error(e),r.manager.itemError(t)}}),i,n)}}),vu.prototype=Object.assign(Object.create(ru.prototype),{constructor:vu,isHemisphereLightProbe:!0,copy:function(t){return ru.prototype.copy.call(this,t),this},toJSON:function(t){return ru.prototype.toJSON.call(this,t)}}),yu.prototype=Object.assign(Object.create(ru.prototype),{constructor:yu,isAmbientLightProbe:!0,copy:function(t){return ru.prototype.copy.call(this,t),this},toJSON:function(t){return ru.prototype.toJSON.call(this,t)}});const bu=new Hn,xu=new Hn;Object.assign(function(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Ds,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Ds,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}.prototype,{update:function(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep;const i=t.projectionMatrix.clone(),n=e.eyeSep/2,r=n*e.near/e.focus,s=e.near*Math.tan(nn.DEG2RAD*e.fov*.5)/e.zoom;let o,a;xu.elements[12]=-n,bu.elements[12]=n,o=-s*e.aspect+r,a=s*e.aspect+r,i.elements[0]=2*e.near/(a-o),i.elements[8]=(a+o)/(a-o),this.cameraL.projectionMatrix.copy(i),o=-s*e.aspect-r,a=s*e.aspect-r,i.elements[0]=2*e.near/(a-o),i.elements[8]=(a+o)/(a-o),this.cameraR.projectionMatrix.copy(i)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(xu),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(bu)}});function wu(t,e,i){let n,r,s;switch(this.binding=t,this.valueSize=i,e){case"quaternion":n=this._slerp,r=this._slerpAdditive,s=this._setAdditiveIdentityQuaternion,this.buffer=new Float64Array(6*i),this._workIndex=5;break;case"string":case"bool":n=this._select,r=this._select,s=this._setAdditiveIdentityOther,this.buffer=new Array(5*i);break;default:n=this._lerp,r=this._lerpAdditive,s=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*i)}this._mixBufferRegion=n,this._mixBufferRegionAdditive=r,this._setIdentity=s,this._origIndex=3,this._addIndex=4,this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,this.useCount=0,this.referenceCount=0}Object.assign(wu.prototype,{accumulate:function(t,e){const i=this.buffer,n=this.valueSize,r=t*n+n;let s=this.cumulativeWeight;if(0===s){for(let t=0;t!==n;++t)i[r+t]=i[t];s=e}else{s+=e;const t=e/s;this._mixBufferRegion(i,r,0,t,n)}this.cumulativeWeight=s},accumulateAdditive:function(t){const e=this.buffer,i=this.valueSize,n=i*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity(),this._mixBufferRegionAdditive(e,n,0,t,i),this.cumulativeWeightAdditive+=t},apply:function(t){const e=this.valueSize,i=this.buffer,n=t*e+e,r=this.cumulativeWeight,s=this.cumulativeWeightAdditive,o=this.binding;if(this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,r<1){const t=e*this._origIndex;this._mixBufferRegion(i,n,t,1-r,e)}s>0&&this._mixBufferRegionAdditive(i,n,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){o.setValue(i,n);break}},saveOriginalState:function(){const t=this.binding,e=this.buffer,i=this.valueSize,n=i*this._origIndex;t.getValue(e,n);for(let t=i,r=n;t!==r;++t)e[t]=e[n+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0},restoreOriginalState:function(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)},_setAdditiveIdentityNumeric:function(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i<e;i++)this.buffer[i]=0},_setAdditiveIdentityQuaternion:function(){this._setAdditiveIdentityNumeric(),this.buffer[this._addIndex*this.valueSize+3]=1},_setAdditiveIdentityOther:function(){const t=this._origIndex*this.valueSize,e=this._addIndex*this.valueSize;for(let i=0;i<this.valueSize;i++)this.buffer[e+i]=this.buffer[t+i]},_select:function(t,e,i,n,r){if(n>=.5)for(let n=0;n!==r;++n)t[e+n]=t[i+n]},_slerp:function(t,e,i,n){pn.slerpFlat(t,e,t,e,t,i,n)},_slerpAdditive:function(t,e,i,n,r){const s=this._workIndex*r;pn.multiplyQuaternionsFlat(t,s,t,e,t,i),pn.slerpFlat(t,e,t,e,t,s,n)},_lerp:function(t,e,i,n,r){const s=1-n;for(let o=0;o!==r;++o){const r=e+o;t[r]=t[r]*s+t[i+o]*n}},_lerpAdditive:function(t,e,i,n,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[i+s]*n}}});const Su="\\[\\]\\.:\\/",Mu=new RegExp("[\\[\\]\\.:\\/]","g"),Tu="[^\\[\\]\\.:\\/]",Cu="[^"+Su.replace("\\.","")+"]",Eu=/((?:WC+[\/:])*)/.source.replace("WC",Tu),Iu=/(WCOD+)?/.source.replace("WCOD",Cu),Au=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Tu),Pu=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Tu),Ru=new RegExp("^"+Eu+Iu+Au+Pu+"$"),Lu=["material","materials","bones"];function Ou(t,e,i){const n=i||Nu.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,n)}function Nu(t,e,i){this.path=e,this.parsedPath=i||Nu.parseTrackName(e),this.node=Nu.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}Object.assign(Ou.prototype,{getValue:function(t,e){this.bind();const i=this._targetGroup.nCachedObjects_,n=this._bindings[i];void 0!==n&&n.getValue(t,e)},setValue:function(t,e){const i=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=i.length;n!==r;++n)i[n].setValue(t,e)},bind:function(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].bind()},unbind:function(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].unbind()}}),Object.assign(Nu,{Composite:Ou,create:function(t,e,i){return t&&t.isAnimationObjectGroup?new Nu.Composite(t,e,i):new Nu(t,e,i)},sanitizeNodeName:function(t){return t.replace(/\s/g,"_").replace(Mu,"")},parseTrackName:function(t){const e=Ru.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const t=i.nodeName.substring(n+1);-1!==Lu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i},findNode:function(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let n=0;n<t.length;n++){const r=t[n];if(r.name===e||r.uuid===e)return r;const s=i(r.children);if(s)return s}return null},n=i(t.children);if(n)return n}return null}}),Object.assign(Nu.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(t,e){t[e]=this.node[this.propertyName]},function(t,e){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)t[e++]=i[n]},function(t,e){t[e]=this.resolvedProperty[this.propertyIndex]},function(t,e){this.resolvedProperty.toArray(t,e)}],SetterByBindingTypeAndVersioning:[[function(t,e){this.targetObject[this.propertyName]=t[e]},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=t[e++]},function(t,e){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=t[e++];this.targetObject.needsUpdate=!0},function(t,e){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty[this.propertyIndex]=t[e]},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty.fromArray(t,e)},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(t,e){this.bind(),this.getValue(t,e)},setValue:function(t,e){this.bind(),this.setValue(t,e)},bind:function(){let t=this.node;const e=this.parsedPath,i=e.objectName,n=e.propertyName;let r=e.propertyIndex;if(t||(t=Nu.findNode(this.rootNode,e.nodeName)||this.rootNode,this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!t)return void console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.");if(i){let n=e.objectIndex;switch(i){case"materials":if(!t.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!t.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);t=t.material.materials;break;case"bones":if(!t.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);t=t.skeleton.bones;for(let e=0;e<t.length;e++)if(t[e].name===n){n=e;break}break;default:if(void 0===t[i])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);t=t[i]}if(void 0!==n){if(void 0===t[n])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,t);t=t[n]}}const s=t[n];if(void 0===s){const i=e.nodeName;return void console.error("THREE.PropertyBinding: Trying to update property for track: "+i+"."+n+" but it wasn't found.",t)}let o=this.Versioning.None;this.targetObject=t,void 0!==t.needsUpdate?o=this.Versioning.NeedsUpdate:void 0!==t.matrixWorldNeedsUpdate&&(o=this.Versioning.MatrixWorldNeedsUpdate);let a=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===n){if(!t.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(!t.geometry.isBufferGeometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);if(!t.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);void 0!==t.morphTargetDictionary[r]&&(r=t.morphTargetDictionary[r])}a=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=r}else void 0!==s.fromArray&&void 0!==s.toArray?(a=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(a=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=n;this.getValue=this.GetterByBindingType[a],this.setValue=this.SetterByBindingTypeAndVersioning[a][o]},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(Nu.prototype,{_getValue_unbound:Nu.prototype.getValue,_setValue_unbound:Nu.prototype.setValue}),Object.assign(function(){this.uuid=nn.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;const t={};this._indicesByUUID=t;for(let e=0,i=arguments.length;e!==i;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};const e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}.prototype,{isAnimationObjectGroup:!0,add:function(){const t=this._objects,e=this._indicesByUUID,i=this._paths,n=this._parsedPaths,r=this._bindings,s=r.length;let o,a=t.length,c=this.nCachedObjects_;for(let h=0,l=arguments.length;h!==l;++h){const l=arguments[h],u=l.uuid;let d=e[u];if(void 0===d){d=a++,e[u]=d,t.push(l);for(let t=0,e=s;t!==e;++t)r[t].push(new Nu(l,i[t],n[t]))}else if(d<c){o=t[d];const a=--c,h=t[a];e[h.uuid]=d,t[d]=h,e[u]=a,t[a]=l;for(let t=0,e=s;t!==e;++t){const e=r[t],s=e[a];let o=e[d];e[d]=s,void 0===o&&(o=new Nu(l,i[t],n[t])),e[a]=o}}else t[d]!==o&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=c},remove:function(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,n=i.length;let r=this.nCachedObjects_;for(let s=0,o=arguments.length;s!==o;++s){const o=arguments[s],a=o.uuid,c=e[a];if(void 0!==c&&c>=r){const s=r++,h=t[s];e[h.uuid]=c,t[c]=h,e[a]=s,t[s]=o;for(let t=0,e=n;t!==e;++t){const e=i[t],n=e[s],r=e[c];e[c]=n,e[s]=r}}}this.nCachedObjects_=r},uncache:function(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,n=i.length;let r=this.nCachedObjects_,s=t.length;for(let o=0,a=arguments.length;o!==a;++o){const a=arguments[o].uuid,c=e[a];if(void 0!==c)if(delete e[a],c<r){const o=--r,a=t[o],h=--s,l=t[h];e[a.uuid]=c,t[c]=a,e[l.uuid]=o,t[o]=l,t.pop();for(let t=0,e=n;t!==e;++t){const e=i[t],n=e[o],r=e[h];e[c]=n,e[o]=r,e.pop()}}else{const r=--s,o=t[r];r>0&&(e[o.uuid]=c),t[c]=o,t.pop();for(let t=0,e=n;t!==e;++t){const e=i[t];e[c]=e[r],e.pop()}}}this.nCachedObjects_=r},subscribe_:function(t,e){const i=this._bindingsIndicesByPath;let n=i[t];const r=this._bindings;if(void 0!==n)return r[n];const s=this._paths,o=this._parsedPaths,a=this._objects,c=a.length,h=this.nCachedObjects_,l=new Array(c);n=r.length,i[t]=n,s.push(t),o.push(e),r.push(l);for(let i=h,n=a.length;i!==n;++i){const n=a[i];l[i]=new Nu(n,t,e)}return l},unsubscribe_:function(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const n=this._paths,r=this._parsedPaths,s=this._bindings,o=s.length-1,a=s[o];e[t[o]]=i,s[i]=a,s.pop(),r[i]=r[o],r.pop(),n[i]=n[o],n.pop()}}});class Du{constructor(t,e,i=null,n=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=n;const r=e.tracks,s=r.length,o=new Array(s),a={endingStart:Vi,endingEnd:Vi};for(let t=0;t!==s;++t){const e=r[t].createInterpolant(null);o[t]=e,e.settings=a}this._interpolantSettings=a,this._interpolants=o,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i){if(t.fadeOut(e),this.fadeIn(e),i){const i=this._clip.duration,n=t._clip.duration,r=n/i,s=i/n;t.warp(1,r,e),this.warp(s,1,e)}return this}crossFadeTo(t,e,i){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const n=this._mixer,r=n.time,s=this.timeScale;let o=this._timeScaleInterpolant;null===o&&(o=n._lendControlInterpolant(),this._timeScaleInterpolant=o);const a=o.parameterPositions,c=o.sampleValues;return a[0]=r,a[1]=r+i,c[0]=t/s,c[1]=e/s,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,n){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const n=(t-r)*i;if(n<0||0===i)return;this._startTime=null,e=i*n}e*=this._updateTimeScale(t);const s=this._updateTime(e),o=this._updateWeight(t);if(o>0){const t=this._interpolants,e=this._propertyBindings;switch(this.blendMode){case 2501:for(let i=0,n=t.length;i!==n;++i)t[i].evaluate(s),e[i].accumulateAdditive(o);break;case Wi:default:for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(s),e[i].accumulate(n,o)}}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let n=this.time+t,r=this._loopCount;const s=2202===i;if(0===t)return-1===r?n:s&&1==(1&r)?e-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(n>=e)n=e;else{if(!(n<0)){this.time=n;break t}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=e||n<0){const i=Math.floor(n/e);n-=e*i,r+=Math.abs(i);const o=this.repetitions-r;if(o<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=t>0?e:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===o){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return e-n}return n}_setEndings(t,e,i){const n=this._interpolantSettings;i?(n.endingStart=Gi,n.endingEnd=Gi):(n.endingStart=t?this.zeroSlopeAtStart?Gi:Vi:qi,n.endingEnd=e?this.zeroSlopeAtEnd?Gi:Vi:qi)}_scheduleFading(t,e,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const o=s.parameterPositions,a=s.sampleValues;return o[0]=r,a[0]=e,o[1]=r+t,a[1]=i,this}}function $u(t){this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}$u.prototype=Object.assign(Object.create(Qi.prototype),{constructor:$u,_bindAction:function(t,e){const i=t._localRoot||this._root,n=t._clip.tracks,r=n.length,s=t._propertyBindings,o=t._interpolants,a=i.uuid,c=this._bindingsByRootAndName;let h=c[a];void 0===h&&(h={},c[a]=h);for(let t=0;t!==r;++t){const r=n[t],c=r.name;let l=h[c];if(void 0!==l)s[t]=l;else{if(l=s[t],void 0!==l){null===l._cacheIndex&&(++l.referenceCount,this._addInactiveBinding(l,a,c));continue}const n=e&&e._propertyBindings[t].binding.parsedPath;l=new wu(Nu.create(i,c,n),r.ValueTypeName,r.getValueSize()),++l.referenceCount,this._addInactiveBinding(l,a,c),s[t]=l}o[t].resultBuffer=l.buffer}},_activateAction:function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,n=this._actionsByClip[i];this._bindAction(t,n&&n.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}},_deactivateAction:function(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},_isActiveAction:function(t){const e=t._cacheIndex;return null!==e&&e<this._nActiveActions},_addInactiveAction:function(t,e,i){const n=this._actions,r=this._actionsByClip;let s=r[e];if(void 0===s)s={knownActions:[t],actionByRoot:{}},t._byClipCacheIndex=0,r[e]=s;else{const e=s.knownActions;t._byClipCacheIndex=e.length,e.push(t)}t._cacheIndex=n.length,n.push(t),s.actionByRoot[i]=t},_removeInactiveAction:function(t){const e=this._actions,i=e[e.length-1],n=t._cacheIndex;i._cacheIndex=n,e[n]=i,e.pop(),t._cacheIndex=null;const r=t._clip.uuid,s=this._actionsByClip,o=s[r],a=o.knownActions,c=a[a.length-1],h=t._byClipCacheIndex;c._byClipCacheIndex=h,a[h]=c,a.pop(),t._byClipCacheIndex=null;delete o.actionByRoot[(t._localRoot||this._root).uuid],0===a.length&&delete s[r],this._removeInactiveBindingsForAction(t)},_removeInactiveBindingsForAction:function(t){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.referenceCount&&this._removeInactiveBinding(i)}},_lendAction:function(t){const e=this._actions,i=t._cacheIndex,n=this._nActiveActions++,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_takeBackAction:function(t){const e=this._actions,i=t._cacheIndex,n=--this._nActiveActions,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_addInactiveBinding:function(t,e,i){const n=this._bindingsByRootAndName,r=this._bindings;let s=n[e];void 0===s&&(s={},n[e]=s),s[i]=t,t._cacheIndex=r.length,r.push(t)},_removeInactiveBinding:function(t){const e=this._bindings,i=t.binding,n=i.rootNode.uuid,r=i.path,s=this._bindingsByRootAndName,o=s[n],a=e[e.length-1],c=t._cacheIndex;a._cacheIndex=c,e[c]=a,e.pop(),delete o[r],0===Object.keys(o).length&&delete s[n]},_lendBinding:function(t){const e=this._bindings,i=t._cacheIndex,n=this._nActiveBindings++,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_takeBackBinding:function(t){const e=this._bindings,i=t._cacheIndex,n=--this._nActiveBindings,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_lendControlInterpolant:function(){const t=this._controlInterpolants,e=this._nActiveControlInterpolants++;let i=t[e];return void 0===i&&(i=new Qh(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),i.__cacheIndex=e,t[e]=i),i},_takeBackControlInterpolant:function(t){const e=this._controlInterpolants,i=t.__cacheIndex,n=--this._nActiveControlInterpolants,r=e[n];t.__cacheIndex=n,e[n]=t,r.__cacheIndex=i,e[i]=r},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(t,e,i){const n=e||this._root,r=n.uuid;let s="string"==typeof t?hl.findByName(n,t):t;const o=null!==s?s.uuid:t,a=this._actionsByClip[o];let c=null;if(void 0===i&&(i=null!==s?s.blendMode:Wi),void 0!==a){const t=a.actionByRoot[r];if(void 0!==t&&t.blendMode===i)return t;c=a.knownActions[0],null===s&&(s=c._clip)}if(null===s)return null;const h=new Du(this,s,e,i);return this._bindAction(h,c),this._addInactiveAction(h,o,r),h},existingAction:function(t,e){const i=e||this._root,n=i.uuid,r="string"==typeof t?hl.findByName(i,t):t,s=r?r.uuid:t,o=this._actionsByClip[s];return void 0!==o&&o.actionByRoot[n]||null},stopAllAction:function(){const t=this._actions;for(let e=this._nActiveActions-1;e>=0;--e)t[e].stop();return this},update:function(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let o=0;o!==i;++o){e[o]._update(n,t,r,s)}const o=this._bindings,a=this._nActiveBindings;for(let t=0;t!==a;++t)o[t].apply(s);return this},setTime:function(t){this.time=0;for(let t=0;t<this._actions.length;t++)this._actions[t].time=0;return this.update(t)},getRoot:function(){return this._root},uncacheClip:function(t){const e=this._actions,i=t.uuid,n=this._actionsByClip,r=n[i];if(void 0!==r){const t=r.knownActions;for(let i=0,n=t.length;i!==n;++i){const n=t[i];this._deactivateAction(n);const r=n._cacheIndex,s=e[e.length-1];n._cacheIndex=null,n._byClipCacheIndex=null,s._cacheIndex=r,e[r]=s,e.pop(),this._removeInactiveBindingsForAction(n)}delete n[i]}},uncacheRoot:function(t){const e=t.uuid,i=this._actionsByClip;for(const t in i){const n=i[t].actionByRoot[e];void 0!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}const n=this._bindingsByRootAndName[e];if(void 0!==n)for(const t in n){const e=n[t];e.restoreOriginalState(),this._removeInactiveBinding(e)}},uncacheAction:function(t,e){const i=this.existingAction(t,e);null!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}});class ku{constructor(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}clone(){return new ku(void 0===this.value.clone?this.value:this.value.clone())}}function zu(t,e,i){tc.call(this,t,e),this.meshPerAttribute=i||1}function Fu(t,e,i,n,r){this.buffer=t,this.type=e,this.itemSize=i,this.elementSize=n,this.count=r,this.version=0}function Bu(t,e,i,n){this.ray=new jn(t,e),this.near=i||0,this.far=n||1/0,this.camera=null,this.layers=new Qn,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function ju(t,e){return t.distance-e.distance}function Hu(t,e,i,n){if(t.layers.test(e.layers)&&t.raycast(e,i),!0===n){const n=t.children;for(let t=0,r=n.length;t<r;t++)Hu(n[t],e,i,!0)}}zu.prototype=Object.assign(Object.create(tc.prototype),{constructor:zu,isInstancedInterleavedBuffer:!0,copy:function(t){return tc.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this},clone:function(t){const e=tc.prototype.clone.call(this,t);return e.meshPerAttribute=this.meshPerAttribute,e},toJSON:function(t){const e=tc.prototype.toJSON.call(this,t);return e.isInstancedInterleavedBuffer=!0,e.meshPerAttribute=this.meshPerAttribute,e}}),Object.defineProperty(Fu.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Fu.prototype,{isGLBufferAttribute:!0,setBuffer:function(t){return this.buffer=t,this},setType:function(t,e){return this.type=t,this.elementSize=e,this},setItemSize:function(t){return this.itemSize=t,this},setCount:function(t){return this.count=t,this}}),Object.assign(Bu.prototype,{set:function(t,e){this.ray.set(t,e)},setFromCamera:function(t,e){e&&e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize(),this.camera=e):e&&e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld),this.camera=e):console.error("THREE.Raycaster: Unsupported camera type: "+e.type)},intersectObject:function(t,e,i){const n=i||[];return Hu(t,this,n,e),n.sort(ju),n},intersectObjects:function(t,e,i){const n=i||[];if(!1===Array.isArray(t))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),n;for(let i=0,r=t.length;i<r;i++)Hu(t[i],this,n,e);return n.sort(ju),n}});const Uu=new rn;function Vu(t){pr.call(this),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}Vu.prototype=Object.create(pr.prototype),Vu.prototype.constructor=Vu,Vu.prototype.isImmediateRenderObject=!0;const Gu=new Fr({side:1,depthWrite:!1,depthTest:!1});function qu(t){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),Pl.call(this,t),this.type="catmullrom"}new Es(new As,Gu),wl.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(wl.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Object.assign(Ul.prototype,{fromPoints:function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)}}),qu.prototype=Object.create(Pl.prototype),Object.assign(qu.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),Object.assign(pl.prototype,{extractUrlBase:function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),ou(t)}}),pl.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},Object.assign(class{constructor(t,e){Object.defineProperty(this,"isBox2",{value:!0}),this.min=void 0!==t?t:new rn(1/0,1/0),this.max=void 0!==e?e:new rn(-1/0,-1/0)}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromPoints(t){this.makeEmpty();for(let e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const i=Uu.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y}getCenter(t){return void 0===t&&(console.warn("THREE.Box2: .getCenter() target is now required"),t=new rn),this.isEmpty()?t.set(0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box2: .getSize() target is now required"),t=new rn),this.isEmpty()?t.set(0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new rn),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y)}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new rn),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Uu.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}.prototype,{center:function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},size:function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)}}),Object.assign(_n.prototype,{center:function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionSphere:function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},size:function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)}}),Object.assign(On.prototype,{empty:function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()}}),Us.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},Object.assign(nn,{random16:function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},nearestPowerOfTwo:function(t){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),nn.floorPowerOfTwo(t)},nextPowerOfTwo:function(t){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),nn.ceilPowerOfTwo(t)}}),Object.assign(sn.prototype,{flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},multiplyVector3:function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},getInverse:function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()}}),Object.assign(Hn.prototype,{extractPosition:function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},getPosition:function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new fn).setFromMatrixColumn(this,3)},setRotationFromQuaternion:function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector4:function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},crossVector:function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(t,e,i,n,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,n,i,r,s)},getInverse:function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()}}),_r.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},Object.assign(pn.prototype,{multiplyVector3:function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},inverse:function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()}}),Object.assign(jn.prototype,{isIntersectionBox:function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionPlane:function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},isIntersectionSphere:function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)}}),Object.assign(Ir.prototype,{area:function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},barycoordFromPoint:function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},midpoint:function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},normal:function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},plane:function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)}}),Object.assign(Ir,{barycoordFromPoint:function(t,e,i,n,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Ir.getBarycoord(t,e,i,n,r)},normal:function(t,e,i,n){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Ir.getNormal(t,e,i,n)}}),Object.assign(Vl.prototype,{extractAllPoints:function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},extrude:function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new Nh(this,t)},makeGeometry:function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new kh(this,t)}}),Object.assign(rn.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(fn.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},getScaleFromMatrix:function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},getColumnFromMatrix:function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},applyProjection:function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},fromAttribute:function(t,e,i){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(un.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},lengthManhattan:function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(pr.prototype,{getChildByName:function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)}}),Object.defineProperties(pr.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.assign(Es.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}),Object.defineProperties(Es.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),Object.defineProperties(xc.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(Rc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Ec.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Object.defineProperty(wl.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(t){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=t}}),Ds.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Gl.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(Hr.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===Ji},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(Ji)}}}),Object.assign(Hr.prototype,{setDynamic:function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?Ji:Zi),this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(hs.prototype,{addIndex:function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},addAttribute:function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new Hr(arguments[1],arguments[2])))},addDrawCall:function(t,e,i){void 0!==i&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},applyMatrix:function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)}}),Object.defineProperties(hs.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(au.prototype,{maxInstancedCount:{get:function(){return console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."),this.instanceCount},set:function(t){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."),this.instanceCount=t}}}),Object.defineProperties(Bu.prototype,{linePrecision:{get:function(){return console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold},set:function(t){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold=t}}}),Object.defineProperties(tc.prototype,{dynamic:{get:function(){return console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.usage===Ji},set:function(t){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.setUsage(t)}}}),Object.assign(tc.prototype,{setDynamic:function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?Ji:Zi),this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(Nh.prototype,{getArrays:function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")}}),Object.assign(Qa.prototype,{dispose:function(){console.error("THREE.Scene: .dispose() has been removed.")}}),Object.defineProperties(ku.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(zr.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new Dr}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Uh.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(Hh.prototype,{transparency:{get:function(){return console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."),this.transmission},set:function(t){console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."),this.transmission=t}}}),Object.defineProperties(Os.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),Object.assign(Ja.prototype,{clearTarget:function(t,e,i,n){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,i,n)},animate:function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},getMaxAnisotropy:function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},getPrecision:function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},resetGLState:function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()}}),Object.defineProperties(Ja.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?3001:Xi}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(Ha.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(dn.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Object.defineProperties(class extends pr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(){if(!1!==this.hasPlaybackControl)return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t<e;t++)this.filters[t-1].connect(this.filters[t]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this._connected=!0,this}disconnect(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t<e;t++)this.filters[t-1].disconnect(this.filters[t]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this._connected=!1,this}getFilters(){return this.filters}setFilters(t){return t||(t=[]),!0===this._connected?(this.disconnect(),this.filters=t.slice(),this.connect()):this.filters=t.slice(),this}setDetune(t){if(this.detune=t,void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this}getDetune(){return this.detune}getFilter(){return this.getFilters()[0]}setFilter(t){return this.setFilters(t?[t]:[])}setPlaybackRate(t){if(!1!==this.hasPlaybackControl)return this.playbackRate=t,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")}getPlaybackRate(){return this.playbackRate}onEnded(){this.isPlaying=!1}getLoop(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop}setLoop(t){if(!1!==this.hasPlaybackControl)return this.loop=t,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")}setLoopStart(t){return this.loopStart=t,this}setLoopEnd(t){return this.loopEnd=t,this}getVolume(){return this.gain.gain.value}setVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}}.prototype,{load:{value:function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return(new _u).load(t,(function(t){e.setBuffer(t)})),this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}}),ks.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},ks.prototype.clear=function(t,e,i,n){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,i,n)},an.crossOrigin=void 0,an.loadTexture=function(t,e,i,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new xl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,i,void 0,n);return e&&(s.mapping=e),s},an.loadTextureCube=function(t,e,i,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new yl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,i,void 0,n);return e&&(s.mapping=e),s},an.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},an.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"125"}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__="125");const Wu=Math.PI/180,Xu=180/Math.PI,Yu=6378137,Zu=6356752.31424518;function Ju(t,e,i,n,r,s){const o=Qu(t,e,i);return function(t,e,i,n,r,s){const o=Qu(n,r,s),a=[t-o[0],e-o[1],i-o[2]];n*=Wu,r*=Wu;const c=Math.cos(n),h=Math.sin(n),l=Math.cos(r),u=Math.sin(r),d=-h*a[0]+c*a[1],p=-u*c*a[0]-u*h*a[1]+l*a[2],f=l*c*a[0]+l*h*a[1]+u*a[2];return[d,p,f]}(o[0],o[1],o[2],n,r,s)}function Ku(t,e,i,n,r,s){const o=function(t,e,i,n,r,s){const o=Qu(n,r,s);n*=Wu,r*=Wu;const a=Math.cos(n),c=Math.sin(n),h=Math.cos(r),l=Math.sin(r),u=-c*t-l*a*e+h*a*i+o[0],d=a*t-l*c*e+h*c*i+o[1],p=h*e+l*i+o[2];return[u,d,p]}(t,e,i,n,r,s);return function(t,e,i){const n=Yu,r=Zu,s=n*n,o=r*r,a=s-o,c=Math.sqrt(a/s),h=Math.sqrt(a/o),l=Math.sqrt(t*t+e*e),u=Math.atan2(i*n,l*r),d=Math.sin(u),p=Math.cos(u),f=Math.atan2(e,t),m=Math.atan2(i+h*h*r*d*d*d,l-c*c*n*p*p*p),g=Math.sin(m),_=Math.cos(m),v=n/Math.sqrt(1-c*c*g*g);return[f*Xu,m*Xu,l/_-v]}(o[0],o[1],o[2])}function Qu(t,e,i){const n=Yu,r=Zu;t*=Wu,e*=Wu;const s=Math.cos(t),o=Math.sin(t),a=Math.cos(e),c=Math.sin(e),h=n*n,l=r*r,u=1/Math.sqrt(h*a*a+l*c*c),d=(h*u+i)*a;return[d*s,d*o,(l*u+i)*c]}class td{boundingBoxCorners(t,e){const i=Ku(-e,-e,0,t.lng,t.lat,0),n=Ku(e,e,0,t.lng,t.lat,0);return[{lat:i[1],lng:i[0]},{lat:n[1],lng:n[0]}]}rotationFromCompass(t,e){let i=0,n=0,r=0;switch(e){case 1:i=Math.PI/2;break;case 3:i=-Math.PI/2,r=Math.PI;break;case 6:n=-Math.PI/2,r=-Math.PI/2;break;case 8:n=Math.PI/2,r=Math.PI/2}const s=(new Hn).makeRotationZ(r),o=new Zn(i,n,t*Math.PI/180,"XYZ"),a=(new Hn).makeRotationFromEuler(o),c=(new un).setAxisAngleFromRotationMatrix(a.multiply(s));return c.multiplyScalar(c.w).toArray().slice(0,3)}}class ed{constructor(t){if(!t)throw new Error(`Incorrect core image data ${t}`);this._cache=null,this._core=t,this._spatial=null}get assetsCached(){return null!=this._core&&null!=this._spatial&&null!=this._cache&&null!=this._cache.image&&null!=this._cache.mesh}get cameraParameters(){return this._spatial.camera_parameters}get cameraType(){return this._spatial.camera_type}get capturedAt(){return this._spatial.captured_at}get clusterId(){return this._spatial.cluster?this._spatial.cluster.id:null}get clusterUrl(){return this._spatial.cluster?this._spatial.cluster.url:null}get compassAngle(){return null!=this._spatial.computed_compass_angle?this._spatial.computed_compass_angle:this._spatial.compass_angle}get complete(){return null!=this._spatial}get computedAltitude(){return this._spatial.computed_altitude}get computedCompassAngle(){return this._spatial.computed_compass_angle}get computedLngLat(){return this._core.computed_geometry}get creatorId(){return this._spatial.creator.id}get creatorUsername(){return this._spatial.creator.username}get exifOrientation(){return this._spatial.exif_orientation}get height(){return this._spatial.height}get image(){return this._cache.image}get image$(){return this._cache.image$}get id(){return this._core.id}get lngLat(){return null!=this._core.computed_geometry?this._core.computed_geometry:this._core.geometry}get merged(){return null!=this._spatial&&null!=this._spatial.merge_id}get mergeId(){return this._spatial.merge_id}get mesh(){return this._cache.mesh}get originalAltitude(){return this._spatial.altitude}get originalCompassAngle(){return this._spatial.compass_angle}get originalLngLat(){return this._core.geometry}get ownerId(){return this._spatial.owner?this._spatial.owner.id:null}get private(){return this._spatial.private}get qualityScore(){return this._spatial.quality_score}get rotation(){return this._spatial.computed_rotation}get scale(){return this._spatial.atomic_scale}get sequenceId(){return this._core.sequence?this._core.sequence.id:null}get sequenceEdges(){return this._cache.sequenceEdges}get sequenceEdges$(){return this._cache.sequenceEdges$}get spatialEdges(){return this._cache.spatialEdges}get spatialEdges$(){return this._cache.spatialEdges$}get width(){return this._spatial.width}cacheAssets$(){return this._cache.cacheAssets$(this._spatial,this.merged).pipe(rt((()=>this)))}cacheImage$(){return this._cache.cacheImage$(this._spatial).pipe(rt((()=>this)))}cacheSequenceEdges(t){this._cache.cacheSequenceEdges(t)}cacheSpatialEdges(t){this._cache.cacheSpatialEdges(t)}dispose(){null!=this._cache&&(this._cache.dispose(),this._cache=null),this._core=null,this._spatial=null}initializeCache(t){if(null!=this._cache)throw new Error(`Image cache already initialized (${this.id}).`);this._cache=t}makeComplete(t){if(null==t)throw new Error("Fill can not be null.");this._spatial=t}resetSequenceEdges(){this._cache.resetSequenceEdges()}resetSpatialEdges(){this._cache.resetSpatialEdges()}uncache(){null!=this._cache&&(this._cache.dispose(),this._cache=null)}}class id{constructor(t){this._disposed=!1,this._provider=t,this._image=null,this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._imageChanged$=new T,this._image$=this._imageChanged$.pipe(ni(null),Ue(1),E()),this._iamgeSubscription=this._image$.subscribe(),this._sequenceEdgesChanged$=new T,this._sequenceEdges$=this._sequenceEdgesChanged$.pipe(ni(this._sequenceEdges),Ue(1),E()),this._sequenceEdgesSubscription=this._sequenceEdges$.subscribe((()=>{})),this._spatialEdgesChanged$=new T,this._spatialEdges$=this._spatialEdgesChanged$.pipe(ni(this._spatialEdges),Ue(1),E()),this._spatialEdgesSubscription=this._spatialEdges$.subscribe((()=>{})),this._cachingAssets$=null}get image(){return this._image}get image$(){return this._image$}get mesh(){return this._mesh}get sequenceEdges(){return this._sequenceEdges}get sequenceEdges$(){return this._sequenceEdges$}get spatialEdges(){return this._spatialEdges}get spatialEdges$(){return this._spatialEdges$}cacheAssets$(t,e){return null!=this._cachingAssets$||(this._cachingAssets$=gt(this._cacheImage$(t),this._cacheMesh$(t,e)).pipe(rt((([t,e])=>(this._image=t,this._mesh=e,this))),Me((()=>{this._cachingAssets$=null})),Ue(1),E()),this._cachingAssets$.pipe(Ee((t=>!!t._image))).subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{}))),this._cachingAssets$}cacheImage$(t){if(null!=this._image)return G(this);const e=this._cacheImage$(t).pipe(Ee((t=>!!t)),pi((t=>{this._disposeImage(),this._image=t})),rt((()=>this)),Ue(1),E());return e.subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{})),e}cacheSequenceEdges(t){this._sequenceEdges={cached:!0,edges:t},this._sequenceEdgesChanged$.next(this._sequenceEdges)}cacheSpatialEdges(t){this._spatialEdges={cached:!0,edges:t},this._spatialEdgesChanged$.next(this._spatialEdges)}dispose(){this._iamgeSubscription.unsubscribe(),this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._disposeImage(),this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._imageChanged$.next(null),this._sequenceEdgesChanged$.next(this._sequenceEdges),this._spatialEdgesChanged$.next(this._spatialEdges),this._disposed=!0,null!=this._imageAborter&&(this._imageAborter(),this._imageAborter=null),null!=this._meshAborter&&(this._meshAborter(),this._meshAborter=null)}resetSequenceEdges(){this._sequenceEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges)}resetSpatialEdges(){this._spatialEdges={cached:!1,edges:[]},this._spatialEdgesChanged$.next(this._spatialEdges)}_cacheImage$(t){return b.create((e=>{const i=new Promise(((t,e)=>{this._imageAborter=e})),n=t.thumb.url;if(n)this._provider.getImageBuffer(n,i).then((t=>{this._imageAborter=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{if(this._disposed){window.URL.revokeObjectURL(i.src);const t=`Image load was aborted (${n})`;e.error(new Error(t))}else e.next(i),e.complete()},i.onerror=()=>{this._imageAborter=null,e.error(new Error(`Failed to load image (${n})`))};const r=new Blob([t]);i.src=window.URL.createObjectURL(r)}),(t=>{this._imageAborter=null,e.error(t)}));else{const i=t.thumb.id,r=`Incorrect thumb URL for ${t.id} (${i}, ${n})`;e.error(new Error(r))}}))}_cacheMesh$(t,e){return b.create((i=>{if(!e)return i.next(this._createEmptyMesh()),void i.complete();const n=t.mesh.url;if(!n){const e=t.mesh.id,r=`Incorrect mesh URL for ${t.id} (${e}, ${n})`;return console.warn(r),i.next(this._createEmptyMesh()),void i.complete()}const r=new Promise(((t,e)=>{this._meshAborter=e}));this._provider.getMesh(n,r).then((t=>{this._meshAborter=null,this._disposed||(i.next(t),i.complete())}),(t=>{this._meshAborter=null,console.error(t),i.next(this._createEmptyMesh()),i.complete()}))}))}_createEmptyMesh(){return{faces:[],vertices:[]}}_disposeImage(){null!=this._image&&window.URL.revokeObjectURL(this._image.src),this._image=null}}class nd{constructor(t){this._id=t.id,this._imageIds=t.image_ids}get id(){return this._id}get imageIds(){return this._imageIds}dispose(){this._id=null,this._imageIds=null}findNext(t){let e=this._imageIds.indexOf(t);return e+1>=this._imageIds.length||-1===e?null:this._imageIds[e+1]}findPrev(t){let e=this._imageIds.indexOf(t);return 0===e||-1===e?null:this._imageIds[e-1]}}class rd{constructor(){this.sphericalPreferredDistance=2,this.sphericalMotion=2,this.sphericalSequencePenalty=1,this.sphericalMergeCCPenalty=4,this.stepPreferredDistance=4,this.stepMotion=3,this.stepRotation=4,this.stepSequencePenalty=2,this.stepMergeCCPenalty=6,this.similarDistance=2,this.similarRotation=3,this.turnDistance=4,this.turnMotion=2,this.turnSequencePenalty=1,this.turnMergeCCPenalty=4}}var sd;t.NavigationDirection=void 0,(sd=t.NavigationDirection||(t.NavigationDirection={}))[sd.Next=0]="Next",sd[sd.Prev=1]="Prev",sd[sd.StepLeft=2]="StepLeft",sd[sd.StepRight=3]="StepRight",sd[sd.StepForward=4]="StepForward",sd[sd.StepBackward=5]="StepBackward",sd[sd.TurnLeft=6]="TurnLeft",sd[sd.TurnRight=7]="TurnRight",sd[sd.TurnU=8]="TurnU",sd[sd.Spherical=9]="Spherical",sd[sd.Similar=10]="Similar";class od{constructor(){this.steps={},this.turns={},this.spherical={},this.steps[t.NavigationDirection.StepForward]={direction:t.NavigationDirection.StepForward,motionChange:0,useFallback:!0},this.steps[t.NavigationDirection.StepBackward]={direction:t.NavigationDirection.StepBackward,motionChange:Math.PI,useFallback:!0},this.steps[t.NavigationDirection.StepLeft]={direction:t.NavigationDirection.StepLeft,motionChange:Math.PI/2,useFallback:!1},this.steps[t.NavigationDirection.StepRight]={direction:t.NavigationDirection.StepRight,motionChange:-Math.PI/2,useFallback:!1},this.turns[t.NavigationDirection.TurnLeft]={direction:t.NavigationDirection.TurnLeft,directionChange:Math.PI/2,motionChange:Math.PI/4},this.turns[t.NavigationDirection.TurnRight]={direction:t.NavigationDirection.TurnRight,directionChange:-Math.PI/2,motionChange:-Math.PI/4},this.turns[t.NavigationDirection.TurnU]={direction:t.NavigationDirection.TurnU,directionChange:Math.PI,motionChange:null},this.spherical[t.NavigationDirection.StepForward]={direction:t.NavigationDirection.StepForward,directionChange:0,next:t.NavigationDirection.StepLeft,prev:t.NavigationDirection.StepRight},this.spherical[t.NavigationDirection.StepBackward]={direction:t.NavigationDirection.StepBackward,directionChange:Math.PI,next:t.NavigationDirection.StepRight,prev:t.NavigationDirection.StepLeft},this.spherical[t.NavigationDirection.StepLeft]={direction:t.NavigationDirection.StepLeft,directionChange:Math.PI/2,next:t.NavigationDirection.StepBackward,prev:t.NavigationDirection.StepForward},this.spherical[t.NavigationDirection.StepRight]={direction:t.NavigationDirection.StepRight,directionChange:-Math.PI/2,next:t.NavigationDirection.StepForward,prev:t.NavigationDirection.StepBackward}}}class ad{constructor(){this.sphericalMinDistance=.1,this.sphericalMaxDistance=20,this.sphericalPreferredDistance=5,this.sphericalMaxItems=4,this.sphericalMaxStepTurnChange=Math.PI/8,this.rotationMaxDistance=this.turnMaxRigDistance,this.rotationMaxDirectionChange=Math.PI/6,this.rotationMaxVerticalDirectionChange=Math.PI/8,this.similarMaxDirectionChange=Math.PI/8,this.similarMaxDistance=12,this.similarMinTimeDifference=432e5,this.stepMaxDistance=20,this.stepMaxDirectionChange=Math.PI/6,this.stepMaxDrift=Math.PI/6,this.stepPreferredDistance=4,this.turnMaxDistance=15,this.turnMaxDirectionChange=2*Math.PI/9,this.turnMaxRigDistance=.65,this.turnMinRigDirectionChange=Math.PI/6}get maxDistance(){return Math.max(this.sphericalMaxDistance,this.similarMaxDistance,this.stepMaxDistance,this.turnMaxDistance)}}class cd extends Error{constructor(t){super(t),Object.setPrototypeOf(this,cd.prototype),this.name="MapillaryError"}}class hd extends cd{constructor(t){super(null!=t?t:"The argument is not valid."),Object.setPrototypeOf(this,hd.prototype),this.name="ArgumentMapillaryError"}}class ld{constructor(){this._epsilon=1e-9}azimuthalToBearing(t){return-t+Math.PI/2}degToRad(t){return Math.PI*t/180}radToDeg(t){return 180*t/Math.PI}rotationMatrix(t){let e=new fn(t[0],t[1],t[2]),i=e.length();return i>0&&e.normalize(),(new Hn).makeRotationAxis(e,i)}rotate(t,e){let i=new fn(t[0],t[1],t[2]),n=this.rotationMatrix(e);return i.applyMatrix4(n),i}opticalCenter(t,e){let i=[-t[0],-t[1],-t[2]],n=[-e[0],-e[1],-e[2]];return this.rotate(n,i)}viewingDirection(t){let e=[-t[0],-t[1],-t[2]];return this.rotate([0,0,1],e)}wrap(t,e,i){if(i<e)throw new Error("Invalid arguments: max must be larger than min.");let n=i-e;for(;t>i||t<e;)t>i?t-=n:t<e&&(t+=n);return t}wrapAngle(t){return this.wrap(t,-Math.PI,Math.PI)}clamp(t,e,i){return t<e?e:t>i?i:t}angleBetweenVector2(t,e,i,n){let r=Math.atan2(n,i)-Math.atan2(e,t);return this.wrapAngle(r)}angleDifference(t,e){let i=e-t;return this.wrapAngle(i)}relativeRotationAngle(t,e){let i=this.rotationMatrix([-t[0],-t[1],-t[2]]),n=this.rotationMatrix(e),r=i.multiply(n).elements,s=r[0]+r[5]+r[10];return Math.acos(Math.max(Math.min((s-1)/2,1),-1))}angleToPlane(t,e){let i=(new fn).fromArray(t),n=i.length();if(n<this._epsilon)return 0;let r=i.dot((new fn).fromArray(e));return Math.asin(r/n)}azimuthal(t,e){const i=(new fn).fromArray(t),n=(new fn).fromArray(e),r=i.clone().dot(n),s=i.clone().sub(n.clone().multiplyScalar(r));return Math.atan2(s.y,s.x)}distanceFromLngLat(t,e,i,n){let r=this.degToRad(n-e),s=this.degToRad(i-t),o=Math.sin(r/2)*Math.sin(r/2)+Math.cos(this.degToRad(e))*Math.cos(this.degToRad(n))*Math.sin(s/2)*Math.sin(s/2);return 12742e3*Math.atan2(Math.sqrt(o),Math.sqrt(1-o))}}const ud=new ld;function dd(t){return"spherical"===t}function pd(t){return"fisheye"===t}function fd(t,e,i){const n=Ju(t.lng,t.lat,t.alt,i.lng,i.lat,i.alt),r=ud.rotate(n,e);return[-r.x,-r.y,-r.z]}function md(t,e,i,n,r){const s=[];for(let t=0;t<e.length;++t){const r=e[t],o=i[t];for(let t=0;t<=n;++t)s.push([r[0]+o[0]*t/n,r[1]+o[1]*t/n])}const o=new Ns;o.up.copy(t.upVector()),o.position.copy((new fn).fromArray(t.unprojectSfM([0,0],0))),o.lookAt((new fn).fromArray(t.unprojectSfM([0,0],10))),o.updateMatrix(),o.updateMatrixWorld(!0);return s.map((e=>{const i=t.unprojectBasic(e,1e4),n=r.worldToCamera(i,o);return[Math.abs(n[0]/n[2]),Math.abs(n[1]/n[2])]}))}class gd{constructor(t,e,i){this._spatial=new ld,this._settings=null!=t?t:new ad,this._directions=null!=e?e:new od,this._coefficients=null!=i?i:new rd}getPotentialEdges(t,e,i){if(!t.complete)throw new hd("Image has to be full.");if(!t.merged)return[];let n=this._spatial.viewingDirection(t.rotation),r=this._spatial.angleToPlane(n.toArray(),[0,0,1]),s=[];for(let o of e){if(!o.merged||o.id===t.id)continue;let e=Ju(o.lngLat.lng,o.lngLat.lat,o.computedAltitude,t.lngLat.lng,t.lngLat.lat,t.computedAltitude),a=new fn(e[0],e[1],e[2]),c=a.length();if(c>this._settings.maxDistance&&i.indexOf(o.id)<0)continue;let h=this._spatial.angleBetweenVector2(n.x,n.y,a.x,a.y),l=this._spatial.angleToPlane(a.toArray(),[0,0,1]),u=this._spatial.viewingDirection(o.rotation),d=this._spatial.angleBetweenVector2(n.x,n.y,u.x,u.y),p=this._spatial.angleToPlane(u.toArray(),[0,0,1])-r,f=this._spatial.relativeRotationAngle(t.rotation,o.rotation),m=this._spatial.angleBetweenVector2(1,0,a.x,a.y),g=null!=o.sequenceId&&null!=t.sequenceId&&o.sequenceId===t.sequenceId,_=o.mergeId===t.mergeId,v=o.creatorId===t.creatorId,y={capturedAt:o.capturedAt,directionChange:d,distance:c,spherical:dd(o.cameraType),id:o.id,motionChange:h,rotation:f,sameMergeCC:_,sameSequence:g,sameUser:v,sequenceId:o.sequenceId,verticalDirectionChange:p,verticalMotion:l,worldMotionAzimuth:m};s.push(y)}return s}computeSequenceEdges(e,i){if(!e.complete)throw new hd("Image has to be full.");if(e.sequenceId!==i.id)throw new hd("Image and sequence does not correspond.");let n=[],r=i.findNext(e.id);null!=r&&n.push({data:{direction:t.NavigationDirection.Next,worldMotionAzimuth:Number.NaN},source:e.id,target:r});let s=i.findPrev(e.id);return null!=s&&n.push({data:{direction:t.NavigationDirection.Prev,worldMotionAzimuth:Number.NaN},source:e.id,target:s}),n}computeSimilarEdges(e,i){if(!e.complete)throw new hd("Image has to be full.");let n=dd(e.cameraType),r={};for(let t of i)if(null!=t.sequenceId&&!t.sameSequence){if(n){if(!t.spherical)continue}else if(!t.spherical&&Math.abs(t.directionChange)>this._settings.similarMaxDirectionChange)continue;t.distance>this._settings.similarMaxDistance||t.sameUser&&Math.abs(t.capturedAt-e.capturedAt)<this._settings.similarMinTimeDifference||(null==r[t.sequenceId]&&(r[t.sequenceId]=[]),r[t.sequenceId].push(t))}let s=[],o=dd(e.cameraType)?t=>t.distance:t=>this._coefficients.similarDistance*t.distance+this._coefficients.similarRotation*t.rotation;for(let t in r){if(!r.hasOwnProperty(t))continue;let e=Number.MAX_VALUE,i=null;for(let n of r[t]){let t=o(n);t<e&&(e=t,i=n)}null!=i&&s.push(i)}return s.map((i=>({data:{direction:t.NavigationDirection.Similar,worldMotionAzimuth:i.worldMotionAzimuth},source:e.id,target:i.id})))}computeStepEdges(t,e,i,n){if(!t.complete)throw new hd("Image has to be full.");let r=[];if(dd(t.cameraType))return r;for(let s in this._directions.steps){if(!this._directions.steps.hasOwnProperty(s))continue;let o=this._directions.steps[s],a=Number.MAX_VALUE,c=null,h=null;for(let t of e){if(t.spherical)continue;if(Math.abs(t.directionChange)>this._settings.stepMaxDirectionChange)continue;let e=this._spatial.angleDifference(o.motionChange,t.motionChange),r=this._spatial.angleDifference(t.directionChange,e),s=Math.max(Math.abs(e),Math.abs(r));if(Math.abs(s)>this._settings.stepMaxDrift)continue;let l=t.id;if(!o.useFallback||l!==i&&l!==n||(h=t),t.distance>this._settings.stepMaxDistance)continue;e=Math.sqrt(e*e+t.verticalMotion*t.verticalMotion);let u=this._coefficients.stepPreferredDistance*Math.abs(t.distance-this._settings.stepPreferredDistance)/this._settings.stepMaxDistance+this._coefficients.stepMotion*e/this._settings.stepMaxDrift+this._coefficients.stepRotation*t.rotation/this._settings.stepMaxDirectionChange+this._coefficients.stepSequencePenalty*(t.sameSequence?0:1)+this._coefficients.stepMergeCCPenalty*(t.sameMergeCC?0:1);u<a&&(a=u,c=t)}c=null==c?h:c,null!=c&&r.push({data:{direction:o.direction,worldMotionAzimuth:c.worldMotionAzimuth},source:t.id,target:c.id})}return r}computeTurnEdges(e,i){if(!e.complete)throw new hd("Image has to be full.");let n=[];if(dd(e.cameraType))return n;for(let r in this._directions.turns){if(!this._directions.turns.hasOwnProperty(r))continue;let s=this._directions.turns[r],o=Number.MAX_VALUE,a=null;for(let e of i){if(e.spherical)continue;if(e.distance>this._settings.turnMaxDistance)continue;let i,n=s.direction!==t.NavigationDirection.TurnU&&e.distance<this._settings.turnMaxRigDistance&&Math.abs(e.directionChange)>this._settings.turnMinRigDirectionChange,r=this._spatial.angleDifference(s.directionChange,e.directionChange);if(n&&e.directionChange*s.directionChange>0&&Math.abs(e.directionChange)<Math.abs(s.directionChange))i=-Math.PI/2+Math.abs(e.directionChange);else{if(Math.abs(r)>this._settings.turnMaxDirectionChange)continue;let t=s.motionChange?this._spatial.angleDifference(s.motionChange,e.motionChange):0;t=Math.sqrt(t*t+e.verticalMotion*e.verticalMotion),i=this._coefficients.turnDistance*e.distance/this._settings.turnMaxDistance+this._coefficients.turnMotion*t/Math.PI+this._coefficients.turnSequencePenalty*(e.sameSequence?0:1)+this._coefficients.turnMergeCCPenalty*(e.sameMergeCC?0:1)}i<o&&(o=i,a=e)}null!=a&&n.push({data:{direction:s.direction,worldMotionAzimuth:a.worldMotionAzimuth},source:e.id,target:a.id})}return n}computePerspectiveToSphericalEdges(e,i){if(!e.complete)throw new hd("Image has to be full.");if(dd(e.cameraType))return[];let n=Number.MAX_VALUE,r=null;for(let t of i){if(!t.spherical)continue;let e=this._coefficients.sphericalPreferredDistance*Math.abs(t.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(t.motionChange)/Math.PI+this._coefficients.sphericalMergeCCPenalty*(t.sameMergeCC?0:1);e<n&&(n=e,r=t)}return null==r?[]:[{data:{direction:t.NavigationDirection.Spherical,worldMotionAzimuth:r.worldMotionAzimuth},source:e.id,target:r.id}]}computeSphericalEdges(e,i){if(!e.complete)throw new hd("Image has to be full.");if(!dd(e.cameraType))return[];let n=[],r=[],s=[];for(let t of i)if(!(t.distance>this._settings.sphericalMaxDistance))if(t.spherical){if(t.distance<this._settings.sphericalMinDistance)continue;r.push(t)}else for(let e in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(e))continue;let i=this._directions.spherical[e],n=this._spatial.angleDifference(t.directionChange,t.motionChange),r=this._spatial.angleDifference(i.directionChange,n);if(!(Math.abs(r)>this._settings.sphericalMaxStepTurnChange)){s.push([i.direction,t]);break}}let o=Math.PI/this._settings.sphericalMaxItems,a=[],c=[];for(let i=0;i<this._settings.sphericalMaxItems;i++){let s=i/this._settings.sphericalMaxItems*2*Math.PI,h=Number.MAX_VALUE,l=null;for(let t of r){let e=this._spatial.angleDifference(s,t.motionChange);if(Math.abs(e)>o)continue;let i=Number.MAX_VALUE;for(let e of a){let n=Math.abs(this._spatial.angleDifference(e,t.motionChange));n<i&&(i=n)}if(i<=o)continue;let n=this._coefficients.sphericalPreferredDistance*Math.abs(t.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(e)/o+this._coefficients.sphericalSequencePenalty*(t.sameSequence?0:1)+this._coefficients.sphericalMergeCCPenalty*(t.sameMergeCC?0:1);n<h&&(h=n,l=t)}null!=l?(a.push(l.motionChange),n.push({data:{direction:t.NavigationDirection.Spherical,worldMotionAzimuth:l.worldMotionAzimuth},source:e.id,target:l.id})):c.push(s)}let h={};h[t.NavigationDirection.Spherical]=a,h[t.NavigationDirection.StepForward]=[],h[t.NavigationDirection.StepLeft]=[],h[t.NavigationDirection.StepBackward]=[],h[t.NavigationDirection.StepRight]=[];for(let i of c){let r=[];for(let a in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(a))continue;let c=this._directions.spherical[a],l=h[t.NavigationDirection.Spherical].concat(h[c.direction]).concat(h[c.prev]).concat(h[c.next]),u=Number.MAX_VALUE,d=null;for(let t of s){if(t[0]!==c.direction)continue;let e=this._spatial.angleDifference(i,t[1].motionChange);if(Math.abs(e)>o)continue;let n=Number.MAX_VALUE;for(let e of l){let i=Math.abs(this._spatial.angleDifference(e,t[1].motionChange));i<n&&(n=i)}if(n<=o)continue;let r=this._coefficients.sphericalPreferredDistance*Math.abs(t[1].distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(e)/o+this._coefficients.sphericalMergeCCPenalty*(t[1].sameMergeCC?0:1);r<u&&(u=r,d=t)}null!=d&&(r.push(d),n.push({data:{direction:d[0],worldMotionAzimuth:d[1].worldMotionAzimuth},source:e.id,target:d[1].id}))}for(let t of r)h[t[0]].push(t[1].motionChange)}return n}}class _d extends cd{constructor(t){super(t),Object.setPrototypeOf(this,_d.prototype),this.name="GraphMapillaryError"}}class vd{constructor(t,e,i,n,r,s){this._api=t,this._cachedNodes={},this._cachedNodeTiles={},this._cachedSequenceNodes={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequenceNodes$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._changed$=new T,this._filterCreator=null!=r?r:new Si,this._filter=this._filterCreator.createFilter(void 0),this._filterSubject$=new T,this._filter$=At(G(this._filter),this._filterSubject$).pipe(Ue(1),E()),this._filterSubscription=this._filter$.subscribe((()=>{})),this._defaultAlt=2,this._edgeCalculator=null!=n?n:new gd,this._graphCalculator=null!=i?i:new td,this._configuration=null!=s?s:{maxSequences:50,maxUnusedImages:100,maxUnusedPreStoredImages:30,maxUnusedTiles:20},this._nodes={},this._nodeIndex=null!=e?e:new vd._spatialIndex(16),this._nodeIndexTiles={},this._nodeToTile={},this._preStored={},this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._tileThreshold=20}static register(t){vd._spatialIndex=t}get api(){return this._api}get changed$(){return this._changed$}get filter$(){return this._filter$}cacheBoundingBox$(t,e){const i=this._api.data.geometry.bboxToCellIds(t,e).filter((t=>!(t in this._cachedTiles))).map((t=>t in this._cachingTiles$?this._cachingTiles$[t]:this._cacheTile$(t)));return 0===i.length&&i.push(G(this)),bt(i).pipe(Et(),Re(),Mt((()=>{const i=this._nodeIndex.search({maxX:e.lng,maxY:e.lat,minX:t.lng,minY:t.lat}).map((t=>t.node)),n=[],r=[];for(const t of i)t.complete?n.push(t):r.push(t.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return Ot(G(n),bt(s.map((t=>this._api.getSpatialImages$(t).pipe(rt((t=>{const e=[];for(const i of t){if(!this.hasNode(i.node_id))continue;const t=this.getNode(i.node_id);t.complete||this._makeFull(t,i.node),e.push(t)}return e})))))).pipe(Et()))})),De(((t,e)=>t.concat(e))))}cacheCell$(t){return(t in this._cachedTiles?G(this):t in this._cachingTiles$?this._cachingTiles$[t]:this._cacheTile$(t)).pipe(Mt((()=>{const e=this._cachedTiles[t];e.accessed=(new Date).getTime();const i=e.nodes,n=[],r=[];for(const t of i)t.complete?n.push(t):r.push(t.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return Ot(G(n),bt(s.map((t=>this._api.getSpatialImages$(t).pipe(rt((t=>{const e=[];for(const i of t){if(!i.node){console.warn(`Image is empty (${i.node})`);continue}const t=i.node_id;if(!this.hasNode(t))continue;const n=this.getNode(t);n.complete||this._makeFull(n,i.node),e.push(n)}return e})))))).pipe(Et()))})),De(((t,e)=>t.concat(e))))}cacheFill$(t){if(t in this._cachingFull$)throw new _d(`Cannot fill node while caching full (${t}).`);if(!this.hasNode(t))throw new _d(`Cannot fill node that does not exist in graph (${t}).`);if(t in this._cachingFill$)return this._cachingFill$[t];const e=this.getNode(t);if(e.complete)throw new _d(`Cannot fill node that is already full (${t}).`);return this._cachingFill$[t]=this._api.getSpatialImages$([t]).pipe(pi((t=>{for(const i of t)i.node||console.warn(`Image is empty ${i.node_id}`),e.complete||this._makeFull(e,i.node),delete this._cachingFill$[i.node_id]})),rt((()=>this)),Me((()=>{t in this._cachingFill$&&delete this._cachingFill$[t],this._changed$.next(this)})),He(),E()),this._cachingFill$[t]}cacheFull$(t){if(t in this._cachingFull$)return this._cachingFull$[t];if(this.hasNode(t))throw new _d(`Cannot cache full node that already exist in graph (${t}).`);return this._cachingFull$[t]=this._api.getImages$([t]).pipe(pi((e=>{for(const i of e){if(!i.node)throw new _d(`Image does not exist (${t}, ${i.node}).`);const e=i.node_id;if(this.hasNode(e)){const e=this.getNode(t);e.complete||this._makeFull(e,i.node)}else{if(null==i.node.sequence.id)throw new _d(`Image has no sequence key (${t}).`);const n=new ed(i.node);this._makeFull(n,i.node);const r=this._api.data.geometry.lngLatToCellId(n.originalLngLat);this._preStore(r,n),this._setNode(n),delete this._cachingFull$[e]}}})),rt((()=>this)),Me((()=>{t in this._cachingFull$&&delete this._cachingFull$[t],this._changed$.next(this)})),He(),E()),this._cachingFull$[t]}cacheNodeSequence$(t){if(!this.hasNode(t))throw new _d(`Cannot cache sequence edges of node that does not exist in graph (${t}).`);let e=this.getNode(t);if(e.sequenceId in this._sequences)throw new _d(`Sequence already cached (${t}), (${e.sequenceId}).`);return this._cacheSequence$(e.sequenceId)}cacheSequence$(t){if(t in this._sequences)throw new _d(`Sequence already cached (${t})`);return this._cacheSequence$(t)}cacheSequenceEdges(t){let e=this.getNode(t);if(!(e.sequenceId in this._sequences))throw new _d(`Sequence is not cached (${t}), (${e.sequenceId})`);let i=this._sequences[e.sequenceId].sequence,n=this._edgeCalculator.computeSequenceEdges(e,i);e.cacheSequenceEdges(n)}cacheSequenceNodes$(t,e){if(!this.hasSequence(t))throw new _d(`Cannot cache sequence nodes of sequence that does not exist in graph (${t}).`);if(this.hasSequenceNodes(t))throw new _d(`Sequence nodes already cached (${t}).`);const i=this.getSequence(t);if(i.id in this._cachingSequenceNodes$)return this._cachingSequenceNodes$[i.id];const n=[],r=i.imageIds.slice();if(e&&r.length>50){const t=r.indexOf(e),i=Math.max(0,Math.min(t-25,r.length-50));n.push(r.splice(i,50))}for(;r.length>0;)n.push(r.splice(0,200));let s=n.length;const o=bt(n).pipe(Mt((t=>this._api.getImages$(t).pipe(pi((t=>{for(const e of t){if(!e.node){console.warn(`Image empty (${e.node_id})`);continue}const t=e.node_id;if(this.hasNode(t)){const i=this.getNode(t);i.complete||this._makeFull(i,e.node)}else{null==e.node.sequence.id&&console.warn(`Sequence missing, discarding node (${e.node_id})`);const t=new ed(e.node);this._makeFull(t,e.node);const i=this._api.data.geometry.lngLatToCellId(t.originalLngLat);this._preStore(i,t),this._setNode(t)}}s--})),rt((()=>this)))),6),Re(),Me((()=>{delete this._cachingSequenceNodes$[i.id],0===s&&(this._cachedSequenceNodes[i.id]=!0)})),He(),E());return this._cachingSequenceNodes$[i.id]=o,o}cacheSpatialArea$(t){if(!this.hasNode(t))throw new _d(`Cannot cache spatial area of node that does not exist in graph (${t}).`);if(t in this._cachedSpatialEdges)throw new _d(`Image already spatially cached (${t}).`);if(!(t in this._requiredSpatialArea))throw new _d(`Spatial area not determined (${t}).`);let e=this._requiredSpatialArea[t];if(0===Object.keys(e.cacheNodes).length)throw new _d(`Spatial nodes already cached (${t}).`);if(t in this._cachingSpatialArea$)return this._cachingSpatialArea$[t];let i=[];for(;e.cacheKeys.length>0;)i.push(e.cacheKeys.splice(0,200));let n=i.length,r=[];for(let s of i){let i=this._api.getSpatialImages$(s).pipe(pi((i=>{for(const t of i){if(!t.node){console.warn(`Image is empty (${t.node_id})`);continue}const i=t.node_id,n=e.cacheNodes[i];n.complete?delete e.cacheNodes[i]:(this._makeFull(n,t.node),delete e.cacheNodes[i])}0==--n&&delete this._cachingSpatialArea$[t]})),rt((()=>this)),te((i=>{for(let t of s)t in e.all&&delete e.all[t],t in e.cacheNodes&&delete e.cacheNodes[t];throw 0==--n&&delete this._cachingSpatialArea$[t],i})),Me((()=>{0===Object.keys(e.cacheNodes).length&&this._changed$.next(this)})),He(),E());r.push(i)}return this._cachingSpatialArea$[t]=r,r}cacheSpatialEdges(t){if(t in this._cachedSpatialEdges)throw new _d(`Spatial edges already cached (${t}).`);let e=this.getNode(t),i=this._sequences[e.sequenceId].sequence,n=[],r=i.findPrev(e.id);null!=r&&n.push(r);let s=i.findNext(e.id);null!=s&&n.push(s);let o=this._requiredSpatialArea[t].all,a=[],c=this._filter;for(let t in o){if(!o.hasOwnProperty(t))continue;let e=o[t];c(e)&&a.push(e)}let h=this._edgeCalculator.getPotentialEdges(e,a,n),l=this._edgeCalculator.computeStepEdges(e,h,r,s);l=l.concat(this._edgeCalculator.computeTurnEdges(e,h)),l=l.concat(this._edgeCalculator.computeSphericalEdges(e,h)),l=l.concat(this._edgeCalculator.computePerspectiveToSphericalEdges(e,h)),l=l.concat(this._edgeCalculator.computeSimilarEdges(e,h)),e.cacheSpatialEdges(l),this._cachedSpatialEdges[t]=e,delete this._requiredSpatialArea[t],delete this._cachedNodeTiles[t]}cacheTiles$(t){if(t in this._cachedNodeTiles)throw new _d(`Tiles already cached (${t}).`);if(t in this._cachedSpatialEdges)throw new _d(`Spatial edges already cached so tiles considered cached (${t}).`);if(!(t in this._requiredNodeTiles))throw new _d(`Tiles have not been determined (${t}).`);let e=this._requiredNodeTiles[t];if(0===e.cache.length&&0===e.caching.length)throw new _d(`Tiles already cached (${t}).`);if(!this.hasNode(t))throw new _d(`Cannot cache tiles of node that does not exist in graph (${t}).`);let i=e.cache.slice();e.caching=this._requiredNodeTiles[t].caching.concat(i),e.cache=[];let n=[];for(let i of e.caching){const r=i in this._cachingTiles$?this._cachingTiles$[i]:this._cacheTile$(i);n.push(r.pipe(pi((n=>{let r=e.caching.indexOf(i);r>-1&&e.caching.splice(r,1),0===e.caching.length&&0===e.cache.length&&(delete this._requiredNodeTiles[t],this._cachedNodeTiles[t]=!0)})),te((n=>{let r=e.caching.indexOf(i);throw r>-1&&e.caching.splice(r,1),0===e.caching.length&&0===e.cache.length&&(delete this._requiredNodeTiles[t],this._cachedNodeTiles[t]=!0),n})),Me((()=>{this._changed$.next(this)})),He(),E()))}return n}initializeCache(t){if(t in this._cachedNodes)throw new _d(`Image already in cache (${t}).`);const e=this.getNode(t),i=this._api.data;e.initializeCache(new id(i));const n=(new Date).getTime();this._cachedNodes[t]={accessed:n,node:e},this._updateCachedTileAccess(t,n)}isCachingFill(t){return t in this._cachingFill$}isCachingFull(t){return t in this._cachingFull$}isCachingNodeSequence(t){return this.getNode(t).sequenceId in this._cachingSequences$}isCachingSequence(t){return t in this._cachingSequences$}isCachingSequenceNodes(t){return t in this._cachingSequenceNodes$}isCachingTiles(t){return t in this._requiredNodeTiles&&0===this._requiredNodeTiles[t].cache.length&&this._requiredNodeTiles[t].caching.length>0}hasInitializedCache(t){return t in this._cachedNodes}hasNode(t){let e=(new Date).getTime();return this._updateCachedNodeAccess(t,e),this._updateCachedTileAccess(t,e),t in this._nodes}hasNodeSequence(t){let e=this.getNode(t).sequenceId,i=e in this._sequences;return i&&(this._sequences[e].accessed=(new Date).getTime()),i}hasSequence(t){let e=t in this._sequences;return e&&(this._sequences[t].accessed=(new Date).getTime()),e}hasSequenceNodes(t){return t in this._cachedSequenceNodes}hasSpatialArea(t){if(!this.hasNode(t))throw new _d(`Spatial area nodes cannot be determined if node not in graph (${t}).`);if(t in this._cachedSpatialEdges)return!0;if(t in this._requiredSpatialArea)return 0===Object.keys(this._requiredSpatialArea[t].cacheNodes).length;let e=this.getNode(t),i=this._graphCalculator.boundingBoxCorners(e.lngLat,this._tileThreshold),n=this._nodeIndex.search({maxX:i[1].lng,maxY:i[1].lat,minX:i[0].lng,minY:i[0].lat}),r={all:{},cacheKeys:[],cacheNodes:{}};for(let t of n)r.all[t.node.id]=t.node,t.node.complete||(r.cacheKeys.push(t.node.id),r.cacheNodes[t.node.id]=t.node);return this._requiredSpatialArea[t]=r,0===r.cacheKeys.length}hasTiles(t){if(t in this._cachedNodeTiles)return!0;if(t in this._cachedSpatialEdges)return!0;if(!this.hasNode(t))throw new _d(`Image does not exist in graph (${t}).`);let e={cache:[],caching:[]};if(t in this._requiredNodeTiles)e=this._requiredNodeTiles[t];else{const i=this.getNode(t),[n,r]=this._graphCalculator.boundingBoxCorners(i.lngLat,this._tileThreshold);e.cache=this._api.data.geometry.bboxToCellIds(n,r).filter((t=>!(t in this._cachedTiles))),e.cache.length>0&&(this._requiredNodeTiles[t]=e)}return 0===e.cache.length&&0===e.caching.length}getNode(t){let e=(new Date).getTime();return this._updateCachedNodeAccess(t,e),this._updateCachedTileAccess(t,e),this._nodes[t]}getSequence(t){let e=this._sequences[t];return e.accessed=(new Date).getTime(),e.sequence}resetSpatialEdges(){let t=Object.keys(this._cachedSpatialEdges);for(let e of t){this._cachedSpatialEdges[e].resetSpatialEdges(),delete this._cachedSpatialEdges[e]}}reset(t){const e=[];for(const i of t){if(!this.hasNode(i))throw new Error(`Image does not exist ${i}`);const t=this.getNode(i);t.resetSequenceEdges(),t.resetSpatialEdges(),e.push(t)}for(let e of Object.keys(this._cachedNodes))-1===t.indexOf(e)&&(this._cachedNodes[e].node.dispose(),delete this._cachedNodes[e]);this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._nodes={},this._nodeToTile={},this._preStored={};for(const t of e){this._nodes[t.id]=t;const e=this._api.data.geometry.lngLatToCellId(t.originalLngLat);this._preStore(e,t)}this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._nodeIndexTiles={},this._nodeIndex.clear()}setFilter(t){this._filter=this._filterCreator.createFilter(t),this._filterSubject$.next(this._filter)}uncache(t,e,i){const n={};this._addNewKeys(n,this._cachingFull$),this._addNewKeys(n,this._cachingFill$),this._addNewKeys(n,this._cachingSpatialArea$),this._addNewKeys(n,this._requiredNodeTiles),this._addNewKeys(n,this._requiredSpatialArea);for(const e of t)e in n||(n[e]=!0);const r=this._tileThreshold,s=this._graphCalculator,o=this._api.data.geometry,a=new Set(e);for(let t in n){if(!n.hasOwnProperty(t))continue;const e=this._nodes[t],[i,c]=s.boundingBoxCorners(e.lngLat,r),h=o.bboxToCellIds(i,c);for(const t of h)a.has(t)||a.add(t)}const c=[];for(let t in this._cachedTiles)this._cachedTiles.hasOwnProperty(t)&&!a.has(t)&&c.push([t,this._cachedTiles[t]]);const h=c.sort(((t,e)=>e[1].accessed-t[1].accessed)).slice(this._configuration.maxUnusedTiles).map((t=>t[0]));for(let t of h)this._uncacheTile(t,i);const l=[],u=[];for(let t in this._preStored){if(!this._preStored.hasOwnProperty(t)||t in this._cachingTiles$)continue;const e=this._preStored[t];for(let r in e)e.hasOwnProperty(r)&&!(r in n)&&e[r].sequenceId!==i&&(r in this._cachedNodes?l.push([this._cachedNodes[r],t]):u.push([r,t]))}const d=l.sort((([t],[e])=>e.accessed-t.accessed)).slice(this._configuration.maxUnusedPreStoredImages).map((([t,e])=>[t.node.id,e]));this._uncachePreStored(u),this._uncachePreStored(d);const p=[];for(let t in this._cachedNodes)this._cachedNodes.hasOwnProperty(t)&&!(t in n)&&p.push(this._cachedNodes[t]);const f=p.sort(((t,e)=>e.accessed-t.accessed)).slice(this._configuration.maxUnusedImages);for(const t of f){t.node.uncache();const e=t.node.id;delete this._cachedNodes[e],e in this._cachedNodeTiles&&delete this._cachedNodeTiles[e],e in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[e]}const m=[];for(let t in this._sequences)this._sequences.hasOwnProperty(t)&&!(t in this._cachingSequences$)&&t!==i&&m.push(this._sequences[t]);const g=m.sort(((t,e)=>e.accessed-t.accessed)).slice(this._configuration.maxSequences);for(const t of g){const e=t.sequence.id;delete this._sequences[e],e in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[e],t.sequence.dispose()}}updateCells$(t){const e=this._cachedTiles,i=this._cachingTiles$;return bt(t).pipe(Mt((t=>t in e?this._updateCell$(t):t in i?i[t].pipe(te((()=>G(this))),Mt((()=>this._updateCell$(t)))):B())))}unsubscribe(){this._filterSubscription.unsubscribe()}_addNewKeys(t,e){for(let i in e)e.hasOwnProperty(i)&&this.hasNode(i)&&(i in t||(t[i]=!0))}_cacheSequence$(t){return t in this._cachingSequences$||(this._cachingSequences$[t]=this._api.getSequence$(t).pipe(pi((e=>{e?(e.id in this._sequences||(this._sequences[e.id]={accessed:(new Date).getTime(),sequence:new nd(e)}),delete this._cachingSequences$[t]):console.warn(`Sequence does not exist (${t})`)})),rt((()=>this)),Me((()=>{t in this._cachingSequences$&&delete this._cachingSequences$[t],this._changed$.next(this)})),He(),E())),this._cachingSequences$[t]}_cacheTile$(t){return this._cachingTiles$[t]=this._api.getCoreImages$(t).pipe(pi((e=>{if(t in this._cachedTiles)return;const i=e.images;this._nodeIndexTiles[t]=[],this._cachedTiles[t]={accessed:(new Date).getTime(),nodes:[]};const n=this._cachedTiles[t].nodes,r=this._removeFromPreStore(t);for(const e of i){if(!e)break;if(null==e.sequence.id){console.warn(`Sequence missing, discarding node (${e.id})`);continue}if(null!=r&&e.id in r){const i=r[e.id];delete r[e.id],n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[t].push(s),this._nodeToTile[i.id]=t;continue}const i=new ed(e);n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[t].push(s),this._nodeToTile[i.id]=t,this._setNode(i)}delete this._cachingTiles$[t]})),rt((()=>this)),te((e=>{throw delete this._cachingTiles$[t],e})),He(),E()),this._cachingTiles$[t]}_makeFull(t,e){null==e.computed_altitude&&(e.computed_altitude=this._defaultAlt),null==e.computed_rotation&&(e.computed_rotation=this._graphCalculator.rotationFromCompass(e.compass_angle,e.exif_orientation)),t.makeComplete(e)}_preStore(t,e){t in this._preStored||(this._preStored[t]={}),this._preStored[t][e.id]=e}_removeFromPreStore(t){let e=null;return t in this._preStored&&(e=this._preStored[t],delete this._preStored[t]),e}_setNode(t){let e=t.id;if(this.hasNode(e))throw new _d(`Image already exist (${e}).`);this._nodes[e]=t}_uncacheTile(t,e){for(let i of this._cachedTiles[t].nodes){let n=i.id;delete this._nodeToTile[n],n in this._cachedNodes&&delete this._cachedNodes[n],n in this._cachedNodeTiles&&delete this._cachedNodeTiles[n],n in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[n],i.sequenceId===e?(this._preStore(t,i),i.uncache()):(delete this._nodes[n],i.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[i.sequenceId],i.dispose())}for(let e of this._nodeIndexTiles[t])this._nodeIndex.remove(e);delete this._nodeIndexTiles[t],delete this._cachedTiles[t]}_uncachePreStored(t){let e={};for(let[i,n]of t){i in this._nodes&&delete this._nodes[i],i in this._cachedNodes&&delete this._cachedNodes[i];let t=this._preStored[n][i];t.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[t.sequenceId],delete this._preStored[n][i],t.dispose(),e[n]=!0}for(let t in e)e.hasOwnProperty(t)&&0===Object.keys(this._preStored[t]).length&&delete this._preStored[t]}_updateCachedTileAccess(t,e){t in this._nodeToTile&&(this._cachedTiles[this._nodeToTile[t]].accessed=e)}_updateCachedNodeAccess(t,e){t in this._cachedNodes&&(this._cachedNodes[t].accessed=e)}_updateCell$(t){return this._api.getCoreImages$(t).pipe(Mt((e=>{if(!(t in this._cachedTiles))return B();const i=this._nodeIndex,n=this._nodeIndexTiles[t],r=this._nodeToTile,s=this._cachedTiles[t];s.accessed=(new Date).getTime();const o=s.nodes,a=e.images;for(const e of a){if(null==e)break;if(this.hasNode(e.id))continue;if(null==e.sequence.id){console.warn(`Sequence missing, discarding node (${e.id})`);continue}const s=new ed(e);o.push(s);const a={lat:s.lngLat.lat,lng:s.lngLat.lng,node:s};i.insert(a),n.push(a),r[s.id]=t,this._setNode(s)}return G(t)})),te((t=>(console.error(t),B()))))}}class yd{constructor(){this._hash={},this._index=new yd._spatialIndex(16),this._indexChanged$=new T,this._updated$=new T}static register(t){yd._spatialIndex=t}get changed$(){return this._indexChanged$}get updated$(){return this._updated$}add(t){const e=[],i=this._hash,n=this._index;for(const r of t){const t=r.id;t in i&&(n.remove(i[t]),e.push(r));const s={lat:r.lngLat.lat,lng:r.lngLat.lng,marker:r};i[t]=s,n.insert(s)}e.length>0&&this._updated$.next(e),t.length>e.length&&this._indexChanged$.next(this)}has(t){return t in this._hash}get(t){return this.has(t)?this._hash[t].marker:void 0}getAll(){return this._index.all().map((t=>t.marker))}remove(t){const e=this._hash,i=this._index;let n=!1;for(const r of t){if(!(r in e))continue;const t=e[r];i.remove(t),delete e[r],n=!0}n&&this._indexChanged$.next(this)}removeAll(){this._hash={},this._index.clear(),this._indexChanged$.next(this)}search([t,e]){return this._index.search({maxX:e.lng,maxY:e.lat,minX:t.lng,minY:t.lat}).map((t=>t.marker))}update(t){const e=this._hash,i=this._index,n=t.id;if(!(n in e))return;i.remove(e[n]);const r={lat:t.lngLat.lat,lng:t.lngLat.lng,marker:t};e[n]=r,i.insert(r)}}function bd(t,e,i,n,r){xd(t,e,i||0,n||t.length-1,r||Sd)}function xd(t,e,i,n,r){for(;n>i;){if(n-i>600){var s=n-i+1,o=e-i+1,a=Math.log(s),c=.5*Math.exp(2*a/3),h=.5*Math.sqrt(a*c*(s-c)/s)*(o-s/2<0?-1:1);xd(t,e,Math.max(i,Math.floor(e-o*c/s+h)),Math.min(n,Math.floor(e+(s-o)*c/s+h)),r)}var l=t[e],u=i,d=n;for(wd(t,i,e),r(t[n],l)>0&&wd(t,i,n);u<d;){for(wd(t,u,d),u++,d--;r(t[u],l)<0;)u++;for(;r(t[d],l)>0;)d--}0===r(t[i],l)?wd(t,i,d):wd(t,++d,n),d<=e&&(i=d+1),e<=d&&(n=d-1)}}function wd(t,e,i){var n=t[e];t[e]=t[i],t[i]=n}function Sd(t,e){return t<e?-1:t>e?1:0}function Md(t,e,i){if(!i)return e.indexOf(t);for(let n=0;n<e.length;n++)if(i(t,e[n]))return n;return-1}function Td(t,e){Cd(t,0,t.children.length,e,t)}function Cd(t,e,i,n,r){r||(r=Dd(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(let s=e;s<i;s++){const e=t.children[s];Ed(r,t.leaf?n(e):e)}return r}function Ed(t,e){return t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),t}function Id(t,e){return t.minX-e.minX}function Ad(t,e){return t.minY-e.minY}function Pd(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function Rd(t){return t.maxX-t.minX+(t.maxY-t.minY)}function Ld(t,e){const i=Math.max(t.minX,e.minX),n=Math.max(t.minY,e.minY),r=Math.min(t.maxX,e.maxX),s=Math.min(t.maxY,e.maxY);return Math.max(0,r-i)*Math.max(0,s-n)}function Od(t,e){return t.minX<=e.minX&&t.minY<=e.minY&&e.maxX<=t.maxX&&e.maxY<=t.maxY}function Nd(t,e){return e.minX<=t.maxX&&e.minY<=t.maxY&&e.maxX>=t.minX&&e.maxY>=t.minY}function Dd(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function $d(t,e,i,n,r){const s=[e,i];for(;s.length;){if((i=s.pop())-(e=s.pop())<=n)continue;const o=e+Math.ceil((i-e)/n/2)*n;bd(t,o,e,i,r),s.push(e,o,o,i)}}class kd extends class{constructor(t=9){this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(t){let e=this.data;const i=[];if(!Nd(t,e))return i;const n=this.toBBox,r=[];for(;e;){for(let s=0;s<e.children.length;s++){const o=e.children[s],a=e.leaf?n(o):o;Nd(t,a)&&(e.leaf?i.push(o):Od(t,a)?this._all(o,i):r.push(o))}e=r.pop()}return i}collides(t){let e=this.data;if(!Nd(t,e))return!1;const i=[];for(;e;){for(let n=0;n<e.children.length;n++){const r=e.children[n],s=e.leaf?this.toBBox(r):r;if(Nd(t,s)){if(e.leaf||Od(t,s))return!0;i.push(r)}}e=i.pop()}return!1}load(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(let e=0;e<t.length;e++)this.insert(t[e]);return this}let e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){const t=this.data;this.data=e,e=t}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this}insert(t){return t&&this._insert(t,this.data.height-1),this}clear(){return this.data=Dd([]),this}remove(t,e){if(!t)return this;let i=this.data;const n=this.toBBox(t),r=[],s=[];let o,a,c;for(;i||r.length;){if(i||(i=r.pop(),a=r[r.length-1],o=s.pop(),c=!0),i.leaf){const n=Md(t,i.children,e);if(-1!==n)return i.children.splice(n,1),r.push(i),this._condense(r),this}c||i.leaf||!Od(i,n)?a?(o++,i=a.children[o],c=!1):i=null:(r.push(i),s.push(o),o=0,a=i,i=i.children[0])}return this}toBBox(t){return t}compareMinX(t,e){return t.minX-e.minX}compareMinY(t,e){return t.minY-e.minY}toJSON(){return this.data}fromJSON(t){return this.data=t,this}_all(t,e){const i=[];for(;t;)t.leaf?e.push(...t.children):i.push(...t.children),t=i.pop();return e}_build(t,e,i,n){const r=i-e+1;let s,o=this._maxEntries;if(r<=o)return s=Dd(t.slice(e,i+1)),Td(s,this.toBBox),s;n||(n=Math.ceil(Math.log(r)/Math.log(o)),o=Math.ceil(r/Math.pow(o,n-1))),s=Dd([]),s.leaf=!1,s.height=n;const a=Math.ceil(r/o),c=a*Math.ceil(Math.sqrt(o));$d(t,e,i,c,this.compareMinX);for(let r=e;r<=i;r+=c){const e=Math.min(r+c-1,i);$d(t,r,e,a,this.compareMinY);for(let i=r;i<=e;i+=a){const r=Math.min(i+a-1,e);s.children.push(this._build(t,i,r,n-1))}}return Td(s,this.toBBox),s}_chooseSubtree(t,e,i,n){for(;n.push(e),!e.leaf&&n.length-1!==i;){let i,n=1/0,o=1/0;for(let a=0;a<e.children.length;a++){const c=e.children[a],h=Pd(c),l=(r=t,s=c,(Math.max(s.maxX,r.maxX)-Math.min(s.minX,r.minX))*(Math.max(s.maxY,r.maxY)-Math.min(s.minY,r.minY))-h);l<o?(o=l,n=h<n?h:n,i=c):l===o&&h<n&&(n=h,i=c)}e=i||e.children[0]}var r,s;return e}_insert(t,e,i){const n=i?t:this.toBBox(t),r=[],s=this._chooseSubtree(n,this.data,e,r);for(s.children.push(t),Ed(s,n);e>=0&&r[e].children.length>this._maxEntries;)this._split(r,e),e--;this._adjustParentBBoxes(n,r,e)}_split(t,e){const i=t[e],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);const s=this._chooseSplitIndex(i,r,n),o=Dd(i.children.splice(s,i.children.length-s));o.height=i.height,o.leaf=i.leaf,Td(i,this.toBBox),Td(o,this.toBBox),e?t[e-1].children.push(o):this._splitRoot(i,o)}_splitRoot(t,e){this.data=Dd([t,e]),this.data.height=t.height+1,this.data.leaf=!1,Td(this.data,this.toBBox)}_chooseSplitIndex(t,e,i){let n,r=1/0,s=1/0;for(let o=e;o<=i-e;o++){const e=Cd(t,0,o,this.toBBox),a=Cd(t,o,i,this.toBBox),c=Ld(e,a),h=Pd(e)+Pd(a);c<r?(r=c,n=o,s=h<s?h:s):c===r&&h<s&&(s=h,n=o)}return n||i-e}_chooseSplitAxis(t,e,i){const n=t.leaf?this.compareMinX:Id,r=t.leaf?this.compareMinY:Ad;this._allDistMargin(t,e,i,n)<this._allDistMargin(t,e,i,r)&&t.children.sort(n)}_allDistMargin(t,e,i,n){t.children.sort(n);const r=this.toBBox,s=Cd(t,0,e,r),o=Cd(t,i-e,i,r);let a=Rd(s)+Rd(o);for(let n=e;n<i-e;n++){const e=t.children[n];Ed(s,t.leaf?r(e):e),a+=Rd(s)}for(let n=i-e-1;n>=e;n--){const e=t.children[n];Ed(o,t.leaf?r(e):e),a+=Rd(o)}return a}_adjustParentBBoxes(t,e,i){for(let n=i;n>=0;n--)Ed(e[n],t)}_condense(t){for(let e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children,e.splice(e.indexOf(t[i]),1)):this.clear():Td(t[i],this.toBBox)}}{compareMinX(t,e){return t.lng-e.lng}compareMinY(t,e){return t.lat-e.lat}toBBox(t){return{minX:t.lng,minY:t.lat,maxX:t.lng,maxY:t.lat}}}var zd,Fd=Bd;function Bd(t,e,i,n){this.cx=3*t,this.bx=3*(i-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=i,this.p2y=n}Bd.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},Bd.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},Bd.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},Bd.prototype.solveCurveX=function(t,e){var i,n,r,s,o;for(void 0===e&&(e=1e-6),r=t,o=0;o<8;o++){if(s=this.sampleCurveX(r)-t,Math.abs(s)<e)return r;var a=this.sampleCurveDerivativeX(r);if(Math.abs(a)<1e-6)break;r-=s/a}if((r=t)<(i=0))return i;if(r>(n=1))return n;for(;i<n;){if(s=this.sampleCurveX(r),Math.abs(s-t)<e)return r;t>s?i=r:n=r,r=.5*(n-i)+i}return r},Bd.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))},t.TransitionMode=void 0,(zd=t.TransitionMode||(t.TransitionMode={}))[zd.Default=0]="Default",zd[zd.Instantaneous=1]="Instantaneous";class jd{constructor(t){null!=t?(this._position=(new fn).fromArray(t.unprojectSfM([0,0],0)),this._lookat=(new fn).fromArray(t.unprojectSfM([0,0],10)),this._up=t.upVector(),this._focal=this._getFocal(t)):(this._position=new fn(0,0,0),this._lookat=new fn(1,0,0),this._up=new fn(0,0,1),this._focal=1)}get position(){return this._position}get lookat(){return this._lookat}get up(){return this._up}get focal(){return this._focal}set focal(t){this._focal=t}lerpCameras(t,e,i){this._position.subVectors(e.position,t.position).multiplyScalar(i).add(t.position),this._lookat.subVectors(e.lookat,t.lookat).multiplyScalar(i).add(t.lookat),this._up.subVectors(e.up,t.up).multiplyScalar(i).add(t.up),this._focal=(1-i)*t.focal+i*e.focal}copy(t){this._position.copy(t.position),this._lookat.copy(t.lookat),this._up.copy(t.up),this._focal=t.focal}clone(){let t=new jd;return t.position.copy(this._position),t.lookat.copy(this._lookat),t.up.copy(this._up),t.focal=this._focal,t}diff(t){let e=this._position.distanceToSquared(t.position),i=this._lookat.distanceToSquared(t.lookat),n=this._up.distanceToSquared(t.up),r=100*Math.abs(this._focal-t.focal);return Math.max(e,i,n,r)}_getFocal(t){return dd(t.cameraType)?.5/Math.tan(Math.PI/2):t.focal}}class Hd{constructor(t,e,i,n,r,s,o,a,c,h){this._orientation=this._getValue(t,1);let l=null!=o?o.width:4,u=null!=o?o.height:3,d=this._orientation<5;this._width=this._getValue(e,d?l:u),this._height=this._getValue(i,d?u:l),this._basicAspect=d?this._width/this._height:this._height/this._width,this._basicWidth=d?e:i,this._basicHeight=d?i:e;const p=this._getCameraParameters(c,h),f=p[0],m=p[1],g=p[2];this._focal=this._getValue(f,1),this._scale=this._getValue(n,0),this._worldToCamera=this.createWorldToCamera(r,s),this._worldToCameraInverse=(new Hn).copy(this._worldToCamera).invert(),this._scaledWorldToCamera=this._createScaledWorldToCamera(this._worldToCamera,this._scale),this._scaledWorldToCameraInverse=(new Hn).copy(this._scaledWorldToCamera).invert(),this._basicWorldToCamera=this._createBasicWorldToCamera(this._worldToCamera,t),this._textureScale=a||[1,1],this._ck1=m||0,this._ck2=g||0,this._cameraType=h||"perspective",this._radialPeak=this._getRadialPeak(this._ck1,this._ck2)}get ck1(){return this._ck1}get ck2(){return this._ck2}get cameraType(){return this._cameraType}get basicAspect(){return this._basicAspect}get basicHeight(){return this._basicHeight}get basicRt(){return this._basicWorldToCamera}get basicWidth(){return this._basicWidth}get focal(){return this._focal}get height(){return this._height}get orientation(){return this._orientation}get rt(){return this._worldToCamera}get srt(){return this._scaledWorldToCamera}get srtInverse(){return this._scaledWorldToCameraInverse}get scale(){return this._scale}get hasValidScale(){return this._scale>.01&&this._scale<50}get radialPeak(){return this._radialPeak}get width(){return this._width}upVector(){let t=this._worldToCamera.elements;switch(this._orientation){case 1:return new fn(-t[1],-t[5],-t[9]);case 3:return new fn(t[1],t[5],t[9]);case 6:return new fn(-t[0],-t[4],-t[8]);case 8:return new fn(t[0],t[4],t[8]);default:return new fn(-t[1],-t[5],-t[9])}}projectorMatrix(){let t=this._normalizedToTextureMatrix(),e=this._focal,i=(new Hn).set(e,0,0,0,0,e,0,0,0,0,0,0,0,0,1,0);return t.multiply(i),t.multiply(this._worldToCamera),t}projectBasic(t){let e=this.projectSfM(t);return this._sfmToBasic(e)}unprojectBasic(t,e,i){let n=this._basicToSfm(t);return this.unprojectSfM(n,e,i)}projectSfM(t){let e=new un(t[0],t[1],t[2],1);return e.applyMatrix4(this._worldToCamera),this._bearingToSfm([e.x,e.y,e.z])}unprojectSfM(t,e,i){const n=this._sfmToBearing(t),r=(i&&!dd(this._cameraType)?new un(e*n[0]/n[2],e*n[1]/n[2],e,1):new un(e*n[0],e*n[1],e*n[2],1)).applyMatrix4(this._worldToCameraInverse);return[r.x/r.w,r.y/r.w,r.z/r.w]}_sfmToBearing(t){if(dd(this._cameraType)){let e=2*t[0]*Math.PI,i=2*-t[1]*Math.PI;return[Math.cos(i)*Math.sin(e),-Math.sin(i),Math.cos(i)*Math.cos(e)]}if(pd(this._cameraType)){let[e,i]=[t[0]/this._focal,t[1]/this._focal];const n=Math.sqrt(e*e+i*i);let r=n/this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak),s=Math.cos(r),o=Math.sin(r);const a=n>1e-8?1/n:1;return[o*e*a,o*i*a,s]}{let[e,i]=[t[0]/this._focal,t[1]/this._focal];const n=Math.sqrt(e*e+i*i);let r=this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak);let s=new fn(e/r,i/r,1);return s.normalize(),[s.x,s.y,s.z]}}_distortionFromDistortedRadius(t,e,i,n){let r=1;for(let s=0;s<10;s++){let s=t/r;s>n&&(s=n),r=1+e*Math.pow(s,2)+i*Math.pow(s,4)}return r}_bearingToSfm(t){if(dd(this._cameraType)){let e=t[0],i=t[1],n=t[2],r=Math.atan2(e,n),s=Math.atan2(-i,Math.sqrt(e*e+n*n));return[r/(2*Math.PI),-s/(2*Math.PI)]}if(pd(this._cameraType)){if(t[2]>0){const[e,i,n]=t,r=Math.sqrt(e*e+i*i);let s=Math.atan2(r,n);s>this._radialPeak&&(s=this._radialPeak);const o=1+Math.pow(s,2)*(this._ck1+Math.pow(s,2)*this._ck2),a=this._focal*o*s/r;return[a*e,a*i]}return[t[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,t[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}if(t[2]>0){let[e,i]=[t[0]/t[2],t[1]/t[2]],n=e*e+i*i;const r=Math.pow(this._radialPeak,2);n>r&&(n=r);const s=1+this._ck1*n+this._ck2*Math.pow(n,2);return[this._focal*s*e,this._focal*s*i]}return[t[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,t[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}_basicToSfm(t){let e,i;switch(this._orientation){case 1:e=t[0],i=t[1];break;case 3:e=1-t[0],i=1-t[1];break;case 6:e=t[1],i=1-t[0];break;case 8:e=1-t[1],i=t[0];break;default:e=t[0],i=t[1]}let n=this._width,r=this._height,s=Math.max(n,r);return[e*n/s-n/s/2,i*r/s-r/s/2]}_sfmToBasic(t){let e,i,n=this._width,r=this._height,s=Math.max(n,r),o=(t[0]+n/s/2)/n*s,a=(t[1]+r/s/2)/r*s;switch(this._orientation){case 1:e=o,i=a;break;case 3:e=1-o,i=1-a;break;case 6:e=1-a,i=o;break;case 8:e=a,i=1-o;break;default:e=o,i=a}return[e,i]}_getValue(t,e){return null!=t&&t>0?t:e}_getCameraParameters(t,e){if(dd(e))return[];if(!t||0===t.length)return[1,0,0];const i=3-t.length;return i<=0?t:t.concat(new Array(i).fill(0))}createWorldToCamera(t,e){const i=new fn(t[0],t[1],t[2]),n=i.length();n>0&&i.normalize();const r=new Hn;return r.makeRotationAxis(i,n),r.setPosition(new fn(e[0],e[1],e[2])),r}_createScaledWorldToCamera(t,e){const i=t.clone(),n=i.elements;return n[12]=e*n[12],n[13]=e*n[13],n[14]=e*n[14],i.scale(new fn(e,e,e)),i}_createBasicWorldToCamera(t,e){const i=new fn(0,0,1);let n=0;switch(e){case 3:n=Math.PI;break;case 6:n=Math.PI/2;break;case 8:n=3*Math.PI/2}return(new Hn).makeRotationAxis(i,n).multiply(t)}_getRadialPeak(t,e){const i=5*e,n=3*t,r=Math.pow(n,2)-4*i*1;if(r<0)return;const s=(-n-Math.sqrt(r))/2/i,o=(-n+Math.sqrt(r))/2/i,a=Math.min(s,o),c=Math.max(s,o);return a>0?Math.sqrt(a):c>0?Math.sqrt(c):void 0}_normalizedToTextureMatrix(){const t=Math.max(this._width,this._height),e=this._orientation<5?this._textureScale[0]:this._textureScale[1],i=this._orientation<5?this._textureScale[1]:this._textureScale[0],n=t/this._width*e,r=t/this._height*i;switch(this._orientation){case 1:return(new Hn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1);case 3:return(new Hn).set(-n,0,0,.5,0,r,0,.5,0,0,1,0,0,0,0,1);case 6:return(new Hn).set(0,-r,0,.5,-n,0,0,.5,0,0,1,0,0,0,0,1);case 8:return(new Hn).set(0,r,0,.5,n,0,0,.5,0,0,1,0,0,0,0,1);default:return(new Hn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1)}}}class Ud{constructor(t){this._spatial=new ld,this._referenceThreshold=.01,this._transitionMode=t.transitionMode,this._reference=t.reference,this._alpha=t.alpha,this._camera=t.camera.clone(),this._zoom=t.zoom,this._currentIndex=t.currentIndex,this._trajectory=t.trajectory.slice(),this._trajectoryTransforms=[],this._trajectoryCameras=[];for(let t of this._trajectory){let e=this._imageToTranslation(t,this._reference),i=new Hd(t.exifOrientation,t.width,t.height,t.scale,t.rotation,e,t.image,void 0,t.cameraParameters,t.cameraType);this._trajectoryTransforms.push(i),this._trajectoryCameras.push(new jd(i))}this._currentImage=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousImage=this._trajectory.length>1&&this.currentIndex>0?this._trajectory[this._currentIndex-1]:null,this._currentCamera=this._trajectoryCameras.length>0?this._trajectoryCameras[this._currentIndex].clone():new jd,this._previousCamera=this._trajectoryCameras.length>1&&this.currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}get reference(){return this._reference}get alpha(){return this._getAlpha()}get camera(){return this._camera}get zoom(){return this._zoom}get trajectory(){return this._trajectory}get currentIndex(){return this._currentIndex}get currentImage(){return this._currentImage}get previousImage(){return this._previousImage}get currentCamera(){return this._currentCamera}get currentTransform(){return this._trajectoryTransforms.length>0?this._trajectoryTransforms[this.currentIndex]:null}get previousTransform(){return this._trajectoryTransforms.length>1&&this.currentIndex>0?this._trajectoryTransforms[this.currentIndex-1]:null}get motionless(){return this._motionless}get transitionMode(){return this._transitionMode}move(t){}moveTo(t){}rotate(t){}rotateUnbounded(t){}rotateWithoutInertia(t){}rotateBasic(t){}rotateBasicUnbounded(t){}rotateBasicWithoutInertia(t){}rotateToBasic(t){}setSpeed(t){}zoomIn(t,e){}update(t){}setCenter(t){}setZoom(t){}dolly(t){}orbit(t){}setViewMatrix(t){}truck(t){}append(t){if(t.length<1)throw Error("Trajectory can not be empty");this._currentIndex<0?this.set(t):(this._trajectory=this._trajectory.concat(t),this._appendToTrajectories(t))}prepend(t){if(t.length<1)throw Error("Trajectory can not be empty");this._trajectory=t.slice().concat(this._trajectory),this._currentIndex+=t.length,this._setCurrentImage(),this._setReference(this._currentImage)?this._setTrajectories():this._prependToTrajectories(t),this._setCurrentCamera()}remove(t){if(t<0)throw Error("n must be a positive integer");if(this._currentIndex-1<t)throw Error("Current and previous images can not be removed");for(let e=0;e<t;e++)this._trajectory.shift(),this._trajectoryTransforms.shift(),this._trajectoryCameras.shift(),this._currentIndex--;this._setCurrentImage()}clearPrior(){this._currentIndex>0&&this.remove(this._currentIndex-1)}clear(){this.cut(),this._currentIndex>0&&this.remove(this._currentIndex-1)}cut(){for(;this._trajectory.length-1>this._currentIndex;)this._trajectory.pop(),this._trajectoryTransforms.pop(),this._trajectoryCameras.pop()}set(t){this._setTrajectory(t),this._setCurrentImage(),this._setReference(this._currentImage),this._setTrajectories(),this._setCurrentCamera()}getCenter(){return null!=this._currentImage?this.currentTransform.projectBasic(this._camera.lookat.toArray()):[.5,.5]}setTransitionMode(t){this._transitionMode=t}_getAlpha(){return 1}_setCurrent(){this._setCurrentImage(),this._setReference(this._currentImage)&&this._setTrajectories(),this._setCurrentCamera()}_setCurrentCamera(){this._currentCamera=this._trajectoryCameras[this._currentIndex].clone(),this._previousCamera=this._currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}_motionlessTransition(){return null!=this._currentImage&&null!=this._previousImage&&(this._transitionMode===t.TransitionMode.Instantaneous||!(this._currentImage.merged&&this._previousImage.merged&&this._withinOriginalDistance()&&this._sameConnectedComponent()))}_setReference(t){return!(Math.abs(t.lngLat.lat-this.reference.lat)<this._referenceThreshold&&Math.abs(t.lngLat.lng-this.reference.lng)<this._referenceThreshold)&&(!(null!=this._previousImage&&!this._motionlessTransition())&&(this._reference.lat=t.lngLat.lat,this._reference.lng=t.lngLat.lng,this._reference.alt=t.computedAltitude,!0))}_setCurrentImage(){this._currentImage=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousImage=this._currentIndex>0?this._trajectory[this._currentIndex-1]:null}_setTrajectory(t){if(t.length<1)throw new hd("Trajectory can not be empty");null!=this._currentImage?(this._trajectory=[this._currentImage].concat(t),this._currentIndex=1):(this._trajectory=t.slice(),this._currentIndex=0)}_setTrajectories(){this._trajectoryTransforms.length=0,this._trajectoryCameras.length=0,this._appendToTrajectories(this._trajectory)}_appendToTrajectories(t){for(let e of t){if(!e.assetsCached)throw new hd("Assets must be cached when image is added to trajectory");let t=this._imageToTranslation(e,this.reference),i=new Hd(e.exifOrientation,e.width,e.height,e.scale,e.rotation,t,e.image,void 0,e.cameraParameters,e.cameraType);this._trajectoryTransforms.push(i),this._trajectoryCameras.push(new jd(i))}}_prependToTrajectories(t){for(let e of t.reverse()){if(!e.assetsCached)throw new hd("Assets must be cached when added to trajectory");let t=this._imageToTranslation(e,this.reference),i=new Hd(e.exifOrientation,e.width,e.height,e.scale,e.rotation,t,e.image,void 0,e.cameraParameters,e.cameraType);this._trajectoryTransforms.unshift(i),this._trajectoryCameras.unshift(new jd(i))}}_imageToTranslation(t,e){return fd({alt:t.computedAltitude,lat:t.lngLat.lat,lng:t.lngLat.lng},t.rotation,e)}_sameConnectedComponent(){let t=this._currentImage,e=this._previousImage;return!!t&&!!e&&t.mergeId===e.mergeId}_withinOriginalDistance(){let t=this._currentImage,e=this._previousImage;return!t||!e||this._spatial.distanceFromLngLat(t.originalLngLat.lng,t.originalLngLat.lat,e.originalLngLat.lng,e.originalLngLat.lat)<25}}class Vd{constructor(t,e){this._phi=t,this._theta=e}get phi(){return this._phi}set phi(t){this._phi=t}get theta(){return this._theta}set theta(t){this._theta=t}get isZero(){return 0===this._phi&&0===this._theta}copy(t){this._phi=t.phi,this._theta=t.theta}lerp(t,e){this._phi=(1-e)*this._phi+e*t.phi,this._theta=(1-e)*this._theta+e*t.theta}multiply(t){this._phi*=t,this._theta*=t}threshold(t){this._phi=Math.abs(this._phi)>t?this._phi:0,this._theta=Math.abs(this._theta)>t?this._theta:0}lengthSquared(){return this._phi*this._phi+this._theta*this._theta}reset(){this._phi=0,this._theta=0}}class Gd extends Ud{constructor(t){super(t),this._animationSpeed=1/40,this._rotationDelta=new Vd(0,0),this._requestedRotationDelta=null,this._basicRotation=[0,0],this._requestedBasicRotation=null,this._requestedBasicRotationUnbounded=null,this._rotationAcceleration=.86,this._rotationIncreaseAlpha=.97,this._rotationDecreaseAlpha=.9,this._rotationThreshold=.001,this._unboundedRotationAlpha=.8,this._desiredZoom=t.zoom,this._minZoom=0,this._maxZoom=3,this._lookatDepth=10,this._desiredLookat=null,this._desiredCenter=null}rotate(t){null!=this._currentImage&&(0===t.phi&&0===t.theta||(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,null!=this._requestedRotationDelta?(this._requestedRotationDelta.phi=this._requestedRotationDelta.phi+t.phi,this._requestedRotationDelta.theta=this._requestedRotationDelta.theta+t.theta):this._requestedRotationDelta=new Vd(t.phi,t.theta)))}rotateUnbounded(t){if(null==this._currentImage)return;if(this._requestedBasicRotation=null,this._requestedRotationDelta=null,this._applyRotation(t,this._currentCamera),this._applyRotation(t,this._previousCamera),!this._desiredLookat)return;const e=(new pn).setFromUnitVectors(this._currentCamera.up,new fn(0,0,1)),i=e.clone().invert(),n=(new fn).copy(this._desiredLookat).sub(this._camera.position).applyQuaternion(e),r=n.length();let s=Math.atan2(n.y,n.x);s+=t.phi;let o=Math.atan2(Math.sqrt(n.x*n.x+n.y*n.y),n.z);o+=t.theta,o=Math.max(.1,Math.min(Math.PI-.1,o)),n.x=Math.sin(o)*Math.cos(s),n.y=Math.sin(o)*Math.sin(s),n.z=Math.cos(o),n.applyQuaternion(i),this._desiredLookat.copy(this._camera.position).add(n.multiplyScalar(r))}rotateWithoutInertia(t){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,this._requestedRotationDelta=null;const e=Math.PI/(10*Math.pow(2,this._zoom)),i={phi:this._spatial.clamp(t.phi,-e,e),theta:this._spatial.clamp(t.theta,-e,e)};this._applyRotation(i,this._currentCamera),this._applyRotation(i,this._previousCamera)}rotateBasic(t){if(null!=this._currentImage)if(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,null!=this._requestedBasicRotation){this._requestedBasicRotation[0]+=t[0],this._requestedBasicRotation[1]+=t[1];let e=.05/Math.pow(2,this._zoom);this._requestedBasicRotation[0]=this._spatial.clamp(this._requestedBasicRotation[0],-e,e),this._requestedBasicRotation[1]=this._spatial.clamp(this._requestedBasicRotation[1],-e,e)}else this._requestedBasicRotation=t.slice()}rotateBasicUnbounded(t){null!=this._currentImage&&(null!=this._requestedBasicRotationUnbounded?(this._requestedBasicRotationUnbounded[0]+=t[0],this._requestedBasicRotationUnbounded[1]+=t[1]):this._requestedBasicRotationUnbounded=t.slice())}rotateBasicWithoutInertia(t){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null;const e=.05/Math.pow(2,this._zoom),i=t.slice();i[0]=this._spatial.clamp(i[0],-e,e),i[1]=this._spatial.clamp(i[1],-e,e),this._applyRotationBasic(i)}rotateToBasic(t){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,t[0]=this._spatial.clamp(t[0],0,1),t[1]=this._spatial.clamp(t[1],0,1);let e=this.currentTransform.unprojectBasic(t,this._lookatDepth);this._currentCamera.lookat.fromArray(e)}zoomIn(t,e){if(null==this._currentImage)return;this._desiredZoom=Math.max(this._minZoom,Math.min(this._maxZoom,this._desiredZoom+t));let i=this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()),n=i[0],r=i[1],s=Math.pow(2,this._zoom),o=Math.pow(2,this._desiredZoom),a=e[0],c=e[1];dd(this.currentTransform.cameraType)&&(a-n>.5?a-=1:n-a>.5&&(a=1+a));let h=a-s/o*(a-n),l=c-s/o*(c-r);dd(this._currentImage.cameraType)?(h=this._spatial.wrap(h+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],.05,.95)):(h=this._spatial.clamp(h,0,1),l=this._spatial.clamp(l,0,1)),this._desiredLookat=(new fn).fromArray(this.currentTransform.unprojectBasic([h,l],this._lookatDepth))}setCenter(t){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._desiredZoom=this._zoom;let e=[this._spatial.clamp(t[0],0,1),this._spatial.clamp(t[1],0,1)];if(null==this._currentImage)return void(this._desiredCenter=e);this._desiredCenter=null;let i=(new fn).fromArray(this.currentTransform.unprojectBasic(e,this._lookatDepth)),n=null!=this.previousTransform?this.previousTransform:this.currentTransform,r=(new fn).fromArray(n.unprojectBasic(e,this._lookatDepth));this._currentCamera.lookat.copy(i),this._previousCamera.lookat.copy(r)}setZoom(t){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._zoom=this._spatial.clamp(t,this._minZoom,this._maxZoom),this._desiredZoom=this._zoom}_applyRotation(t,e){if(null==e)return;let i=(new pn).setFromUnitVectors(e.up,new fn(0,0,1)),n=i.clone().invert(),r=new fn;r.copy(e.lookat).sub(e.position),r.applyQuaternion(i);let s=r.length(),o=Math.atan2(r.y,r.x);o+=t.phi;let a=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);a+=t.theta,a=Math.max(.1,Math.min(Math.PI-.1,a)),r.x=Math.sin(a)*Math.cos(o),r.y=Math.sin(a)*Math.sin(o),r.z=Math.cos(a),r.applyQuaternion(n),e.lookat.copy(e.position).add(r.multiplyScalar(s))}_applyRotationBasic(t){let e=this._currentImage,i=null!=this._previousImage?this.previousImage:this.currentImage,n=this._currentCamera,r=this._previousCamera,s=this.currentTransform,o=null!=this.previousTransform?this.previousTransform:this.currentTransform,a=s.projectBasic(n.lookat.toArray()),c=o.projectBasic(r.lookat.toArray());dd(e.cameraType)?(a[0]=this._spatial.wrap(a[0]+t[0],0,1),a[1]=this._spatial.clamp(a[1]+t[1],.05,.95)):(a[0]=this._spatial.clamp(a[0]+t[0],0,1),a[1]=this._spatial.clamp(a[1]+t[1],0,1)),dd(i.cameraType)?(c[0]=this._spatial.wrap(c[0]+t[0],0,1),c[1]=this._spatial.clamp(c[1]+t[1],.05,.95)):(c[0]=this._spatial.clamp(c[0]+t[0],0,1),c[1]=this._spatial.clamp(a[1]+t[1],0,1));let h=s.unprojectBasic(a,this._lookatDepth);n.lookat.fromArray(h);let l=o.unprojectBasic(c,this._lookatDepth);r.lookat.fromArray(l)}_updateZoom(t){let e=this._desiredZoom-this._zoom,i=e>0?1:e<0?-1:0;0!==e&&(Math.abs(e)<.002?(this._zoom=this._desiredZoom,null!=this._desiredLookat&&(this._desiredLookat=null)):this._zoom+=i*Math.max(Math.abs(5*t*e),.002))}_updateLookat(t){if(null===this._desiredLookat)return;let e=this._desiredLookat.distanceToSquared(this._currentCamera.lookat);Math.abs(e)<1e-6?(this._currentCamera.lookat.copy(this._desiredLookat),this._desiredLookat=null):this._currentCamera.lookat.lerp(this._desiredLookat,5*t)}_updateRotation(){if(null!=this._requestedRotationDelta){let t=this._rotationDelta.lengthSquared();return this._requestedRotationDelta.lengthSquared()>t?this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationIncreaseAlpha):this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationDecreaseAlpha),void(this._requestedRotationDelta=null)}if(this._rotationDelta.isZero)return;const t=dd(this.currentImage.cameraType)?1:this._alpha;this._rotationDelta.multiply(this._rotationAcceleration*t),this._rotationDelta.threshold(this._rotationThreshold)}_updateRotationBasic(){if(null!=this._requestedBasicRotation){let t=this._basicRotation[0],e=this._basicRotation[1],i=this._requestedBasicRotation[0],n=this._requestedBasicRotation[1];return Math.abs(i)>Math.abs(t)?this._basicRotation[0]=(1-this._rotationIncreaseAlpha)*t+this._rotationIncreaseAlpha*i:this._basicRotation[0]=(1-this._rotationDecreaseAlpha)*t+this._rotationDecreaseAlpha*i,Math.abs(n)>Math.abs(e)?this._basicRotation[1]=(1-this._rotationIncreaseAlpha)*e+this._rotationIncreaseAlpha*n:this._basicRotation[1]=(1-this._rotationDecreaseAlpha)*e+this._rotationDecreaseAlpha*n,void(this._requestedBasicRotation=null)}if(null!=this._requestedBasicRotationUnbounded){let t=this._requestedBasicRotationUnbounded[0],e=this._requestedBasicRotationUnbounded[1];if(Math.abs(t)>0&&(this._basicRotation[0]=(1-this._unboundedRotationAlpha)*this._basicRotation[0]+this._unboundedRotationAlpha*t),Math.abs(e)>0&&(this._basicRotation[1]=(1-this._unboundedRotationAlpha)*this._basicRotation[1]+this._unboundedRotationAlpha*e),null!=this._desiredLookat){let i=this.currentTransform.projectBasic(this._desiredLookat.toArray());i[0]+=t,i[1]+=e,this._desiredLookat=(new fn).fromArray(this.currentTransform.unprojectBasic(i,this._lookatDepth))}this._requestedBasicRotationUnbounded=null}0===this._basicRotation[0]&&0===this._basicRotation[1]||(this._basicRotation[0]=this._rotationAcceleration*this._basicRotation[0],this._basicRotation[1]=this._rotationAcceleration*this._basicRotation[1],Math.abs(this._basicRotation[0])<this._rotationThreshold/Math.pow(2,this._zoom)&&Math.abs(this._basicRotation[1])<this._rotationThreshold/Math.pow(2,this._zoom)&&(this._basicRotation=[0,0]))}_clearRotation(){dd(this._currentImage.cameraType)||(null!=this._requestedRotationDelta&&(this._requestedRotationDelta=null),this._rotationDelta.isZero||this._rotationDelta.reset(),null!=this._requestedBasicRotation&&(this._requestedBasicRotation=null),(this._basicRotation[0]>0||this._basicRotation[1]>0)&&(this._basicRotation=[0,0]))}_setDesiredCenter(){if(null==this._desiredCenter)return;let t=(new fn).fromArray(this.currentTransform.unprojectBasic(this._desiredCenter,this._lookatDepth)).sub(this._currentCamera.position);this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(t)),this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(t)),this._desiredCenter=null}_setDesiredZoom(){this._desiredZoom=dd(this._currentImage.cameraType)||null==this._previousImage?this._zoom:0}}class qd extends Gd{constructor(t){super(t),this._adjustCameras(),this._motionless=this._motionlessTransition(),this._baseAlpha=this._alpha,this._speedCoefficient=1,this._unitBezier=new qd._interpolator(.74,.67,.38,.96),this._useBezier=!1}static register(t){qd._interpolator=t}append(t){let e=0===this._trajectory.length;e&&this._resetTransition(),super.append(t),e&&(this._setDesiredCenter(),this._setDesiredZoom())}prepend(t){let e=0===this._trajectory.length;e&&this._resetTransition(),super.prepend(t),e&&(this._setDesiredCenter(),this._setDesiredZoom())}set(t){super.set(t),this._desiredLookat=null,this._resetTransition(),this._clearRotation(),this._setDesiredCenter(),this._setDesiredZoom(),this._trajectory.length<3&&(this._useBezier=!0)}setSpeed(t){this._speedCoefficient=this._spatial.clamp(t,0,10)}update(t){1===this._alpha&&this._currentIndex+this._alpha<this._trajectory.length&&(this._currentIndex+=1,this._useBezier=this._trajectory.length<3&&this._currentIndex+1===this._trajectory.length,this._setCurrent(),this._resetTransition(),this._clearRotation(),this._desiredZoom=dd(this._currentImage.cameraType)?this._zoom:0,this._desiredLookat=null);let e=this._animationSpeed*(60/t);this._baseAlpha=Math.min(1,this._baseAlpha+this._speedCoefficient*e),this._useBezier?this._alpha=this._unitBezier.solve(this._baseAlpha):this._alpha=this._baseAlpha,this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._rotationDelta,this._previousCamera),this._applyRotation(this._rotationDelta,this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation),this._updateZoom(e),this._updateLookat(e),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.ceil(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null==this._previousImage)return;let t=this._camera.lookat.clone().sub(this._camera.position);this._previousCamera.lookat.copy(t.clone().add(this._previousCamera.position)),dd(this._currentImage.cameraType)&&this._currentCamera.lookat.copy(t.clone().add(this._currentCamera.position))}_resetTransition(){this._alpha=0,this._baseAlpha=0,this._motionless=this._motionlessTransition()}}class Wd{constructor(t,e){this._components={};for(const i in Wd.registeredComponents){if(!Wd.registeredComponents.hasOwnProperty(i))continue;const n=Wd.registeredComponents[i];this._components[i]={active:!1,component:new n(i,t,e)}}this._coverComponent=new Wd.registeredCoverComponent("cover",t,e),this._coverComponent.activate(),this._coverActivated=!0}static register(t){void 0===Wd.registeredComponents[t.componentName]&&(Wd.registeredComponents[t.componentName]=t)}static registerCover(t){Wd.registeredCoverComponent=t}get coverActivated(){return this._coverActivated}activateCover(){if(!this._coverActivated){this._coverActivated=!0;for(const t in this._components){if(!this._components.hasOwnProperty(t))continue;const e=this._components[t];e.active&&e.component.deactivate()}}}deactivateCover(){if(this._coverActivated){this._coverActivated=!1;for(const t in this._components){if(!this._components.hasOwnProperty(t))continue;const e=this._components[t];e.active&&e.component.activate()}}}activate(t){this._checkName(t),this._components[t].active=!0,this._coverActivated||this.get(t).activate()}configure(t,e){this._checkName(t),this.get(t).configure(e)}deactivate(t){this._checkName(t),this._components[t].active=!1,this._coverActivated||this.get(t).deactivate()}get(t){return this._components[t].component}getCover(){return this._coverComponent}remove(){this._coverComponent.deactivate();for(const t in this._components)this._components.hasOwnProperty(t)&&this._components[t].component.deactivate()}_checkName(t){if(!(t in this._components))throw new hd(`Component does not exist: ${t}`)}}Wd.registeredComponents={};var Xd=Array.isArray,Yd=Object.prototype.toString,Zd=Xd||function(t){return"[object Array]"===Yd.call(t)};var Jd="2";Qd.NONE=0,Qd.VTEXT=1,Qd.VNODE=2,Qd.WIDGET=3,Qd.PROPS=4,Qd.ORDER=5,Qd.INSERT=6,Qd.REMOVE=7,Qd.THUNK=8;var Kd=Qd;function Qd(t,e,i){this.type=Number(t),this.vNode=e,this.patch=i}Qd.prototype.version=Jd,Qd.prototype.type="VirtualPatch";var tp=function(t){return t&&"VirtualNode"===t.type&&t.version===Jd};var ep=function(t){return t&&"VirtualText"===t.type&&t.version===Jd};var ip=function(t){return t&&"Widget"===t.type};var np=function(t){return t&&"Thunk"===t.type};var rp=function(t,e){var i=t,n=e;np(e)&&(n=sp(e,t));np(t)&&(i=sp(t,null));return{a:i,b:n}};function sp(t,e){var i=t.vnode;if(i||(i=t.vnode=t.render(e)),!(tp(i)||ep(i)||ip(i)))throw new Error("thunk did not return a valid node");return i}var op=function(t){return"object"==typeof t&&null!==t},ap=function(t){return t&&("function"==typeof t.hook&&!t.hasOwnProperty("hook")||"function"==typeof t.unhook&&!t.hasOwnProperty("unhook"))};var cp=function t(e,i){var n;for(var r in e){r in i||((n=n||{})[r]=void 0);var s=e[r],o=i[r];if(s!==o)if(op(s)&&op(o))if(hp(o)!==hp(s))(n=n||{})[r]=o;else if(ap(o))(n=n||{})[r]=o;else{var a=t(s,o);a&&((n=n||{})[r]=a)}else(n=n||{})[r]=o}for(var c in i)c in e||((n=n||{})[c]=i[c]);return n};function hp(t){return Object.getPrototypeOf?Object.getPrototypeOf(t):t.__proto__?t.__proto__:t.constructor?t.constructor.prototype:void 0}function lp(t,e){var i={a:t};return up(t,e,i,0),i}function up(t,e,i,n){if(t!==e){var r=i[n],s=!1;if(np(t)||np(e))fp(t,e,i,n);else if(null==e)ip(t)||(dp(t,i,n),r=i[n]),r=vp(r,new Kd(Kd.REMOVE,t,e));else if(tp(e))if(tp(t))if(t.tagName===e.tagName&&t.namespace===e.namespace&&t.key===e.key){var o=cp(t.properties,e.properties);o&&(r=vp(r,new Kd(Kd.PROPS,t,o))),r=function(t,e,i,n,r){for(var s=t.children,o=function(t,e){var i=_p(e),n=i.keys,r=i.free;if(r.length===e.length)return{children:e,moves:null};var s=_p(t),o=s.keys;if(s.free.length===t.length)return{children:e,moves:null};for(var a=[],c=0,h=r.length,l=0,u=0;u<t.length;u++){var d,p=t[u];p.key?n.hasOwnProperty(p.key)?(d=n[p.key],a.push(e[d])):(d=u-l++,a.push(null)):c<h?(d=r[c++],a.push(e[d])):(d=u-l++,a.push(null))}for(var f=c>=r.length?e.length:r[c],m=0;m<e.length;m++){var g=e[m];g.key?o.hasOwnProperty(g.key)||a.push(g):m>=f&&a.push(g)}for(var _,v=a.slice(),y=0,b=[],x=[],w=0;w<e.length;){var S=e[w];for(_=v[y];null===_&&v.length;)b.push(gp(v,y,null)),_=v[y];_&&_.key===S.key?(y++,w++):S.key?(_&&_.key&&n[_.key]!==w+1?(b.push(gp(v,y,_.key)),(_=v[y])&&_.key===S.key?y++:x.push({key:S.key,to:w})):x.push({key:S.key,to:w}),w++):_&&_.key&&b.push(gp(v,y,_.key))}for(;y<v.length;)_=v[y],b.push(gp(v,y,_&&_.key));if(b.length===l&&!x.length)return{children:a,moves:null};return{children:a,moves:{removes:b,inserts:x}}}(s,e.children),a=o.children,c=s.length,h=a.length,l=c>h?c:h,u=0;u<l;u++){var d=s[u],p=a[u];r+=1,d?up(d,p,i,r):p&&(n=vp(n,new Kd(Kd.INSERT,null,p))),tp(d)&&d.count&&(r+=d.count)}o.moves&&(n=vp(n,new Kd(Kd.ORDER,t,o.moves)));return n}(t,e,i,r,n)}else r=vp(r,new Kd(Kd.VNODE,t,e)),s=!0;else r=vp(r,new Kd(Kd.VNODE,t,e)),s=!0;else ep(e)?ep(t)?t.text!==e.text&&(r=vp(r,new Kd(Kd.VTEXT,t,e))):(r=vp(r,new Kd(Kd.VTEXT,t,e)),s=!0):ip(e)&&(ip(t)||(s=!0),r=vp(r,new Kd(Kd.WIDGET,t,e)));r&&(i[n]=r),s&&dp(t,i,n)}}function dp(t,e,i){mp(t,e,i),pp(t,e,i)}function pp(t,e,i){if(ip(t))"function"==typeof t.destroy&&(e[i]=vp(e[i],new Kd(Kd.REMOVE,t,null)));else if(tp(t)&&(t.hasWidgets||t.hasThunks))for(var n=t.children,r=n.length,s=0;s<r;s++){var o=n[s];pp(o,e,i+=1),tp(o)&&o.count&&(i+=o.count)}else np(t)&&fp(t,null,e,i)}function fp(t,e,i,n){var r=rp(t,e),s=lp(r.a,r.b);(function(t){for(var e in t)if("a"!==e)return!0;return!1})(s)&&(i[n]=new Kd(Kd.THUNK,null,s))}function mp(t,e,i){if(tp(t)){if(t.hooks&&(e[i]=vp(e[i],new Kd(Kd.PROPS,t,function(t){var e={};for(var i in t)e[i]=void 0;return e}(t.hooks)))),t.descendantHooks||t.hasThunks)for(var n=t.children,r=n.length,s=0;s<r;s++){var o=n[s];mp(o,e,i+=1),tp(o)&&o.count&&(i+=o.count)}}else np(t)&&fp(t,null,e,i)}function gp(t,e,i){return t.splice(e,1),{from:e,key:i}}function _p(t){for(var e={},i=[],n=t.length,r=0;r<n;r++){var s=t[r];s.key?e[s.key]=r:i.push(r)}return{keys:e,free:i}}function vp(t,e){return t?(Zd(t)?t.push(e):t=[t,e],t):e}var yp=lp,bp="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function xp(t){if(t.__esModule)return t;var e=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(i){var n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,n.get?n:{enumerable:!0,get:function(){return t[i]}})})),e}function wp(t){var e={exports:{}};return t(e,e.exports),e.exports}var Sp=Array.prototype.slice,Mp=function(t,e){"length"in t||(t=[t]);t=Sp.call(t);for(;t.length;){var i=t.shift(),n=e(i);if(n)return n;i.childNodes&&i.childNodes.length&&(t=Sp.call(i.childNodes).concat(t))}};var Tp=Cp;function Cp(t,e){if(!(this instanceof Cp))return new Cp(t,e);this.data=t,this.nodeValue=t,this.length=t.length,this.ownerDocument=e||null}Cp.prototype.nodeType=8,Cp.prototype.nodeName="#comment",Cp.prototype.toString=function(){return"[object Comment]"};var Ep=Ip;function Ip(t,e){if(!(this instanceof Ip))return new Ip(t);this.data=t||"",this.length=this.data.length,this.ownerDocument=e||null}Ip.prototype.type="DOMTextNode",Ip.prototype.nodeType=3,Ip.prototype.nodeName="#text",Ip.prototype.toString=function(){return this.data},Ip.prototype.replaceData=function(t,e,i){var n=this.data,r=n.substring(0,t),s=n.substring(t+e,n.length);this.data=r+i+s,this.length=this.data.length};var Ap=function(t){var e=this,i=t.type;t.target||(t.target=e);e.listeners||(e.listeners={});var n=e.listeners[i];if(n)return n.forEach((function(i){t.currentTarget=e,"function"==typeof i?i(t):i.handleEvent(t)}));e.parentNode&&e.parentNode.dispatchEvent(t)};var Pp=function(t,e){var i=this;i.listeners||(i.listeners={});i.listeners[t]||(i.listeners[t]=[]);-1===i.listeners[t].indexOf(e)&&i.listeners[t].push(e)};var Rp=function(t,e){var i=this;if(!i.listeners)return;if(!i.listeners[t])return;var n=i.listeners[t],r=n.indexOf(e);-1!==r&&n.splice(r,1)};var Lp=Np,Op=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];function Np(t){switch(t.nodeType){case 3:return kp(t.data);case 8:return"\x3c!--"+t.data+"--\x3e";default:return function(t){var e=[],i=t.tagName;"http://www.w3.org/1999/xhtml"===t.namespaceURI&&(i=i.toLowerCase());e.push("<"+i+function(t){var e=[];for(var i in t)Dp(t,i)&&e.push({name:i,value:t[i]});for(var n in t._attributes)for(var r in t._attributes[n]){var s=t._attributes[n][r],o=(s.prefix?s.prefix+":":"")+r;e.push({name:o,value:s.value})}t.className&&e.push({name:"class",value:t.className});return e.length?$p(e):""}(t)+function(t){var e=t.dataset,i=[];for(var n in e)i.push({name:"data-"+n,value:e[n]});return i.length?$p(i):""}(t)),Op.indexOf(i)>-1?e.push(" />"):(e.push(">"),t.childNodes.length?e.push.apply(e,t.childNodes.map(Np)):t.textContent||t.innerText?e.push(kp(t.textContent||t.innerText)):t.innerHTML&&e.push(t.innerHTML),e.push("</"+i+">"));return e.join("")}(t)}}function Dp(t,e){var i=typeof t[e];return"style"===e&&Object.keys(t.style).length>0||t.hasOwnProperty(e)&&("string"===i||"boolean"===i||"number"===i)&&"nodeName"!==e&&"className"!==e&&"tagName"!==e&&"textContent"!==e&&"innerText"!==e&&"namespaceURI"!==e&&"innerHTML"!==e}function $p(t){var e=[];return t.forEach((function(t){var i=t.name,n=t.value;"style"===i&&(n=function(t){if("string"==typeof t)return t;var e="";return Object.keys(t).forEach((function(i){var n=t[i];i=i.replace(/[A-Z]/g,(function(t){return"-"+t.toLowerCase()})),e+=i+":"+n+";"})),e}(n)),e.push(i+'="'+(kp(n).replace(/"/g,"&quot;")+'"'))})),e.length?" "+e.join(" "):""}function kp(t){var e="";return"string"==typeof t?e=t:t&&(e=t.toString()),e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var zp="http://www.w3.org/1999/xhtml",Fp=Bp;function Bp(t,e,i){if(!(this instanceof Bp))return new Bp(t);var n=void 0===i?zp:i||null;this.tagName=n===zp?String(t).toUpperCase():t,this.nodeName=this.tagName,this.className="",this.dataset={},this.childNodes=[],this.parentNode=null,this.style={},this.ownerDocument=e||null,this.namespaceURI=n,this._attributes={},"INPUT"===this.tagName&&(this.type="text")}Bp.prototype.type="DOMElement",Bp.prototype.nodeType=1,Bp.prototype.appendChild=function(t){return t.parentNode&&t.parentNode.removeChild(t),this.childNodes.push(t),t.parentNode=this,t},Bp.prototype.replaceChild=function(t,e){t.parentNode&&t.parentNode.removeChild(t);var i=this.childNodes.indexOf(e);return e.parentNode=null,this.childNodes[i]=t,t.parentNode=this,e},Bp.prototype.removeChild=function(t){var e=this.childNodes.indexOf(t);return this.childNodes.splice(e,1),t.parentNode=null,t},Bp.prototype.insertBefore=function(t,e){t.parentNode&&t.parentNode.removeChild(t);var i=null==e?-1:this.childNodes.indexOf(e);return i>-1?this.childNodes.splice(i,0,t):this.childNodes.push(t),t.parentNode=this,t},Bp.prototype.setAttributeNS=function(t,e,i){var n=null,r=e,s=e.indexOf(":");(s>-1&&(n=e.substr(0,s),r=e.substr(s+1)),"INPUT"===this.tagName&&"type"===e)?this.type=i:(this._attributes[t]||(this._attributes[t]={}))[r]={value:i,prefix:n}},Bp.prototype.getAttributeNS=function(t,e){var i=this._attributes[t],n=i&&i[e]&&i[e].value;return"INPUT"===this.tagName&&"type"===e?this.type:"string"!=typeof n?null:n},Bp.prototype.removeAttributeNS=function(t,e){var i=this._attributes[t];i&&delete i[e]},Bp.prototype.hasAttributeNS=function(t,e){var i=this._attributes[t];return!!i&&e in i},Bp.prototype.setAttribute=function(t,e){return this.setAttributeNS(null,t,e)},Bp.prototype.getAttribute=function(t){return this.getAttributeNS(null,t)},Bp.prototype.removeAttribute=function(t){return this.removeAttributeNS(null,t)},Bp.prototype.hasAttribute=function(t){return this.hasAttributeNS(null,t)},Bp.prototype.removeEventListener=Rp,Bp.prototype.addEventListener=Pp,Bp.prototype.dispatchEvent=Ap,Bp.prototype.focus=function(){},Bp.prototype.toString=function(){return Lp(this)},Bp.prototype.getElementsByClassName=function(t){var e=t.split(" "),i=[];return Mp(this,(function(t){if(1===t.nodeType){var n=(t.className||"").split(" ");e.every((function(t){return-1!==n.indexOf(t)}))&&i.push(t)}})),i},Bp.prototype.getElementsByTagName=function(t){t=t.toLowerCase();var e=[];return Mp(this.childNodes,(function(i){1!==i.nodeType||"*"!==t&&i.tagName.toLowerCase()!==t||e.push(i)})),e},Bp.prototype.contains=function(t){return Mp(this,(function(e){return t===e}))||!1};var jp=Hp;function Hp(t){if(!(this instanceof Hp))return new Hp;this.childNodes=[],this.parentNode=null,this.ownerDocument=t||null}Hp.prototype.type="DocumentFragment",Hp.prototype.nodeType=11,Hp.prototype.nodeName="#document-fragment",Hp.prototype.appendChild=Fp.prototype.appendChild,Hp.prototype.replaceChild=Fp.prototype.replaceChild,Hp.prototype.removeChild=Fp.prototype.removeChild,Hp.prototype.toString=function(){return this.childNodes.map((function(t){return String(t)})).join("")};var Up=Vp;function Vp(t){}Vp.prototype.initEvent=function(t,e,i){this.type=t,this.bubbles=e,this.cancelable=i},Vp.prototype.preventDefault=function(){};var Gp=qp;function qp(){if(!(this instanceof qp))return new qp;this.head=this.createElement("head"),this.body=this.createElement("body"),this.documentElement=this.createElement("html"),this.documentElement.appendChild(this.head),this.documentElement.appendChild(this.body),this.childNodes=[this.documentElement],this.nodeType=9}var Wp=qp.prototype;Wp.createTextNode=function(t){return new Ep(t,this)},Wp.createElementNS=function(t,e){var i=null===t?null:String(t);return new Fp(e,this,i)},Wp.createElement=function(t){return new Fp(t,this)},Wp.createDocumentFragment=function(){return new jp(this)},Wp.createEvent=function(t){return new Up(t)},Wp.createComment=function(t){return new Tp(t,this)},Wp.getElementById=function(t){return t=String(t),Mp(this.childNodes,(function(e){if(String(e.id)===t)return e}))||null},Wp.getElementsByClassName=Fp.prototype.getElementsByClassName,Wp.getElementsByTagName=Fp.prototype.getElementsByTagName,Wp.contains=Fp.prototype.contains,Wp.removeEventListener=Rp,Wp.addEventListener=Pp,Wp.dispatchEvent=Ap;var Xp,Yp=new Gp,Zp=void 0!==bp?bp:"undefined"!=typeof window?window:{};"undefined"!=typeof document?Xp=document:(Xp=Zp["__GLOBAL_DOCUMENT_CACHE@4"])||(Xp=Zp["__GLOBAL_DOCUMENT_CACHE@4"]=Yp);var Jp=Xp,Kp=function(t,e,i){for(var n in e){var r=e[n];void 0===r?Qp(t,n,r,i):ap(r)?(Qp(t,n,r,i),r.hook&&r.hook(t,n,i?i[n]:void 0)):op(r)?tf(t,e,i,n,r):t[n]=r}};function Qp(t,e,i,n){if(n){var r=n[e];if(ap(r))r.unhook&&r.unhook(t,e,i);else if("attributes"===e)for(var s in r)t.removeAttribute(s);else if("style"===e)for(var o in r)t.style[o]="";else t[e]="string"==typeof r?"":null}}function tf(t,e,i,n,r){var s=i?i[n]:void 0;if("attributes"!==n)if(s&&op(s)&&ef(s)!==ef(r))t[n]=r;else{op(t[n])||(t[n]={});var o="style"===n?"":void 0;for(var a in r){var c=r[a];t[n][a]=void 0===c?o:c}}else for(var h in r){var l=r[h];void 0===l?t.removeAttribute(h):t.setAttribute(h,l)}}function ef(t){return Object.getPrototypeOf?Object.getPrototypeOf(t):t.__proto__?t.__proto__:t.constructor?t.constructor.prototype:void 0}var nf=function t(e,i){var n=i&&i.document||Jp,r=i?i.warn:null;if(e=rp(e).a,ip(e))return e.init();if(ep(e))return n.createTextNode(e.text);if(!tp(e))return r&&r("Item is not a valid virtual dom node",e),null;var s=null===e.namespace?n.createElement(e.tagName):n.createElementNS(e.namespace,e.tagName),o=e.properties;Kp(s,o);for(var a=e.children,c=0;c<a.length;c++){var h=t(a[c],i);h&&s.appendChild(h)}return s};var rf={},sf=function(t,e,i,n){return i&&0!==i.length?(i.sort(cf),of(t,e,i,n,0)):{}};function of(t,e,i,n,r){if(n=n||{},t){af(i,r,r)&&(n[r]=t);var s=e.children;if(s)for(var o=t.childNodes,a=0;a<e.children.length;a++){r+=1;var c=s[a]||rf,h=r+(c.count||0);af(i,r,h)&&of(o[a],c,i,n,r),r=h}}return n}function af(t,e,i){if(0===t.length)return!1;for(var n,r,s=0,o=t.length-1;s<=o;){if(r=t[n=(o+s)/2>>0],s===o)return r>=e&&r<=i;if(r<e)s=n+1;else{if(!(r>i))return!0;o=n-1}}return!1}function cf(t,e){return t>e?1:-1}var hf=function(t,e){if(ip(t)&&ip(e))return"name"in t&&"name"in e?t.id===e.id:t.init===e.init;return!1};var lf=function(t,e,i){var n=t.type,r=t.vNode,s=t.patch;switch(n){case Kd.REMOVE:return function(t,e){var i=t.parentNode;i&&i.removeChild(t);return uf(t,e),null}(e,r);case Kd.INSERT:return function(t,e,i){var n=i.render(e,i);t&&t.appendChild(n);return t}(e,s,i);case Kd.VTEXT:return function(t,e,i,n){var r;if(3===t.nodeType)t.replaceData(0,t.length,i.text),r=t;else{var s=t.parentNode;r=n.render(i,n),s&&r!==t&&s.replaceChild(r,t)}return r}(e,0,s,i);case Kd.WIDGET:return function(t,e,i,n){var r,s=hf(e,i);r=s?i.update(e,t)||t:n.render(i,n);var o=t.parentNode;o&&r!==t&&o.replaceChild(r,t);s||uf(t,e);return r}(e,r,s,i);case Kd.VNODE:return function(t,e,i,n){var r=t.parentNode,s=n.render(i,n);r&&s!==t&&r.replaceChild(s,t);return s}(e,0,s,i);case Kd.ORDER:return function(t,e){for(var i,n,r,s=t.childNodes,o={},a=0;a<e.removes.length;a++)i=s[(n=e.removes[a]).from],n.key&&(o[n.key]=i),t.removeChild(i);for(var c=s.length,h=0;h<e.inserts.length;h++)i=o[(r=e.inserts[h]).key],t.insertBefore(i,r.to>=c++?null:s[r.to])}(e,s),e;case Kd.PROPS:return Kp(e,s,r.properties),e;case Kd.THUNK:return function(t,e){t&&e&&t!==e&&t.parentNode&&t.parentNode.replaceChild(e,t);return e}(e,i.patch(e,s,i));default:return e}};function uf(t,e){"function"==typeof e.destroy&&ip(e)&&e.destroy(t)}function df(t,e,i){var n=function(t){var e=[];for(var i in t)"a"!==i&&e.push(Number(i));return e}(e);if(0===n.length)return t;var r=sf(t,e.a,n),s=t.ownerDocument;i.document||s===Jp||(i.document=s);for(var o=0;o<n.length;o++){var a=n[o];t=pf(t,r[a],e[a],i)}return t}function pf(t,e,i,n){if(!e)return t;var r;if(Zd(i))for(var s=0;s<i.length;s++)r=lf(i[s],e,n),e===t&&(t=r);else r=lf(i,e,n),e===t&&(t=r);return t}var ff=function t(e,i,n){return(n=n||{}).patch=n.patch&&n.patch!==t?n.patch:df,n.render=n.render||nf,n.patch(e,i,n)},mf=vf,gf={},_f=[];function vf(t,e,i,n,r){this.tagName=t,this.properties=e||gf,this.children=i||_f,this.key=null!=n?String(n):void 0,this.namespace="string"==typeof r?r:null;var s,o=i&&i.length||0,a=0,c=!1,h=!1,l=!1;for(var u in e)if(e.hasOwnProperty(u)){var d=e[u];ap(d)&&d.unhook&&(s||(s={}),s[u]=d)}for(var p=0;p<o;p++){var f=i[p];tp(f)?(a+=f.count||0,!c&&f.hasWidgets&&(c=!0),!h&&f.hasThunks&&(h=!0),l||!f.hooks&&!f.descendantHooks||(l=!0)):!c&&ip(f)?"function"==typeof f.destroy&&(c=!0):!h&&np(f)&&(h=!0)}this.count=o+a,this.hasWidgets=c,this.hasThunks=h,this.hooks=s,this.descendantHooks=l}vf.prototype.version=Jd,vf.prototype.type="VirtualNode";var yf=bf;function bf(t){this.text=String(t)}bf.prototype.version=Jd,bf.prototype.type="VirtualText";
+/*!
+     * Cross-Browser Split 1.1.1
+     * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
+     * Available under the MIT License
+     * ECMAScript compliant, uniform cross-browser split method
      */
-    ImageSize[ImageSize["Size2048"] = 2048] = "Size2048";
-})(ImageSize = exports.ImageSize || (exports.ImageSize = {}));
-
-},{}],475:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.KeyboardService = void 0;
-var rxjs_1 = require("rxjs");
-var KeyboardService = /** @class */ (function () {
-    function KeyboardService(canvasContainer) {
-        this._keyDown$ = rxjs_1.fromEvent(canvasContainer, "keydown");
-        this._keyUp$ = rxjs_1.fromEvent(canvasContainer, "keyup");
-    }
-    Object.defineProperty(KeyboardService.prototype, "keyDown$", {
-        get: function () {
-            return this._keyDown$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardService.prototype, "keyUp$", {
-        get: function () {
-            return this._keyUp$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return KeyboardService;
-}());
-exports.KeyboardService = KeyboardService;
-exports.default = KeyboardService;
-
-},{"rxjs":43}],476:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.LoadingService = void 0;
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var LoadingService = /** @class */ (function () {
-    function LoadingService() {
-        this._loadersSubject$ = new rxjs_1.Subject();
-        this._loaders$ = this._loadersSubject$.pipe(operators_1.scan(function (loaders, loader) {
-            if (loader.task !== undefined) {
-                loaders[loader.task] = loader.loading;
-            }
-            return loaders;
-        }, {}), operators_1.startWith({}), operators_1.publishReplay(1), operators_1.refCount());
-    }
-    Object.defineProperty(LoadingService.prototype, "loading$", {
-        get: function () {
-            return this._loaders$.pipe(operators_1.map(function (loaders) {
-                for (var key in loaders) {
-                    if (!loaders.hasOwnProperty(key)) {
-                        continue;
-                    }
-                    if (loaders[key]) {
-                        return true;
-                    }
-                }
-                return false;
-            }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
-        },
-        enumerable: false,
-        configurable: true
-    });
-    LoadingService.prototype.taskLoading$ = function (task) {
-        return this._loaders$.pipe(operators_1.map(function (loaders) {
-            return !!loaders[task];
-        }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
-    };
-    LoadingService.prototype.startLoading = function (task) {
-        this._loadersSubject$.next({ loading: true, task: task });
-    };
-    LoadingService.prototype.stopLoading = function (task) {
-        this._loadersSubject$.next({ loading: false, task: task });
-    };
-    return LoadingService;
-}());
-exports.LoadingService = LoadingService;
-exports.default = LoadingService;
-
-},{"rxjs":43,"rxjs/operators":241}],477:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MouseService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var MouseService = /** @class */ (function () {
-    function MouseService(container, canvasContainer, domContainer, doc) {
-        var _this = this;
-        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._claimMouse$ = new rxjs_1.Subject();
-        this._claimWheel$ = new rxjs_1.Subject();
-        this._deferPixelClaims$ = new rxjs_1.Subject();
-        this._deferPixels$ = this._deferPixelClaims$.pipe(operators_1.scan(function (claims, claim) {
-            if (claim.deferPixels == null) {
-                delete claims[claim.name];
-            }
-            else {
-                claims[claim.name] = claim.deferPixels;
-            }
-            return claims;
-        }, {}), operators_1.map(function (claims) {
-            var deferPixelMax = -1;
-            for (var key in claims) {
-                if (!claims.hasOwnProperty(key)) {
-                    continue;
-                }
-                var deferPixels = claims[key];
-                if (deferPixels > deferPixelMax) {
-                    deferPixelMax = deferPixels;
-                }
-            }
-            return deferPixelMax;
-        }), operators_1.startWith(-1), operators_1.publishReplay(1), operators_1.refCount());
-        this._deferPixels$.subscribe(function () { });
-        this._documentMouseMove$ = rxjs_1.fromEvent(doc, "mousemove");
-        this._documentMouseUp$ = rxjs_1.fromEvent(doc, "mouseup");
-        this._mouseDown$ = rxjs_1.fromEvent(canvasContainer, "mousedown");
-        this._mouseLeave$ = rxjs_1.fromEvent(canvasContainer, "mouseleave");
-        this._mouseMove$ = rxjs_1.fromEvent(canvasContainer, "mousemove");
-        this._mouseUp$ = rxjs_1.fromEvent(canvasContainer, "mouseup");
-        this._mouseOut$ = rxjs_1.fromEvent(canvasContainer, "mouseout");
-        this._mouseOver$ = rxjs_1.fromEvent(canvasContainer, "mouseover");
-        this._domMouseDown$ = rxjs_1.fromEvent(domContainer, "mousedown");
-        this._domMouseMove$ = rxjs_1.fromEvent(domContainer, "mousemove");
-        this._click$ = rxjs_1.fromEvent(canvasContainer, "click");
-        this._contextMenu$ = rxjs_1.fromEvent(canvasContainer, "contextmenu");
-        this._dblClick$ = rxjs_1.merge(rxjs_1.fromEvent(container, "click"), rxjs_1.fromEvent(canvasContainer, "dblclick")).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
-            var event1 = events[0];
-            var event2 = events[1];
-            var event3 = events[2];
-            return event1.type === "click" &&
-                event2.type === "click" &&
-                event3.type === "dblclick" &&
-                event1.target.parentNode === canvasContainer &&
-                event2.target.parentNode === canvasContainer;
-        }), operators_1.map(function (events) {
-            return events[2];
-        }), operators_1.share());
-        rxjs_1.merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$)
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._mouseWheel$ = rxjs_1.merge(rxjs_1.fromEvent(canvasContainer, "wheel"), rxjs_1.fromEvent(domContainer, "wheel")).pipe(operators_1.share());
-        this._consistentContextMenu$ = rxjs_1.merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
-            // fire context menu on mouse up both on mac and windows
-            return events[0].type === "mousedown" &&
-                events[1].type === "contextmenu" &&
-                events[2].type === "mouseup";
-        }), operators_1.map(function (events) {
-            return events[1];
-        }), operators_1.share());
-        var dragStop$ = rxjs_1.merge(rxjs_1.fromEvent(window, "blur"), this._documentMouseUp$.pipe(operators_1.filter(function (e) {
-            return e.button === 0;
-        }))).pipe(operators_1.share());
-        var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).pipe(operators_1.share());
-        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).pipe(operators_1.share());
-        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).pipe(operators_1.share());
-        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).pipe(operators_1.share());
-        var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).pipe(operators_1.share());
-        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).pipe(operators_1.share());
-        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).pipe(operators_1.share());
-        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).pipe(operators_1.share());
-        this._proximateClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (mouseDown) {
-            return _this._click$.pipe(operators_1.takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)), operators_1.take(1));
-        }), operators_1.share());
-        this._staticClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (e) {
-            return _this._click$.pipe(operators_1.takeUntil(_this._documentMouseMove$), operators_1.take(1));
-        }), operators_1.share());
-        this._mouseDragStart$.subscribe();
-        this._mouseDrag$.subscribe();
-        this._mouseDragEnd$.subscribe();
-        this._domMouseDragStart$.subscribe();
-        this._domMouseDrag$.subscribe();
-        this._domMouseDragEnd$.subscribe();
-        this._staticClick$.subscribe();
-        this._mouseOwner$ = this._createOwner$(this._claimMouse$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._wheelOwner$ = this._createOwner$(this._claimWheel$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._mouseOwner$.subscribe(function () { });
-        this._wheelOwner$.subscribe(function () { });
-    }
-    Object.defineProperty(MouseService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "documentMouseMove$", {
-        get: function () {
-            return this._documentMouseMove$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "documentMouseUp$", {
-        get: function () {
-            return this._documentMouseUp$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDragStart$", {
-        get: function () {
-            return this._domMouseDragStart$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDrag$", {
-        get: function () {
-            return this._domMouseDrag$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", {
-        get: function () {
-            return this._domMouseDragEnd$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDown$", {
-        get: function () {
-            return this._domMouseDown$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseMove$", {
-        get: function () {
-            return this._domMouseMove$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOwner$", {
-        get: function () {
-            return this._mouseOwner$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDown$", {
-        get: function () {
-            return this._mouseDown$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseMove$", {
-        get: function () {
-            return this._mouseMove$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseLeave$", {
-        get: function () {
-            return this._mouseLeave$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOut$", {
-        get: function () {
-            return this._mouseOut$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOver$", {
-        get: function () {
-            return this._mouseOver$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseUp$", {
-        get: function () {
-            return this._mouseUp$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "click$", {
-        get: function () {
-            return this._click$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "dblClick$", {
-        get: function () {
-            return this._dblClick$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "contextMenu$", {
-        get: function () {
-            return this._consistentContextMenu$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseWheel$", {
-        get: function () {
-            return this._mouseWheel$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragStart$", {
-        get: function () {
-            return this._mouseDragStart$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDrag$", {
-        get: function () {
-            return this._mouseDrag$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
-        get: function () {
-            return this._mouseDragEnd$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "proximateClick$", {
-        get: function () {
-            return this._proximateClick$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "staticClick$", {
-        get: function () {
-            return this._staticClick$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    MouseService.prototype.claimMouse = function (name, zindex) {
-        this._claimMouse$.next({ name: name, zindex: zindex });
-    };
-    MouseService.prototype.unclaimMouse = function (name) {
-        this._claimMouse$.next({ name: name, zindex: null });
-    };
-    MouseService.prototype.deferPixels = function (name, deferPixels) {
-        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });
-    };
-    MouseService.prototype.undeferPixels = function (name) {
-        this._deferPixelClaims$.next({ name: name, deferPixels: null });
-    };
-    MouseService.prototype.claimWheel = function (name, zindex) {
-        this._claimWheel$.next({ name: name, zindex: zindex });
-    };
-    MouseService.prototype.unclaimWheel = function (name) {
-        this._claimWheel$.next({ name: name, zindex: null });
-    };
-    MouseService.prototype.filtered$ = function (name, observable$) {
-        return this._filtered(name, observable$, this._mouseOwner$);
-    };
-    MouseService.prototype.filteredWheel$ = function (name, observable$) {
-        return this._filtered(name, observable$, this._wheelOwner$);
-    };
-    MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) {
-        return mouseMove$.pipe(operators_1.map(function (mouseMove) {
-            var deltaX = mouseMove.clientX - origin.clientX;
-            var deltaY = mouseMove.clientY - origin.clientY;
-            return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];
-        }), operators_1.withLatestFrom(this._deferPixels$), operators_1.filter(function (_a) {
-            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
-            return delta > deferPixels;
-        }), operators_1.map(function (_a) {
-            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
-            return mouseMove;
-        }));
-    };
-    MouseService.prototype._createMouseDrag$ = function (mouseDragStartInitiate$, stop$) {
-        var _this = this;
-        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
-            var mouseDown = _a[0], mouseMove = _a[1];
-            return mouseMove;
-        }), operators_1.switchMap(function (mouseMove) {
-            return rxjs_1.concat(rxjs_1.of(mouseMove), _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$));
-        }));
-    };
-    MouseService.prototype._createMouseDragEnd$ = function (mouseDragStart$, stop$) {
-        return mouseDragStart$.pipe(operators_1.switchMap(function (event) {
-            return stop$.pipe(operators_1.first());
-        }));
-    };
-    MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) {
-        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
-            var mouseDown = _a[0], mouseMove = _a[1];
-            return mouseDown;
-        }));
-    };
-    MouseService.prototype._createMouseDragInitiate$ = function (mouseDown$, stop$, defer) {
-        var _this = this;
-        return mouseDown$.pipe(operators_1.filter(function (mouseDown) {
-            return mouseDown.button === 0;
-        }), operators_1.switchMap(function (mouseDown) {
-            return rxjs_1.combineLatest(rxjs_1.of(mouseDown), defer ?
-                _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) :
-                _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$), operators_1.take(1));
-        }));
-    };
-    MouseService.prototype._createOwner$ = function (claim$) {
-        return claim$.pipe(operators_1.scan(function (claims, claim) {
-            if (claim.zindex == null) {
-                delete claims[claim.name];
-            }
-            else {
-                claims[claim.name] = claim.zindex;
-            }
-            return claims;
-        }, {}), operators_1.map(function (claims) {
-            var owner = null;
-            var zIndexMax = -1;
-            for (var name_1 in claims) {
-                if (!claims.hasOwnProperty(name_1)) {
-                    continue;
-                }
-                if (claims[name_1] > zIndexMax) {
-                    zIndexMax = claims[name_1];
-                    owner = name_1;
-                }
-            }
-            return owner;
-        }), operators_1.startWith(null));
-    };
-    MouseService.prototype._filtered = function (name, observable$, owner$) {
-        return observable$.pipe(operators_1.withLatestFrom(owner$), operators_1.filter(function (_a) {
-            var item = _a[0], owner = _a[1];
-            return owner === name;
-        }), operators_1.map(function (_a) {
-            var item = _a[0], owner = _a[1];
-            return item;
-        }));
-    };
-    return MouseService;
-}());
-exports.MouseService = MouseService;
-exports.default = MouseService;
-
-},{"rxjs":43,"rxjs/operators":241}],478:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Navigator = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var API_1 = require("../API");
-var Graph_1 = require("../Graph");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var State_1 = require("../State");
-var Viewer_1 = require("../Viewer");
-var PanService_1 = require("./PanService");
-var Navigator = /** @class */ (function () {
-    function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService, panService) {
-        this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token);
-        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
-        this._graphService = graphService != null ?
-            graphService :
-            new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService);
-        this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService();
-        this._loadingName = "navigator";
-        this._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode);
-        this._cacheService = cacheService != null ?
-            cacheService :
-            new Viewer_1.CacheService(this._graphService, this._stateService);
-        this._playService = playService != null ?
-            playService :
-            new Viewer_1.PlayService(this._graphService, this._stateService);
-        this._panService = panService != null ?
-            panService :
-            new PanService_1.PanService(this._graphService, this._stateService, options.combinedPanning);
-        this._keyRequested$ = new rxjs_1.BehaviorSubject(null);
-        this._movedToKey$ = new rxjs_1.BehaviorSubject(null);
-        this._request$ = null;
-        this._requestSubscription = null;
-        this._nodeRequestSubscription = null;
-    }
-    Object.defineProperty(Navigator.prototype, "apiV3", {
-        get: function () {
-            return this._apiV3;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "cacheService", {
-        get: function () {
-            return this._cacheService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "graphService", {
-        get: function () {
-            return this._graphService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "imageLoadingService", {
-        get: function () {
-            return this._imageLoadingService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "loadingService", {
-        get: function () {
-            return this._loadingService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "movedToKey$", {
-        get: function () {
-            return this._movedToKey$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "panService", {
-        get: function () {
-            return this._panService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "playService", {
-        get: function () {
-            return this._playService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "stateService", {
-        get: function () {
-            return this._stateService;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Navigator.prototype.moveToKey$ = function (key) {
-        this._abortRequest("to key " + key);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this._moveToKey$(key);
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.moveDir$ = function (direction) {
-        var _this = this;
-        this._abortRequest("in dir " + Edge_1.EdgeDirection[direction]);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this.stateService.currentNode$.pipe(operators_1.first(), operators_1.mergeMap(function (node) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(), operators_1.map(function (status) {
-                for (var _i = 0, _a = status.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }));
-        }), operators_1.mergeMap(function (directionKey) {
-            if (directionKey == null) {
-                _this._loadingService.stopLoading(_this._loadingName);
-                return rxjs_1.throwError(new Error("Direction (" + direction + ") does not exist for current node."));
-            }
-            return _this._moveToKey$(directionKey);
-        }));
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.moveCloseTo$ = function (lat, lon) {
-        var _this = this;
-        this._abortRequest("to lat " + lat + ", lon " + lon);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this.apiV3.imageCloseTo$(lat, lon).pipe(operators_1.mergeMap(function (fullNode) {
-            if (fullNode == null) {
-                _this._loadingService.stopLoading(_this._loadingName);
-                return rxjs_1.throwError(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
-            }
-            return _this._moveToKey$(fullNode.key);
-        }));
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.setFilter$ = function (filter) {
-        var _this = this;
-        this._stateService.clearNodes();
-        return this._movedToKey$.pipe(operators_1.first(), operators_1.mergeMap(function (key) {
-            if (key != null) {
-                return _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
-                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
-                        return _this._cacheKeys$(keys);
-                    }));
-                }), operators_1.last());
-            }
-            return _this._keyRequested$.pipe(operators_1.first(), operators_1.mergeMap(function (requestedKey) {
-                if (requestedKey != null) {
-                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
-                        return _this._graphService.cacheNode$(requestedKey);
-                    }));
-                }
-                return _this._graphService.setFilter$(filter).pipe(operators_1.map(function () {
-                    return undefined;
-                }));
-            }));
-        }), operators_1.map(function (node) {
-            return undefined;
-        }));
-    };
-    Navigator.prototype.setToken$ = function (token) {
-        var _this = this;
-        this._abortRequest("to set token");
-        this._stateService.clearNodes();
-        return this._movedToKey$.pipe(operators_1.first(), operators_1.tap(function (key) {
-            _this._apiV3.setToken(token);
-        }), operators_1.mergeMap(function (key) {
-            return key == null ?
-                _this._graphService.reset$([]) :
-                _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
-                    return _this._graphService.reset$(keys).pipe(operators_1.mergeMap(function () {
-                        return _this._cacheKeys$(keys);
-                    }));
-                }), operators_1.last(), operators_1.map(function (node) {
-                    return undefined;
-                }));
-        }));
-    };
-    Navigator.prototype._cacheKeys$ = function (keys) {
-        var _this = this;
-        var cacheNodes$ = keys
-            .map(function (key) {
-            return _this._graphService.cacheNode$(key);
-        });
-        return rxjs_1.from(cacheNodes$).pipe(operators_1.mergeAll());
-    };
-    Navigator.prototype._abortRequest = function (reason) {
-        if (this._requestSubscription != null) {
-            this._requestSubscription.unsubscribe();
-            this._requestSubscription = null;
-        }
-        if (this._nodeRequestSubscription != null) {
-            this._nodeRequestSubscription.unsubscribe();
-            this._nodeRequestSubscription = null;
-        }
-        if (this._request$ != null) {
-            if (!(this._request$.isStopped || this._request$.hasError)) {
-                this._request$.error(new Error_1.AbortMapillaryError("Request aborted by a subsequent request " + reason + "."));
-            }
-            this._request$ = null;
-        }
-    };
-    Navigator.prototype._makeRequest$ = function (node$) {
-        var _this = this;
-        var request$ = new rxjs_1.ReplaySubject(1);
-        this._requestSubscription = request$
-            .subscribe(undefined, function () { });
-        this._request$ = request$;
-        this._nodeRequestSubscription = node$
-            .subscribe(function (node) {
-            _this._request$ = null;
-            request$.next(node);
-            request$.complete();
-        }, function (error) {
-            _this._request$ = null;
-            request$.error(error);
-        });
-        return request$;
-    };
-    Navigator.prototype._moveToKey$ = function (key) {
-        var _this = this;
-        this._keyRequested$.next(key);
-        return this._graphService.cacheNode$(key).pipe(operators_1.tap(function (node) {
-            _this._stateService.setNodes([node]);
-            _this._movedToKey$.next(node.key);
-        }), operators_1.finalize(function () {
-            _this._loadingService.stopLoading(_this._loadingName);
-        }));
-    };
-    Navigator.prototype._trajectoryKeys$ = function () {
-        return this._stateService.currentState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.trajectory
-                .map(function (node) {
-                return node.key;
-            });
-        }));
-    };
-    return Navigator;
-}());
-exports.Navigator = Navigator;
-exports.default = Navigator;
-
-},{"../API":290,"../Edge":292,"../Error":293,"../Graph":295,"../State":298,"../Viewer":302,"./PanService":480,"rxjs":43,"rxjs/operators":241}],479:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Observer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Viewer_1 = require("../Viewer");
-var Observer = /** @class */ (function () {
-    function Observer(eventEmitter, navigator, container) {
-        var _this = this;
-        this._container = container;
-        this._eventEmitter = eventEmitter;
-        this._navigator = navigator;
-        this._projection = new Viewer_1.Projection();
-        this._started = false;
-        this._navigable$ = new rxjs_1.Subject();
-        // navigable and loading should always emit, also when cover is activated.
-        this._navigable$
-            .subscribe(function (navigable) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.navigablechanged, navigable);
-        });
-        this._navigator.loadingService.loading$
-            .subscribe(function (loading) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
-        });
-    }
-    Object.defineProperty(Observer.prototype, "started", {
-        get: function () {
-            return this._started;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Observer.prototype, "navigable$", {
-        get: function () {
-            return this._navigable$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(Observer.prototype, "projection", {
-        get: function () {
-            return this._projection;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Observer.prototype.project$ = function (latLon) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentNode$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], node = _a[1], reference = _a[2];
-            if (_this._projection.distanceBetweenLatLons(latLon, node.latLon) > 1000) {
-                return null;
-            }
-            var canvasPoint = _this._projection.latLonToCanvas(latLon, _this._container.element, render, reference);
-            return !!canvasPoint ?
-                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
-                null;
-        }));
-    };
-    Observer.prototype.projectBasic$ = function (basicPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], transform = _a[1];
-            var canvasPoint = _this._projection.basicToCanvas(basicPoint, _this._container.element, render, transform);
-            return !!canvasPoint ?
-                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
-                null;
-        }));
-    };
-    Observer.prototype.startEmit = function () {
-        var _this = this;
-        if (this._started) {
-            return;
-        }
-        this._started = true;
-        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$
-            .subscribe(function (node) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
-        });
-        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }))
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
-        });
-        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
-            return node.spatialEdges$;
-        }))
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
-        });
-        this._moveSubscription = rxjs_1.combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (values) {
-            return values[0] || values[1] || values[2];
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (started) {
-            if (started) {
-                _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null);
-            }
-            else {
-                _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null);
-            }
-        });
-        this._bearingSubscription = this._container.renderService.bearing$.pipe(operators_1.auditTime(100), operators_1.distinctUntilChanged(function (b1, b2) {
-            return Math.abs(b2 - b1) < 1;
-        }))
-            .subscribe(function (bearing) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing);
-        });
-        var mouseMove$ = this._container.mouseService.active$.pipe(operators_1.switchMap(function (active) {
-            return active ?
-                rxjs_1.empty() :
-                _this._container.mouseService.mouseMove$;
-        }));
-        this._viewerMouseEventSubscription = rxjs_1.merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$)).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], type = _b[0], event = _b[1], render = _a[1], reference = _a[2], transform = _a[3];
-            var unprojection = _this._projection.eventToUnprojection(event, _this._container.element, render, reference, transform);
-            return {
-                basicPoint: unprojection.basicPoint,
-                latLon: unprojection.latLon,
-                originalEvent: event,
-                pixelPoint: unprojection.pixelPoint,
-                target: _this._eventEmitter,
-                type: type,
-            };
-        }))
-            .subscribe(function (event) {
-            _this._eventEmitter.fire(event.type, event);
-        });
-        this._positionSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
-            var x1 = _a[0], y1 = _a[1];
-            var x2 = _b[0], y2 = _b[1];
-            return _this._closeTo(x1, x2, 1e-2) &&
-                _this._closeTo(y1, y2, 1e-2);
-        }, function (rc) {
-            return rc.camera.position.toArray();
-        }))
-            .subscribe(function () {
-            _this._eventEmitter.fire(Viewer_1.Viewer.positionchanged, {
-                target: _this._eventEmitter,
-                type: Viewer_1.Viewer.positionchanged,
-            });
-        });
-        this._povSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
-            var phi1 = _a[0], theta1 = _a[1];
-            var phi2 = _b[0], theta2 = _b[1];
-            return _this._closeTo(phi1, phi2, 1e-3) &&
-                _this._closeTo(theta1, theta2, 1e-3);
-        }, function (rc) {
-            return [rc.rotation.phi, rc.rotation.theta];
-        }))
-            .subscribe(function () {
-            _this._eventEmitter.fire(Viewer_1.Viewer.povchanged, {
-                target: _this._eventEmitter,
-                type: Viewer_1.Viewer.povchanged,
-            });
-        });
-        this._fovSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (fov1, fov2) {
-            return _this._closeTo(fov1, fov2, 1e-2);
-        }, function (rc) {
-            return rc.perspective.fov;
-        }))
-            .subscribe(function () {
-            _this._eventEmitter.fire(Viewer_1.Viewer.fovchanged, {
-                target: _this._eventEmitter,
-                type: Viewer_1.Viewer.fovchanged,
-            });
-        });
-    };
-    Observer.prototype.stopEmit = function () {
-        if (!this.started) {
-            return;
-        }
-        this._started = false;
-        this._bearingSubscription.unsubscribe();
-        this._currentNodeSubscription.unsubscribe();
-        this._fovSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._positionSubscription.unsubscribe();
-        this._povSubscription.unsubscribe();
-        this._sequenceEdgesSubscription.unsubscribe();
-        this._spatialEdgesSubscription.unsubscribe();
-        this._viewerMouseEventSubscription.unsubscribe();
-        this._bearingSubscription = null;
-        this._currentNodeSubscription = null;
-        this._fovSubscription = null;
-        this._moveSubscription = null;
-        this._positionSubscription = null;
-        this._povSubscription = null;
-        this._sequenceEdgesSubscription = null;
-        this._spatialEdgesSubscription = null;
-        this._viewerMouseEventSubscription = null;
-    };
-    Observer.prototype.unproject$ = function (canvasPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], reference = _a[1], transform = _a[2];
-            var unprojection = _this._projection.canvasToUnprojection(canvasPoint, _this._container.element, render, reference, transform);
-            return unprojection.latLon;
-        }));
-    };
-    Observer.prototype.unprojectBasic$ = function (canvasPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], transform = _a[1];
-            return _this._projection.canvasToBasic(canvasPoint, _this._container.element, render, transform);
-        }));
-    };
-    Observer.prototype._closeTo = function (v1, v2, absoluteTolerance) {
-        return Math.abs(v1 - v2) <= absoluteTolerance;
-    };
-    Observer.prototype._mapMouseEvent$ = function (type, mouseEvent$) {
-        return mouseEvent$.pipe(operators_1.map(function (event) {
-            return [type, event];
-        }));
-    };
-    return Observer;
-}());
-exports.Observer = Observer;
-exports.default = Observer;
-
-},{"../Viewer":302,"rxjs":43,"rxjs/operators":241}],480:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PanService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Geo = require("../geo/Geo");
-var GeoCoords_1 = require("../geo/GeoCoords");
-var GraphCalculator_1 = require("../graph/GraphCalculator");
-var Spatial_1 = require("../geo/Spatial");
-var Transform_1 = require("../geo/Transform");
-var ViewportCoords_1 = require("../geo/ViewportCoords");
-var PanMode;
-(function (PanMode) {
-    PanMode[PanMode["Disabled"] = 0] = "Disabled";
-    PanMode[PanMode["Enabled"] = 1] = "Enabled";
-    PanMode[PanMode["Started"] = 2] = "Started";
-})(PanMode || (PanMode = {}));
-var PanService = /** @class */ (function () {
-    function PanService(graphService, stateService, enabled, geoCoords, graphCalculator, spatial, viewportCoords) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._geoCoords = !!geoCoords ? geoCoords : new GeoCoords_1.default();
-        this._graphCalculator = !!graphCalculator ? graphCalculator : new GraphCalculator_1.default(this._geoCoords);
-        this._spatial = !!spatial ? spatial : new Spatial_1.default();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords_1.default();
-        this._mode = enabled !== false ? PanMode.Enabled : PanMode.Disabled;
-        this._panNodesSubject$ = new rxjs_1.Subject();
-        this._panNodes$ = this._panNodesSubject$.pipe(operators_1.startWith([]), operators_1.publishReplay(1), operators_1.refCount());
-        this._panNodes$.subscribe();
-    }
-    Object.defineProperty(PanService.prototype, "panNodes$", {
-        get: function () {
-            return this._panNodes$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    PanService.prototype.enable = function () {
-        if (this._mode !== PanMode.Disabled) {
-            return;
-        }
-        this._mode = PanMode.Enabled;
-        this.start();
-    };
-    PanService.prototype.disable = function () {
-        if (this._mode === PanMode.Disabled) {
-            return;
-        }
-        this.stop();
-        this._mode = PanMode.Disabled;
-    };
-    PanService.prototype.start = function () {
-        var _this = this;
-        if (this._mode !== PanMode.Enabled) {
-            return;
-        }
-        var panNodes$ = this._stateService.currentNode$.pipe(operators_1.switchMap(function (current) {
-            if (!current.merged) {
-                return rxjs_1.of([]);
-            }
-            var current$ = rxjs_1.of(current);
-            var bounds = _this._graphCalculator.boundingBoxCorners(current.latLon, 20);
-            var adjacent$ = _this._graphService
-                .cacheBoundingBox$(bounds[0], bounds[1]).pipe(operators_1.catchError(function (error) {
-                console.error("Failed to cache periphery bounding box (" + current.key + ")", error);
-                return rxjs_1.empty();
-            }), operators_1.map(function (nodes) {
-                if (current.pano) {
-                    return [];
-                }
-                var potential = [];
-                for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                    var node = nodes_1[_i];
-                    if (node.key === current.key) {
-                        continue;
-                    }
-                    if (node.mergeCC !== current.mergeCC) {
-                        continue;
-                    }
-                    if (node.pano) {
-                        continue;
-                    }
-                    if (_this._distance(node, current) > 4) {
-                        continue;
-                    }
-                    potential.push(node);
-                }
-                return potential;
-            }));
-            return rxjs_1.combineLatest(current$, adjacent$).pipe(operators_1.withLatestFrom(_this._stateService.reference$), operators_1.map(function (_a) {
-                var _b = _a[0], cn = _b[0], adjacent = _b[1], reference = _a[1];
-                var currentDirection = _this._spatial.viewingDirection(cn.rotation);
-                var currentTranslation = Geo.computeTranslation({ lat: cn.latLon.lat, lon: cn.latLon.lon, alt: cn.alt }, cn.rotation, reference);
-                var currentTransform = _this._createTransform(cn, currentTranslation);
-                var currentAzimuthal = _this._spatial.wrap(_this._spatial.azimuthal(currentDirection.toArray(), currentTransform.upVector().toArray()), 0, 2 * Math.PI);
-                var currentProjectedPoints = _this._computeProjectedPoints(currentTransform);
-                var currentHFov = _this._computeHorizontalFov(currentProjectedPoints) / 180 * Math.PI;
-                var preferredOverlap = Math.PI / 8;
-                var left = undefined;
-                var right = undefined;
-                for (var _i = 0, adjacent_1 = adjacent; _i < adjacent_1.length; _i++) {
-                    var a = adjacent_1[_i];
-                    var translation = Geo.computeTranslation({ lat: a.latLon.lat, lon: a.latLon.lon, alt: a.alt }, a.rotation, reference);
-                    var transform = _this._createTransform(a, translation);
-                    var projectedPoints = _this._computeProjectedPoints(transform);
-                    var hFov = _this._computeHorizontalFov(projectedPoints) / 180 * Math.PI;
-                    var direction = _this._spatial.viewingDirection(a.rotation);
-                    var azimuthal = _this._spatial.wrap(_this._spatial.azimuthal(direction.toArray(), transform.upVector().toArray()), 0, 2 * Math.PI);
-                    var directionChange = _this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
-                    var overlap = Number.NEGATIVE_INFINITY;
-                    if (directionChange > 0) {
-                        if (currentAzimuthal > azimuthal) {
-                            overlap = currentAzimuthal - 2 * Math.PI + currentHFov / 2 - (azimuthal - hFov / 2);
-                        }
-                        else {
-                            overlap = currentAzimuthal + currentHFov / 2 - (azimuthal - hFov / 2);
-                        }
-                    }
-                    else {
-                        if (currentAzimuthal < azimuthal) {
-                            overlap = azimuthal + hFov / 2 - (currentAzimuthal + 2 * Math.PI - currentHFov / 2);
-                        }
-                        else {
-                            overlap = azimuthal + hFov / 2 - (currentAzimuthal - currentHFov / 2);
-                        }
-                    }
-                    var nonOverlap = Math.abs(hFov - overlap);
-                    var distanceCost = _this._distance(a, cn);
-                    var timeCost = Math.min(_this._timeDifference(a, cn), 4);
-                    var overlapCost = 20 * Math.abs(overlap - preferredOverlap);
-                    var fovCost = Math.min(5, 1 / Math.min(hFov / currentHFov, 1));
-                    var nonOverlapCost = overlap > 0 ? -2 * nonOverlap : 0;
-                    var cost = distanceCost + timeCost + overlapCost + fovCost + nonOverlapCost;
-                    if (overlap > 0 &&
-                        overlap < 0.5 * currentHFov &&
-                        overlap < 0.5 * hFov &&
-                        nonOverlap > 0.5 * currentHFov) {
-                        if (directionChange > 0) {
-                            if (!left) {
-                                left = [cost, a, transform, hFov];
-                            }
-                            else {
-                                if (cost < left[0]) {
-                                    left = [cost, a, transform, hFov];
-                                }
-                            }
-                        }
-                        else {
-                            if (!right) {
-                                right = [cost, a, transform, hFov];
-                            }
-                            else {
-                                if (cost < right[0]) {
-                                    right = [cost, a, transform, hFov];
-                                }
-                            }
-                        }
-                    }
-                }
-                var panNodes = [];
-                if (!!left) {
-                    panNodes.push([left[1], left[2], left[3]]);
-                }
-                if (!!right) {
-                    panNodes.push([right[1], right[2], right[3]]);
-                }
-                return panNodes;
-            }), operators_1.startWith([]));
-        }));
-        this._panNodesSubscription = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.nodesAhead > 0;
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (traversing) {
-            return traversing ? rxjs_1.of([]) : panNodes$;
-        }))
-            .subscribe(function (panNodes) {
-            _this._panNodesSubject$.next(panNodes);
-        });
-        this._mode = PanMode.Started;
-    };
-    PanService.prototype.stop = function () {
-        if (this._mode !== PanMode.Started) {
-            return;
-        }
-        this._panNodesSubscription.unsubscribe();
-        this._panNodesSubject$.next([]);
-        this._mode = PanMode.Enabled;
-    };
-    PanService.prototype._distance = function (node, reference) {
-        var _a = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, reference.latLon.lat, reference.latLon.lon, reference.alt), x = _a[0], y = _a[1], z = _a[2];
-        return Math.sqrt(x * x + y * y + z * z);
-    };
-    PanService.prototype._timeDifference = function (node, reference) {
-        return Math.abs(node.capturedAt - reference.capturedAt) / (1000 * 60 * 60 * 24 * 30);
-    };
-    PanService.prototype._createTransform = function (node, translation) {
-        return new Transform_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.assetsCached ? node.image : undefined, undefined, node.ck1, node.ck2, node.cameraProjection);
-    };
-    PanService.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[1, 0]];
-        var directions = [[0, 0.5]];
-        var pointsPerLine = 20;
-        return Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    PanService.prototype._computeHorizontalFov = function (projectedPoints) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._coordToFov(projectedPoint[0]);
-        });
-        var fov = Math.min.apply(Math, fovs);
-        return fov;
-    };
-    PanService.prototype._coordToFov = function (x) {
-        return 2 * Math.atan(x) * 180 / Math.PI;
-    };
-    return PanService;
-}());
-exports.PanService = PanService;
-
-},{"../geo/Geo":415,"../geo/GeoCoords":416,"../geo/Spatial":419,"../geo/Transform":420,"../geo/ViewportCoords":421,"../graph/GraphCalculator":425,"rxjs":43,"rxjs/operators":241}],481:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PlayService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Edge_1 = require("../Edge");
-var Graph_1 = require("../Graph");
-var PlayService = /** @class */ (function () {
-    function PlayService(graphService, stateService, graphCalculator) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator();
-        this._directionSubject$ = new rxjs_1.Subject();
-        this._direction$ = this._directionSubject$.pipe(operators_1.startWith(Edge_1.EdgeDirection.Next), operators_1.publishReplay(1), operators_1.refCount());
-        this._direction$.subscribe();
-        this._playing = false;
-        this._playingSubject$ = new rxjs_1.Subject();
-        this._playing$ = this._playingSubject$.pipe(operators_1.startWith(this._playing), operators_1.publishReplay(1), operators_1.refCount());
-        this._playing$.subscribe();
-        this._speed = 0.5;
-        this._speedSubject$ = new rxjs_1.Subject();
-        this._speed$ = this._speedSubject$.pipe(operators_1.startWith(this._speed), operators_1.publishReplay(1), operators_1.refCount());
-        this._speed$.subscribe();
-        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));
-        this._bridging$ = null;
-    }
-    Object.defineProperty(PlayService.prototype, "playing", {
-        get: function () {
-            return this._playing;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "direction$", {
-        get: function () {
-            return this._direction$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "playing$", {
-        get: function () {
-            return this._playing$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "speed$", {
-        get: function () {
-            return this._speed$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    PlayService.prototype.play = function () {
-        var _this = this;
-        if (this._playing) {
-            return;
-        }
-        this._stateService.cutNodes();
-        var stateSpeed = this._setSpeed(this._speed);
-        this._stateService.setSpeed(stateSpeed);
-        this._graphModeSubscription = this._speed$.pipe(operators_1.map(function (speed) {
-            return speed > PlayService.sequenceSpeed ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (mode) {
-            _this._graphService.setGraphMode(mode);
-        });
-        this._cacheSubscription = rxjs_1.combineLatest(this._stateService.currentNode$.pipe(operators_1.map(function (node) {
-            return [node.sequenceKey, node.key];
-        }), operators_1.distinctUntilChanged(undefined, function (_a) {
-            var sequenceKey = _a[0], nodeKey = _a[1];
-            return sequenceKey;
-        })), this._graphService.graphMode$, this._direction$).pipe(operators_1.switchMap(function (_a) {
-            var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2];
-            if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) {
-                return rxjs_1.of([undefined, direction]);
-            }
-            var sequence$ = (mode === Graph_1.GraphMode.Sequence ?
-                _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :
-                _this._graphService.cacheSequence$(sequenceKey)).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of(undefined);
-            }));
-            return rxjs_1.combineLatest(sequence$, rxjs_1.of(direction));
-        }), operators_1.switchMap(function (_a) {
-            var sequence = _a[0], direction = _a[1];
-            if (sequence === undefined) {
-                return rxjs_1.empty();
-            }
-            var sequenceKeys = sequence.keys.slice();
-            if (direction === Edge_1.EdgeDirection.Prev) {
-                sequenceKeys.reverse();
-            }
-            return _this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];
-            }), operators_1.scan(function (_a, _b) {
-                var lastRequestKey = _a[0], previousRequestKeys = _a[1];
-                var lastTrajectoryKey = _b[0], nodesAhead = _b[1];
-                if (lastRequestKey === undefined) {
-                    lastRequestKey = lastTrajectoryKey;
-                }
-                var lastIndex = sequenceKeys.length - 1;
-                if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {
-                    return [lastRequestKey, []];
-                }
-                var current = sequenceKeys.indexOf(lastTrajectoryKey);
-                var start = sequenceKeys.indexOf(lastRequestKey) + 1;
-                var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1;
-                if (end <= start) {
-                    return [lastRequestKey, []];
-                }
-                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];
-            }, [undefined, []]), operators_1.mergeMap(function (_a) {
-                var lastRequestKey = _a[0], newRequestKeys = _a[1];
-                return rxjs_1.from(newRequestKeys);
-            }));
-        }), operators_1.mergeMap(function (key) {
-            return _this._graphService.cacheNode$(key).pipe(operators_1.catchError(function () {
-                return rxjs_1.empty();
-            }));
-        }, 6))
-            .subscribe();
-        this._playingSubscription = this._stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        }), operators_1.map(function (frame) {
-            var lastNode = frame.state.lastNode;
-            var trajectory = frame.state.trajectory;
-            var increasingTime = undefined;
-            for (var i = trajectory.length - 2; i >= 0; i--) {
-                var node = trajectory[i];
-                if (node.sequenceKey !== lastNode.sequenceKey) {
-                    break;
-                }
-                if (node.capturedAt !== lastNode.capturedAt) {
-                    increasingTime = node.capturedAt < lastNode.capturedAt;
-                    break;
-                }
-            }
-            return [frame.state.lastNode, increasingTime];
-        }), operators_1.withLatestFrom(this._direction$), operators_1.switchMap(function (_a) {
-            var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1];
-            return rxjs_1.zip(([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(function (status) {
-                return status.cached;
-            }), operators_1.timeout(15000)), rxjs_1.of(direction)).pipe(operators_1.map(function (_a) {
-                var s = _a[0], d = _a[1];
-                for (var _i = 0, _b = s.edges; _i < _b.length; _i++) {
-                    var edge = _b[_i];
-                    if (edge.data.direction === d) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }), operators_1.switchMap(function (key) {
-                return key != null ?
-                    _this._graphService.cacheNode$(key) :
-                    _this._bridge$(node, increasingTime).pipe(operators_1.filter(function (n) {
-                        return !!n;
-                    }));
-            }));
-        }))
-            .subscribe(function (node) {
-            _this._stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
-        });
-        this._clearSubscription = this._stateService.currentNode$.pipe(operators_1.bufferCount(1, 10))
-            .subscribe(function (nodes) {
-            _this._stateService.clearPriorNodes();
-        });
-        this._setPlaying(true);
-        var currentLastNodes$ = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state;
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var kc1 = _a[0], kl1 = _a[1];
-            var kc2 = _b[0], kl2 = _b[1];
-            return kc1 === kc2 && kl1 === kl2;
-        }, function (state) {
-            return [state.currentNode.key, state.lastNode.key];
-        }), operators_1.filter(function (state) {
-            return state.currentNode.key === state.lastNode.key &&
-                state.currentIndex === state.trajectory.length - 1;
-        }), operators_1.map(function (state) {
-            return state.currentNode;
-        }));
-        this._stopSubscription = rxjs_1.combineLatest(currentLastNodes$, this._direction$).pipe(operators_1.switchMap(function (_a) {
-            var node = _a[0], direction = _a[1];
-            var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(function (status) {
-                return status.cached;
-            }), operators_1.timeout(15000), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of({ cached: false, edges: [] });
-            }));
-            return rxjs_1.combineLatest(rxjs_1.of(direction), edgeStatus$).pipe(operators_1.map(function (_a) {
-                var d = _a[0], es = _a[1];
-                for (var _i = 0, _b = es.edges; _i < _b.length; _i++) {
-                    var edge = _b[_i];
-                    if (edge.data.direction === d) {
-                        return true;
-                    }
-                }
-                return false;
-            }));
-        }), operators_1.mergeMap(function (hasEdge) {
-            if (hasEdge || !_this._bridging$) {
-                return rxjs_1.of(hasEdge);
-            }
-            return _this._bridging$.pipe(operators_1.map(function (node) {
-                return node != null;
-            }), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of(false);
-            }));
-        }), operators_1.first(function (hasEdge) {
-            return !hasEdge;
-        }))
-            .subscribe(undefined, undefined, function () { _this.stop(); });
-        if (this._stopSubscription.closed) {
-            this._stopSubscription = null;
-        }
-    };
-    PlayService.prototype.setDirection = function (direction) {
-        this._directionSubject$.next(direction);
-    };
-    PlayService.prototype.setSpeed = function (speed) {
-        speed = Math.max(0, Math.min(1, speed));
-        if (speed === this._speed) {
-            return;
-        }
-        var stateSpeed = this._setSpeed(speed);
-        if (this._playing) {
-            this._stateService.setSpeed(stateSpeed);
-        }
-        this._speedSubject$.next(this._speed);
-    };
-    PlayService.prototype.stop = function () {
-        if (!this._playing) {
-            return;
-        }
-        if (!!this._stopSubscription) {
-            if (!this._stopSubscription.closed) {
-                this._stopSubscription.unsubscribe();
-            }
-            this._stopSubscription = null;
-        }
-        this._graphModeSubscription.unsubscribe();
-        this._graphModeSubscription = null;
-        this._cacheSubscription.unsubscribe();
-        this._cacheSubscription = null;
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this._clearSubscription.unsubscribe();
-        this._clearSubscription = null;
-        this._stateService.setSpeed(1);
-        this._stateService.cutNodes();
-        this._graphService.setGraphMode(Graph_1.GraphMode.Spatial);
-        this._setPlaying(false);
-    };
-    PlayService.prototype._bridge$ = function (node, increasingTime) {
-        var _this = this;
-        if (increasingTime === undefined) {
-            return rxjs_1.of(null);
-        }
-        var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25);
-        this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]).pipe(operators_1.mergeMap(function (nodes) {
-            var nextNode = null;
-            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                var n = nodes_1[_i];
-                if (n.sequenceKey === node.sequenceKey ||
-                    !n.cameraUuid ||
-                    n.cameraUuid !== node.cameraUuid ||
-                    n.capturedAt === node.capturedAt ||
-                    n.capturedAt > node.capturedAt !== increasingTime) {
-                    continue;
-                }
-                var delta = Math.abs(n.capturedAt - node.capturedAt);
-                if (delta > 15000) {
-                    continue;
-                }
-                if (!nextNode || delta < Math.abs(nextNode.capturedAt - node.capturedAt)) {
-                    nextNode = n;
-                }
-            }
-            return !!nextNode ?
-                _this._graphService.cacheNode$(nextNode.key) :
-                rxjs_1.of(null);
-        }), operators_1.finalize(function () {
-            _this._bridging$ = null;
-        }), operators_1.publish(), operators_1.refCount());
-        return this._bridging$;
-    };
-    PlayService.prototype._mapSpeed = function (speed) {
-        var x = 2 * speed - 1;
-        return Math.pow(10, x) - 0.2 * x;
-    };
-    PlayService.prototype._mapNodesAhead = function (stateSpeed) {
-        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));
-    };
-    PlayService.prototype._setPlaying = function (playing) {
-        this._playing = playing;
-        this._playingSubject$.next(playing);
-    };
-    PlayService.prototype._setSpeed = function (speed) {
-        this._speed = speed;
-        var stateSpeed = this._mapSpeed(this._speed);
-        this._nodesAhead = this._mapNodesAhead(stateSpeed);
-        return stateSpeed;
-    };
-    PlayService.sequenceSpeed = 0.54;
-    return PlayService;
-}());
-exports.PlayService = PlayService;
-exports.default = PlayService;
-
-},{"../Edge":292,"../Graph":295,"rxjs":43,"rxjs/operators":241}],482:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Projection = void 0;
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Spatial_1 = require("../geo/Spatial");
-var Projection = /** @class */ (function () {
-    function Projection(geoCoords, viewportCoords, spatial) {
-        this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords();
-        this._spatial = !!spatial ? spatial : new Spatial_1.default();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-    }
-    Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) {
-        return this._viewportCoords
-            .basicToCanvasSafe(basicPoint[0], basicPoint[1], container, transform, render.perspective);
-    };
-    Projection.prototype.canvasToBasic = function (canvasPoint, container, render, transform) {
-        var basicPoint = this._viewportCoords
-            .canvasToBasic(canvasPoint[0], canvasPoint[1], container, transform, render.perspective);
-        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
-            basicPoint = null;
-        }
-        return basicPoint;
-    };
-    Projection.prototype.eventToUnprojection = function (event, container, render, reference, transform) {
-        var pixelPoint = this._viewportCoords.canvasPosition(event, container);
-        return this.canvasToUnprojection(pixelPoint, container, render, reference, transform);
-    };
-    Projection.prototype.canvasToUnprojection = function (canvasPoint, container, render, reference, transform) {
-        var canvasX = canvasPoint[0];
-        var canvasY = canvasPoint[1];
-        var _a = this._viewportCoords.canvasToViewport(canvasX, canvasY, container), viewportX = _a[0], viewportY = _a[1];
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(render.perspective);
-        var basicPoint = transform.projectBasic(point3d.toArray());
-        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
-            basicPoint = null;
-        }
-        var direction3d = point3d.clone().sub(render.camera.position).normalize();
-        var dist = -2 / direction3d.z;
-        var latLon = null;
-        if (dist > 0 && dist < 100 && !!basicPoint) {
-            var point = direction3d.clone().multiplyScalar(dist).add(render.camera.position);
-            var latLonArray = this._geoCoords
-                .enuToGeodetic(point.x, point.y, point.z, reference.lat, reference.lon, reference.alt)
-                .slice(0, 2);
-            latLon = { lat: latLonArray[0], lon: latLonArray[1] };
-        }
-        var unprojection = {
-            basicPoint: basicPoint,
-            latLon: latLon,
-            pixelPoint: [canvasX, canvasY],
-        };
-        return unprojection;
-    };
-    Projection.prototype.cameraToLatLon = function (render, reference) {
-        var position = render.camera.position;
-        var _a = this._geoCoords.enuToGeodetic(position.x, position.y, position.z, reference.lat, reference.lon, reference.alt), lat = _a[0], lon = _a[1];
-        return { lat: lat, lon: lon };
-    };
-    Projection.prototype.latLonToCanvas = function (latLon, container, render, reference) {
-        var point3d = this._geoCoords.geodeticToEnu(latLon.lat, latLon.lon, 0, reference.lat, reference.lon, reference.alt);
-        var canvas = this._viewportCoords.projectToCanvasSafe(point3d, container, render.perspective);
-        return canvas;
-    };
-    Projection.prototype.distanceBetweenLatLons = function (latLon1, latLon2) {
-        return this._spatial.distanceFromLatLon(latLon1.lat, latLon1.lon, latLon2.lat, latLon2.lon);
-    };
-    return Projection;
-}());
-exports.Projection = Projection;
-exports.default = Projection;
-
-},{"../Geo":294,"../geo/Spatial":419,"three":242}],483:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SpriteService = void 0;
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var vd = require("virtual-dom");
-var rxjs_1 = require("rxjs");
-var Viewer_1 = require("../Viewer");
-var SpriteAtlas = /** @class */ (function () {
-    function SpriteAtlas() {
-    }
-    Object.defineProperty(SpriteAtlas.prototype, "json", {
-        set: function (value) {
-            this._json = value;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpriteAtlas.prototype, "image", {
-        set: function (value) {
-            this._image = value;
-            this._texture = new THREE.Texture(this._image);
-            this._texture.minFilter = THREE.NearestFilter;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(SpriteAtlas.prototype, "loaded", {
-        get: function () {
-            return !!(this._image && this._json);
-        },
-        enumerable: false,
-        configurable: true
-    });
-    SpriteAtlas.prototype.getGLSprite = function (name) {
-        if (!this.loaded) {
-            throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
-        }
-        var definition = this._json[name];
-        if (!definition) {
-            console.warn("Sprite with key" + name + "does not exist in sprite definition.");
-            return new THREE.Object3D();
-        }
-        var texture = this._texture.clone();
-        texture.needsUpdate = true;
-        var width = this._image.width;
-        var height = this._image.height;
-        texture.offset.x = definition.x / width;
-        texture.offset.y = (height - definition.y - definition.height) / height;
-        texture.repeat.x = definition.width / width;
-        texture.repeat.y = definition.height / height;
-        var material = new THREE.SpriteMaterial({ map: texture });
-        return new THREE.Sprite(material);
-    };
-    SpriteAtlas.prototype.getDOMSprite = function (name, float) {
-        if (!this.loaded) {
-            throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
-        }
-        if (float == null) {
-            float = Viewer_1.Alignment.Center;
-        }
-        var definition = this._json[name];
-        if (!definition) {
-            console.warn("Sprite with key" + name + "does not exist in sprite definition.");
-            return vd.h("div", {}, []);
-        }
-        var clipTop = definition.y;
-        var clipRigth = definition.x + definition.width;
-        var clipBottom = definition.y + definition.height;
-        var clipLeft = definition.x;
-        var left = -definition.x;
-        var top = -definition.y;
-        var height = this._image.height;
-        var width = this._image.width;
-        switch (float) {
-            case Viewer_1.Alignment.Bottom:
-            case Viewer_1.Alignment.Center:
-            case Viewer_1.Alignment.Top:
-                left -= definition.width / 2;
-                break;
-            case Viewer_1.Alignment.BottomLeft:
-            case Viewer_1.Alignment.Left:
-            case Viewer_1.Alignment.TopLeft:
-                left -= definition.width;
-                break;
-            case Viewer_1.Alignment.BottomRight:
-            case Viewer_1.Alignment.Right:
-            case Viewer_1.Alignment.TopRight:
-            default:
-                break;
-        }
-        switch (float) {
-            case Viewer_1.Alignment.Center:
-            case Viewer_1.Alignment.Left:
-            case Viewer_1.Alignment.Right:
-                top -= definition.height / 2;
-                break;
-            case Viewer_1.Alignment.Top:
-            case Viewer_1.Alignment.TopLeft:
-            case Viewer_1.Alignment.TopRight:
-                top -= definition.height;
-                break;
-            case Viewer_1.Alignment.Bottom:
-            case Viewer_1.Alignment.BottomLeft:
-            case Viewer_1.Alignment.BottomRight:
-            default:
-                break;
-        }
-        var pixelRatioInverse = 1 / definition.pixelRatio;
-        clipTop *= pixelRatioInverse;
-        clipRigth *= pixelRatioInverse;
-        clipBottom *= pixelRatioInverse;
-        clipLeft *= pixelRatioInverse;
-        left *= pixelRatioInverse;
-        top *= pixelRatioInverse;
-        height *= pixelRatioInverse;
-        width *= pixelRatioInverse;
-        var properties = {
-            src: this._image.src,
-            style: {
-                clip: "rect(" + clipTop + "px, " + clipRigth + "px, " + clipBottom + "px, " + clipLeft + "px)",
-                height: height + "px",
-                left: left + "px",
-                position: "absolute",
-                top: top + "px",
-                width: width + "px",
-            },
-        };
-        return vd.h("img", properties, []);
-    };
-    return SpriteAtlas;
-}());
-var SpriteService = /** @class */ (function () {
-    function SpriteService(sprite) {
-        var _this = this;
-        this._retina = window.devicePixelRatio > 1;
-        this._spriteAtlasOperation$ = new rxjs_1.Subject();
-        this._spriteAtlas$ = this._spriteAtlasOperation$.pipe(operators_1.startWith(function (atlas) {
-            return atlas;
-        }), operators_1.scan(function (atlas, operation) {
-            return operation(atlas);
-        }, new SpriteAtlas()), operators_1.publishReplay(1), operators_1.refCount());
-        this._spriteAtlas$.subscribe(function () { });
-        if (sprite == null) {
-            return;
-        }
-        var format = this._retina ? "@2x" : "";
-        var imageXmlHTTP = new XMLHttpRequest();
-        imageXmlHTTP.open("GET", sprite + format + ".png", true);
-        imageXmlHTTP.responseType = "arraybuffer";
-        imageXmlHTTP.onload = function () {
-            var image = new Image();
-            image.onload = function () {
-                _this._spriteAtlasOperation$.next(function (atlas) {
-                    atlas.image = image;
-                    return atlas;
-                });
-            };
-            var blob = new Blob([imageXmlHTTP.response]);
-            image.src = window.URL.createObjectURL(blob);
-        };
-        imageXmlHTTP.onerror = function (error) {
-            console.error(new Error("Failed to fetch sprite sheet (" + sprite + format + ".png)"));
-        };
-        imageXmlHTTP.send();
-        var jsonXmlHTTP = new XMLHttpRequest();
-        jsonXmlHTTP.open("GET", sprite + format + ".json", true);
-        jsonXmlHTTP.responseType = "text";
-        jsonXmlHTTP.onload = function () {
-            var json = JSON.parse(jsonXmlHTTP.response);
-            _this._spriteAtlasOperation$.next(function (atlas) {
-                atlas.json = json;
-                return atlas;
-            });
-        };
-        jsonXmlHTTP.onerror = function (error) {
-            console.error(new Error("Failed to fetch sheet (" + sprite + format + ".json)"));
-        };
-        jsonXmlHTTP.send();
-    }
-    Object.defineProperty(SpriteService.prototype, "spriteAtlas$", {
-        get: function () {
-            return this._spriteAtlas$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return SpriteService;
-}());
-exports.SpriteService = SpriteService;
-exports.default = SpriteService;
-
-
-},{"../Viewer":302,"rxjs":43,"rxjs/operators":241,"three":242,"virtual-dom":247}],484:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TouchService = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var TouchService = /** @class */ (function () {
-    function TouchService(canvasContainer, domContainer) {
-        var _this = this;
-        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        rxjs_1.fromEvent(domContainer, "touchmove")
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._touchStart$ = rxjs_1.fromEvent(canvasContainer, "touchstart");
-        this._touchMove$ = rxjs_1.fromEvent(canvasContainer, "touchmove");
-        this._touchEnd$ = rxjs_1.fromEvent(canvasContainer, "touchend");
-        this._touchCancel$ = rxjs_1.fromEvent(canvasContainer, "touchcancel");
-        var tapStart$ = this._touchStart$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }), operators_1.share());
-        this._doubleTap$ = tapStart$.pipe(operators_1.bufferWhen(function () {
-            return tapStart$.pipe(operators_1.first(), operators_1.switchMap(function (event) {
-                return rxjs_1.merge(rxjs_1.timer(300), tapStart$).pipe(operators_1.take(1));
-            }));
-        }), operators_1.filter(function (events) {
-            return events.length === 2;
-        }), operators_1.map(function (events) {
-            return events[events.length - 1];
-        }), operators_1.share());
-        this._doubleTap$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._singleTouchMove$ = this._touchMove$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }), operators_1.share());
-        var singleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }));
-        var multipleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length >= 1;
-        }));
-        var touchStop$ = rxjs_1.merge(this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length === 0;
-        }));
-        this._singleTouchDragStart$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
-            return _this._singleTouchMove$.pipe(operators_1.takeUntil(rxjs_1.merge(touchStop$, multipleTouchStart$)), operators_1.take(1));
-        }));
-        this._singleTouchDragEnd$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
-            return rxjs_1.merge(touchStop$, multipleTouchStart$).pipe(operators_1.first());
-        }));
-        this._singleTouchDrag$ = singleTouchStart$.pipe(operators_1.switchMap(function (te) {
-            return _this._singleTouchMove$.pipe(operators_1.skip(1), operators_1.takeUntil(rxjs_1.merge(multipleTouchStart$, touchStop$)));
-        }));
-        var touchesChanged$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
-        this._pinchStart$ = touchesChanged$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        }));
-        this._pinchEnd$ = touchesChanged$.pipe(operators_1.filter(function (te) {
-            return te.touches.length !== 2 || te.targetTouches.length !== 2;
-        }));
-        this._pinchOperation$ = new rxjs_1.Subject();
-        this._pinch$ = this._pinchOperation$.pipe(operators_1.scan(function (pinch, operation) {
-            return operation(pinch);
-        }, {
-            changeX: 0,
-            changeY: 0,
-            clientX: 0,
-            clientY: 0,
-            distance: 0,
-            distanceChange: 0,
-            distanceX: 0,
-            distanceY: 0,
-            originalEvent: null,
-            pageX: 0,
-            pageY: 0,
-            screenX: 0,
-            screenY: 0,
-            touch1: null,
-            touch2: null,
-        }));
-        this._touchMove$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        }), operators_1.map(function (te) {
-            return function (previous) {
-                var touch1 = te.touches[0];
-                var touch2 = te.touches[1];
-                var minX = Math.min(touch1.clientX, touch2.clientX);
-                var maxX = Math.max(touch1.clientX, touch2.clientX);
-                var minY = Math.min(touch1.clientY, touch2.clientY);
-                var maxY = Math.max(touch1.clientY, touch2.clientY);
-                var centerClientX = minX + (maxX - minX) / 2;
-                var centerClientY = minY + (maxY - minY) / 2;
-                var centerPageX = centerClientX + touch1.pageX - touch1.clientX;
-                var centerPageY = centerClientY + touch1.pageY - touch1.clientY;
-                var centerScreenX = centerClientX + touch1.screenX - touch1.clientX;
-                var centerScreenY = centerClientY + touch1.screenY - touch1.clientY;
-                var distanceX = Math.abs(touch1.clientX - touch2.clientX);
-                var distanceY = Math.abs(touch1.clientY - touch2.clientY);
-                var distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
-                var distanceChange = distance - previous.distance;
-                var changeX = distanceX - previous.distanceX;
-                var changeY = distanceY - previous.distanceY;
-                var current = {
-                    changeX: changeX,
-                    changeY: changeY,
-                    clientX: centerClientX,
-                    clientY: centerClientY,
-                    distance: distance,
-                    distanceChange: distanceChange,
-                    distanceX: distanceX,
-                    distanceY: distanceY,
-                    originalEvent: te,
-                    pageX: centerPageX,
-                    pageY: centerPageY,
-                    screenX: centerScreenX,
-                    screenY: centerScreenY,
-                    touch1: touch1,
-                    touch2: touch2,
-                };
-                return current;
-            };
-        }))
-            .subscribe(this._pinchOperation$);
-        this._pinchChange$ = this._pinchStart$.pipe(operators_1.switchMap(function (te) {
-            return _this._pinch$.pipe(operators_1.skip(1), operators_1.takeUntil(_this._pinchEnd$));
-        }));
-    }
-    Object.defineProperty(TouchService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "doubleTap$", {
-        get: function () {
-            return this._doubleTap$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchStart$", {
-        get: function () {
-            return this._touchStart$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchMove$", {
-        get: function () {
-            return this._touchMove$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchEnd$", {
-        get: function () {
-            return this._touchEnd$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchCancel$", {
-        get: function () {
-            return this._touchCancel$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", {
-        get: function () {
-            return this._singleTouchDragStart$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDrag$", {
-        get: function () {
-            return this._singleTouchDrag$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", {
-        get: function () {
-            return this._singleTouchDragEnd$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinch$", {
-        get: function () {
-            return this._pinchChange$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinchStart$", {
-        get: function () {
-            return this._pinchStart$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinchEnd$", {
-        get: function () {
-            return this._pinchEnd$;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    return TouchService;
-}());
-exports.TouchService = TouchService;
-
-},{"rxjs":43,"rxjs/operators":241}],485:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Viewer = void 0;
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var when = require("when");
-var Viewer_1 = require("../Viewer");
-var Utils_1 = require("../Utils");
+var xf,wf,Sf,Mf=(wf=String.prototype.split,Sf=/()??/.exec("")[1]===xf,function(t,e,i){if("[object RegExp]"!==Object.prototype.toString.call(e))return wf.call(t,e,i);var n,r,s,o,a=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":""),h=0;for(e=new RegExp(e.source,c+"g"),t+="",Sf||(n=new RegExp("^"+e.source+"$(?!\\s)",c)),i=i===xf?-1>>>0:i>>>0;(r=e.exec(t))&&!((s=r.index+r[0].length)>h&&(a.push(t.slice(h,r.index)),!Sf&&r.length>1&&r[0].replace(n,(function(){for(var t=1;t<arguments.length-2;t++)arguments[t]===xf&&(r[t]=xf)})),r.length>1&&r.index<t.length&&Array.prototype.push.apply(a,r.slice(1)),o=r[0].length,h=s,a.length>=i));)e.lastIndex===r.index&&e.lastIndex++;return h===t.length?!o&&e.test("")||a.push(""):a.push(t.slice(h)),a.length>i?a.slice(0,i):a}),Tf=/([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/,Cf=/^\.|#/,Ef=function(t,e){if(!t)return"DIV";var i,n,r,s,o=!e.hasOwnProperty("id"),a=Mf(t,Tf),c=null;Cf.test(a[1])&&(c="DIV");for(s=0;s<a.length;s++)(n=a[s])&&(r=n.charAt(0),c?"."===r?(i=i||[]).push(n.substring(1,n.length)):"#"===r&&o&&(e.id=n.substring(1,n.length)):c=n);i&&(e.className&&i.push(e.className),e.className=i.join(" "));return e.namespace?c:c.toUpperCase()};var If=Af;function Af(t){if(!(this instanceof Af))return new Af(t);this.value=t}Af.prototype.hook=function(t,e){t[e]!==this.value&&(t[e]=this.value)};var Pf="undefined"!=typeof window?window:void 0!==bp?bp:{},Rf=function(t,e){if(t in Pf)return Pf[t];return Pf[t]=e,e};(function(t,e,i){var n="__INDIVIDUAL_ONE_VERSION_"+t,r=Rf(n+"_ENFORCE_SINGLETON",e);if(r!==e)throw new Error("Can only have one copy of "+t+".\nYou already have version "+r+" installed.\nThis means you cannot install version "+e);Rf(n,i)})("ev-store","7");var Lf="__EV_STORE_KEY@7",Of=function(t){var e=t[Lf];e||(e=t[Lf]={});return e};var Nf=Df;function Df(t){if(!(this instanceof Df))return new Df(t);this.value=t}function $f(t,e,i,n){if("string"==typeof t)e.push(new yf(t));else if("number"==typeof t)e.push(new yf(String(t)));else if(kf(t))e.push(t);else{if(!Zd(t)){if(null==t)return;throw function(t){var e=new Error;return e.type="virtual-hyperscript.unexpected.virtual-element",e.message="Unexpected virtual child passed to h().\nExpected a VNode / Vthunk / VWidget / string but:\ngot:\n"+zf(t.foreignObject)+".\nThe parent vnode is:\n"+zf(t.parentVnode),e.foreignObject=t.foreignObject,e.parentVnode=t.parentVnode,e}({foreignObject:t,parentVnode:{tagName:i,properties:n}})}for(var r=0;r<t.length;r++)$f(t[r],e,i,n)}}function kf(t){return tp(t)||ep(t)||ip(t)||np(t)}function zf(t){try{return JSON.stringify(t,null,"    ")}catch(e){return String(t)}}Df.prototype.hook=function(t,e){Of(t)[e.substr(3)]=this.value},Df.prototype.unhook=function(t,e){Of(t)[e.substr(3)]=void 0};var Ff,Bf,jf={diff:yp,patch:ff,h:function(t,e,i){var n,r,s,o,a=[];!i&&(c=e,"string"==typeof c||Zd(c)||kf(c))&&(i=e,r={});var c;n=Ef(t,r=r||e||{}),r.hasOwnProperty("key")&&(s=r.key,r.key=void 0);r.hasOwnProperty("namespace")&&(o=r.namespace,r.namespace=void 0);"INPUT"!==n||o||!r.hasOwnProperty("value")||void 0===r.value||ap(r.value)||(r.value=If(r.value));(function(t){for(var e in t)if(t.hasOwnProperty(e)){var i=t[e];if(ap(i))continue;"ev-"===e.substr(0,3)&&(t[e]=Nf(i))}})(r),null!=i&&$f(i,a,n,r);return new mf(n,r,a,s,o)},create:nf,VNode:mf,VText:yf};class Hf{constructor(){this._events={}}on(t,e){this._events[t]=this._events[t]||[],this._events[t].push(e)}off(t,e){if(t){if(this._listens(t)){const i=this._events[t].indexOf(e);i>=0&&this._events[t].splice(i,1),this._events[t].length||delete this._events[t]}}else this._events={}}fire(t,e){if(this._listens(t))for(const i of this._events[t])i(e)}_listens(t){return t in this._events}}class Uf{constructor(){this._subscriptions=[]}push(t){this._subscriptions.push(t)}unsubscribe(){for(const t of this._subscriptions)t.unsubscribe();this._subscriptions=[]}}class Vf extends Hf{constructor(t,e,i){super(),this._activated$=new O(!1),this._configurationSubject$=new T,this._activated=!1,this._container=e,this._name=t,this._navigator=i,this._subscriptions=new Uf,this._configuration$=this._configurationSubject$.pipe(ni(this.defaultConfiguration),Le(((t,e)=>{for(let i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t})),Ue(1),E()),this._configuration$.subscribe((()=>{}))}get activated(){return this._activated}get activated$(){return this._activated$}get defaultConfiguration(){return this._getDefaultConfiguration()}get configuration$(){return this._configuration$}get name(){return this._name}activate(t){this._activated||(void 0!==t&&this._configurationSubject$.next(t),this._activated=!0,this._activate(),this._activated$.next(!0))}configure(t){this._configurationSubject$.next(t)}deactivate(){this._activated&&(this._activated=!1,this._deactivate(),this._container.domRenderer.clear(this._name),this._container.glRenderer.clear(this._name),this._activated$.next(!1))}fire(t,e){super.fire(t,e)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}resize(){}}!function(t){t[t.Hidden=0]="Hidden",t[t.Loading=1]="Loading",t[t.Visible=2]="Visible"}(Ff||(Ff={}));class Gf extends Vf{constructor(t,e,i){super(t,e,i)}_activate(){const t=this.configuration$.pipe(Ee((t=>!!t.id)),Nt((t=>!t.src)),ri((t=>this._getImageSrc$(t.id).pipe(te((t=>(console.error(t),B())))))),Ue(1),E()),e=this._subscriptions;e.push(t.pipe(rt((t=>({src:t})))).subscribe((t=>{this._configurationSubject$.next(t)}))),e.push(gt(this.configuration$,t).pipe(Nt((([t,e])=>!!t.src&&t.src!==e)),Ee()).subscribe((([,t])=>{window.URL.revokeObjectURL(t)}))),e.push(this._configuration$.pipe(ue(void 0,(t=>t.state)),ri((t=>gt(G(t.state),this._navigator.stateService.currentImage$))),ri((([t,e])=>{const i=gt(G(e.id),e.image$.pipe(Nt((t=>!!t)),rt((t=>t.src))));return t===Ff.Visible?i.pipe(Ee()):i})),ue((([t,e],[i,n])=>t===i&&e===n)),rt((([t,e])=>({id:t,src:e})))).subscribe(this._configurationSubject$)),e.push(gt(this._configuration$,this._container.configurationService.exploreUrl$,this._container.renderService.size$).pipe(rt((([t,e,i])=>{if(!t.src)return{name:this._name,vNode:jf.h("div",[])};const n=i.width<=640||i.height<=480?".mapillary-cover-compact":"";if(t.state===Ff.Hidden){const e=jf.h("div.mapillary-cover-container.mapillary-cover-done"+n,[this._getCoverBackgroundVNode(t)]);return{name:this._name,vNode:e}}const r=jf.h("div.mapillary-cover-container"+n,[this._getCoverButtonVNode(t,e)]);return{name:this._name,vNode:r}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{state:Ff.Visible}}_getCoverButtonVNode(t,e){const i=t.state===Ff.Loading?"div.mapillary-cover.mapillary-cover-loading":"div.mapillary-cover",n=jf.h("div.mapillary-cover-button",[jf.h("div.mapillary-cover-button-icon",[])]),r=jf.h("a.mapillary-cover-logo",{href:e,target:"_blank"},[]),s=jf.h("div.mapillary-cover-indicator",{onclick:()=>{this.configure({state:Ff.Loading})}},[]);return jf.h(i,[this._getCoverBackgroundVNode(t),s,n,r])}_getCoverBackgroundVNode(t){const e={style:{backgroundImage:`url(${t.src})`}},i=[];return t.state===Ff.Loading&&i.push(jf.h("div.mapillary-cover-spinner",{},[])),jf.h("div.mapillary-cover-background",e,i)}_getImageSrc$(t){return b.create((e=>{this._navigator.api.getImages$([t]).subscribe((i=>{for(const n of i)if(n.node_id===t)return void this._navigator.api.data.getImageBuffer(n.node.thumb.url).then((i=>{const n=new Image;n.crossOrigin="Anonymous",n.onload=()=>{e.next(n.src),e.complete()},n.onerror=()=>{e.error(new Error(`Failed to load cover image (${t})`))};const r=new Blob([i]);n.src=window.URL.createObjectURL(r)}),(t=>{e.error(t)}));e.error(new cd(`Non existent cover key: ${t}`))}),(t=>{e.error(t)}))}))}}Gf.componentName="cover";class qf extends Vf{_activate(){this._subscriptions.push(gt(this._container.configurationService.exploreUrl$,this._navigator.stateService.currentImage$,this._container.renderService.size$).pipe(rt((([t,e,i])=>{const n=this._makeAttribution(e.creatorUsername,t,e.id,e.capturedAt,i.width);return{name:this._name,vNode:n}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}makeImageUrl(t,e){return`${t}/app/?pKey=${e}&focus=photo`}_makeAttribution(t,e,i,n,r){const s=r<=640,o=this._makeDate(n,s),a=this._makeBy(t,e,i,s),c=s?".mapillary-attribution-compact":"";return jf.h("div.mapillary-attribution-container"+c,{},[...a,o])}_makeBy(t,e,i,n){const r=jf.h("div.mapillary-attribution-logo",[]);return t?this._makeCreatorBy(r,t,e,i,n):this._makeGeneralBy(r,e,i,n)}_makeCreatorBy(t,e,i,n,r){const s=jf.h("a.mapillary-attribution-icon-container",{href:i,rel:"noreferrer",target:"_blank"},[t]),o=r?`${e}`:`image by ${e}`,a=jf.h("div.mapillary-attribution-username",{textContent:o},[]);return[s,jf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(i,n),rel:"noreferrer",target:"_blank"},[a])]}_makeGeneralBy(t,e,i,n){const r=jf.h("div.mapillary-attribution-username",{textContent:"images by"},[]),s=[jf.h("div.mapillary-attribution-icon-container",{},[t]),jf.h("div.mapillary-attribution-username",{textContent:"contributors"},[])];n||s.unshift(r);return[jf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(e,i),rel:"noreferrer",target:"_blank"},s)]}_makeDate(t,e){const i=new Date(t).toDateString().split(" "),n=(i.length>3?e?[i[3]]:[i[1],i[2]+",",i[3]]:i).join(" ");return jf.h("div.mapillary-attribution-date",{textContent:n},[])}}qf.componentName="attribution";class Wf{constructor(){this._unprojectDepth=200}basicToCanvas(t,e,i,n,r){const s=n.unprojectBasic([t,e],this._unprojectDepth);return this.projectToCanvas(s,i,r)}basicToCanvasSafe(t,e,i,n,r){const s=this.basicToViewportSafe(t,e,n,r);if(null===s)return null;return this.viewportToCanvas(s[0],s[1],i)}basicToViewport(t,e,i,n){const r=i.unprojectBasic([t,e],this._unprojectDepth);return this.projectToViewport(r,n)}basicToViewportSafe(t,e,i,n){const r=i.unprojectBasic([t,e],this._unprojectDepth);if(this.worldToCamera(r,n)[2]>0)return null;return this.projectToViewport(r,n)}cameraToViewport(t,e){const i=(new fn).fromArray(t).applyMatrix4(e.projectionMatrix);return[i.x,i.y]}canvasPosition(t,e){const i=e.getBoundingClientRect();return[t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop]}canvasToBasic(t,e,i,n,r){const s=this.unprojectFromCanvas(t,e,i,r).toArray();return n.projectBasic(s)}canvasToViewport(t,e,i){const[n,r]=this.containerToCanvas(i);return[2*t/n-1,1-2*e/r]}containerToCanvas(t){return[t.offsetWidth,t.offsetHeight]}getBasicDistances(t,e){const i=this.viewportToBasic(-1,1,t,e),n=this.viewportToBasic(1,1,t,e),r=this.viewportToBasic(1,-1,t,e),s=this.viewportToBasic(-1,-1,t,e);let o=0,a=0,c=0,h=0;return i[1]<0&&n[1]<0&&(o=i[1]>n[1]?-i[1]:-n[1]),n[0]>1&&r[0]>1&&(a=n[0]<r[0]?n[0]-1:r[0]-1),r[1]>1&&s[1]>1&&(c=r[1]<s[1]?r[1]-1:s[1]-1),s[0]<0&&i[0]<0&&(h=s[0]>i[0]?-s[0]:-i[0]),[o,a,c,h]}getPixelDistances(t,e,i){const n=this.viewportToBasic(-1,1,e,i),r=this.viewportToBasic(1,1,e,i),s=this.viewportToBasic(1,-1,e,i),o=this.viewportToBasic(-1,-1,e,i);let a=0,c=0,h=0,l=0;const[u,d]=this.containerToCanvas(t);if(n[1]<0&&r[1]<0){const s=n[1]>r[1]?n[0]:r[0],o=this.basicToCanvas(s,0,t,e,i);a=o[1]>0?o[1]:0}if(r[0]>1&&s[0]>1){const n=r[0]<s[0]?r[1]:s[1],o=this.basicToCanvas(1,n,t,e,i);c=o[0]<u?u-o[0]:0}if(s[1]>1&&o[1]>1){const n=s[1]<o[1]?s[0]:o[0],r=this.basicToCanvas(n,1,t,e,i);h=r[1]<d?d-r[1]:0}if(o[0]<0&&n[0]<0){const r=o[0]>n[0]?o[1]:n[1],s=this.basicToCanvas(0,r,t,e,i);l=s[0]>0?s[0]:0}return[a,c,h,l]}insideElement(t,e){const i=e.getBoundingClientRect(),n=i.left+e.clientLeft,r=n+e.clientWidth,s=i.top+e.clientTop,o=s+e.clientHeight;return t.clientX>n&&t.clientX<r&&t.clientY>s&&t.clientY<o}projectToCanvas(t,e,i){const n=this.projectToViewport(t,i);return this.viewportToCanvas(n[0],n[1],e)}projectToCanvasSafe(t,e,i){if(this.worldToCamera(t,i)[2]>0)return null;const n=this.projectToViewport(t,i);return this.viewportToCanvas(n[0],n[1],e)}projectToViewport(t,e){const i=new fn(t[0],t[1],t[2]).project(e);return[i.x,i.y]}unprojectFromCanvas(t,e,i,n){const r=this.canvasToViewport(t,e,i);return this.unprojectFromViewport(r[0],r[1],n)}unprojectFromViewport(t,e,i){return new fn(t,e,1).unproject(i)}viewportToBasic(t,e,i,n){const r=new fn(t,e,1).unproject(n).toArray();return i.projectBasic(r)}viewportToCanvas(t,e,i){const[n,r]=this.containerToCanvas(i);return[n*(t+1)/2,-r*(e-1)/2]}worldToCamera(t,e){return new fn(t[0],t[1],t[2]).applyMatrix4(e.matrixWorldInverse).toArray()}}t.ComponentSize=void 0,(Bf=t.ComponentSize||(t.ComponentSize={}))[Bf.Automatic=0]="Automatic",Bf[Bf.Large=1]="Large",Bf[Bf.Small=2]="Small";class Xf extends Vf{constructor(t,e,i){super(t,e,i),this._spatial=new ld,this._viewportCoords=new Wf,this._svgNamespace="http://www.w3.org/2000/svg",this._distinctThreshold=Math.PI/360,this._animationSpeed=.075,this._unitBezier=new Fd(.74,.67,.38,.96)}_activate(){const e=this._subscriptions,i=this._container.renderService.renderCamera$.pipe(rt((t=>{let e=this._spatial.degToRad(t.perspective.fov),i=t.perspective.aspect===Number.POSITIVE_INFINITY?Math.PI:2*Math.atan(t.perspective.aspect*Math.tan(.5*e));return[this._spatial.azimuthalToBearing(t.rotation.phi),i]})),ue(((t,e)=>Math.abs(e[0]-t[0])<this._distinctThreshold&&Math.abs(e[1]-t[1])<this._distinctThreshold))),n=gt(this._navigator.stateService.currentState$.pipe(ue(void 0,(t=>t.state.currentImage.id))),this._navigator.panService.panImages$).pipe(rt((([t,e])=>{const i=t.state.currentImage,n=t.state.currentTransform;if(dd(i.cameraType))return[Math.PI,Math.PI];const r=this._computeProjectedPoints(n),s=this._spatial.degToRad(this._computeHorizontalFov(r));let o=s/2,a=s/2;for(const[t,,n]of e){const e=this._spatial.wrap(t.compassAngle-i.compassAngle,-180,180);e<0?o=this._spatial.degToRad(Math.abs(e))+n/2:a=this._spatial.degToRad(Math.abs(e))+n/2}return[o,a]})),ue((([t,e],[i,n])=>Math.abs(i-t)<this._distinctThreshold&&Math.abs(n-e)<this._distinctThreshold))),r=gt(this._navigator.stateService.currentState$.pipe(ue(void 0,(t=>t.state.currentImage.id))),this._container.renderService.bearing$).pipe(rt((([t,e])=>this._spatial.degToRad(t.state.currentImage.compassAngle-e)))),s=new T,o=s.pipe(Le(((t,e)=>e(t)),{alpha:0,curr:[0,0,0],prev:[0,0,0]}),rt((t=>{const e=this._unitBezier.solve(t.alpha),i=t.curr,n=t.prev;return[this._interpolate(n[0],i[0],e),this._interpolate(n[1],i[1],e)]})));e.push(n.pipe(rt((t=>e=>{const i=this._unitBezier.solve(e.alpha),n=e.curr,r=e.prev,s=[this._interpolate(r[0],n[0],i),this._interpolate(r[1],n[1],i)];return{alpha:0,curr:t.slice(),prev:s}}))).subscribe(s)),e.push(n.pipe(ri((()=>this._container.renderService.renderCameraFrame$.pipe(Je(1),Le((t=>t+this._animationSpeed),0),li((t=>t<=1+this._animationSpeed)),rt((t=>Math.min(t,1)))))),rt((t=>e=>({alpha:t,curr:e.curr.slice(),prev:e.prev.slice()})))).subscribe(s));const a=gt(r,o).pipe(rt((([t,e])=>[t,e[0],e[1]])));e.push(gt(i,a,this._configuration$,this._container.renderService.size$).pipe(rt((([[e,i],[n,r,s],o,a])=>{const c=this._createBackground(e),h=this._createFovIndicator(r,s,n),l=this._createNorth(e),u=this._createCircleSectorCompass(this._createCircleSector(Math.max(Math.PI/20,i),"#FFF")),d=o.size===t.ComponentSize.Small||o.size===t.ComponentSize.Automatic&&a.width<640?".mapillary-bearing-compact":"";return{name:this._name,vNode:jf.h("div.mapillary-bearing-indicator-container"+d,{oncontextmenu:t=>{t.preventDefault()}},[c,h,l,u])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:t.ComponentSize.Automatic}}_createFovIndicator(t,e,i){const n=this._createFovArc(t,e),r=jf.h("g",{attributes:{transform:"translate(18,18)"},namespace:this._svgNamespace},[n]);return jf.h("svg",{attributes:{viewBox:"0 0 36 36"},namespace:this._svgNamespace,style:{height:"36px",left:"2px",position:"absolute",top:"2px",transform:`rotateZ(${this._spatial.radToDeg(i)}deg)`,width:"36px"}},[r])}_createFovArc(t,e){const i=16.75,n=t+e;if(n>2*Math.PI-Math.PI/90)return jf.h("circle",{attributes:{cx:"0",cy:"0","fill-opacity":"0",r:"16.75",stroke:"#FFF","stroke-width":"2.5"},namespace:this._svgNamespace},[]);let r=-Math.PI/2-t,s=r+n,o=i*Math.cos(r),a=i*Math.sin(r),c=i*Math.cos(s),h=i*Math.sin(s),l=`M ${o} ${a} A 16.75 16.75 0 ${n>=Math.PI?1:0} 1 ${c} ${h}`;return jf.h("path",{attributes:{d:l,"fill-opacity":"0",stroke:"#FFF","stroke-width":"2.5"},namespace:this._svgNamespace},[])}_createCircleSectorCompass(t){let e=jf.h("g",{attributes:{transform:"translate(1,1)"},namespace:this._svgNamespace},[t]);return jf.h("svg",{attributes:{viewBox:"0 0 2 2"},namespace:this._svgNamespace,style:{height:"26px",left:"7px",position:"absolute",top:"7px",width:"26px"}},[e])}_createCircleSector(t,e){if(t>2*Math.PI-Math.PI/90)return jf.h("circle",{attributes:{cx:"0",cy:"0",fill:e,r:"1"},namespace:this._svgNamespace},[]);let i=-Math.PI/2-t/2,n=i+t,r=Math.cos(i),s=Math.sin(i),o=Math.cos(n),a=Math.sin(n),c=`M 0 0 ${r} ${s} A 1 1 0 ${t>=Math.PI?1:0} 1 ${o} ${a}`;return jf.h("path",{attributes:{d:c,fill:e},namespace:this._svgNamespace},[])}_createNorth(t){const e=jf.h("div.mapillary-bearing-north",[]);return jf.h("div.mapillary-bearing-north-container",{style:{transform:`rotateZ(${this._spatial.radToDeg(-t)}deg)`}},[e])}_createBackground(t){return jf.h("div.mapillary-bearing-indicator-background",{style:{transform:`rotateZ(${this._spatial.radToDeg(-t)}deg)`}},[jf.h("div.mapillary-bearing-indicator-background-circle",[]),jf.h("div.mapillary-bearing-indicator-background-arrow-container",[jf.h("div.mapillary-bearing-indicator-background-arrow",[])])])}_computeProjectedPoints(t){return md(t,[[1,0]],[[0,.5]],12,this._viewportCoords)}_computeHorizontalFov(t){const e=t.map((t=>this._coordToFov(t[0])));return Math.min(...e)}_coordToFov(t){return this._spatial.radToDeg(2*Math.atan(t))}_interpolate(t,e,i){return(1-i)*t+i*e}}Xf.componentName="bearing";class Yf extends Vf{constructor(t,e,i){super(t,e,i)}_activate(){const e=this._subscriptions;e.push(gt(this._navigator.stateService.currentImage$.pipe(ri((t=>t.sequenceEdges$)),Nt((t=>t.cached))),this._configuration$).pipe(ri((e=>{let i=e[0],n=e[1],r=Math.max(0,Math.min(4,n.depth.sequence));return Ot(this._cache$(i.edges,t.NavigationDirection.Next,r),this._cache$(i.edges,t.NavigationDirection.Prev,r)).pipe(te((t=>(console.error("Failed to cache sequence edges.",t),B()))))}))).subscribe((()=>{}))),e.push(gt(this._navigator.stateService.currentImage$.pipe(ri((t=>gt(G(t),t.spatialEdges$.pipe(Nt((t=>t.cached))))))),this._configuration$).pipe(ri((([[e,i],n])=>{let r=i.edges,s=n.depth,o=Math.max(0,Math.min(2,s.spherical)),a=dd(e.cameraType)?0:Math.max(0,Math.min(3,s.step)),c=dd(e.cameraType)?0:Math.max(0,Math.min(1,s.turn)),h=this._cache$(r,t.NavigationDirection.Spherical,o);return Ot(this._cache$(r,t.NavigationDirection.StepForward,a),this._cache$(r,t.NavigationDirection.StepBackward,a),this._cache$(r,t.NavigationDirection.StepLeft,a),this._cache$(r,t.NavigationDirection.StepRight,a),h,this._cache$(r,t.NavigationDirection.TurnLeft,c),this._cache$(r,t.NavigationDirection.TurnRight,c),this._cache$(r,t.NavigationDirection.TurnU,c)).pipe(te((t=>(console.error("Failed to cache spatial edges.",t),B()))))}))).subscribe((()=>{})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{depth:{spherical:1,sequence:2,step:1,turn:0}}}_cache$(t,e,i){return Ft(G(t),G(i)).pipe(xe((t=>{let i=t[0],n=t[1],r=[];if(n>0)for(let t of i)t.data.direction===e&&r.push(Ft(this._navigator.graphService.cacheImage$(t.target).pipe(Mt((t=>this._imageToEdges$(t,e)))),G(n-1)));return bt(r).pipe(Et())})),Je(1))}_imageToEdges$(e,i){return([t.NavigationDirection.Next,t.NavigationDirection.Prev].indexOf(i)>-1?e.sequenceEdges$:e.spatialEdges$).pipe(Ee((t=>t.cached)),rt((t=>t.edges)))}}Yf.componentName="cache";class Zf extends cd{constructor(t){super(null!=t?t:"The request was cancelled."),Object.setPrototypeOf(this,Zf.prototype),this.name="CancelMapillaryError"}}class Jf{constructor(t,e){this._spatial=new ld,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._configure(t),this._resize(e),this._reset()}get minWidth(){return this._minWidth}get maxWidth(){return this._maxWidth}get containerWidth(){return this._containerWidth}get containerWidthCss(){return this._containerWidthCss}get containerMarginCss(){return this._containerMarginCss}get containerLeftCss(){return this._containerLeftCss}get containerHeight(){return this._containerHeight}get containerHeightCss(){return this._containerHeightCss}get containerBottomCss(){return this._containerBottomCss}get stepCircleSize(){return this._stepCircleSize}get stepCircleSizeCss(){return this._stepCircleSizeCss}get stepCircleMarginCss(){return this._stepCircleMarginCss}get turnCircleSize(){return this._turnCircleSize}get turnCircleSizeCss(){return this._turnCircleSizeCss}get outerRadius(){return this._outerRadius}get innerRadius(){return this._innerRadius}get shadowOffset(){return this._shadowOffset}configure(t){this._configure(t),this._reset()}resize(t){this._resize(t),this._reset()}angleToCoordinates(t){return[Math.cos(t),Math.sin(t)]}relativeAngleToCoordiantes(t,e){let i=this._spatial.wrapAngle(t-e);return this.angleToCoordinates(i)}_configure(t){this._minWidth=t.minWidth,this._maxWidth=this._getMaxWidth(t.minWidth,t.maxWidth)}_resize(t){this._elementWidth=t.width,this._elementHeight=t.height}_reset(){this._containerWidth=this._getContainerWidth(this._elementWidth,this._elementHeight),this._containerHeight=this._getContainerHeight(this.containerWidth),this._stepCircleSize=this._getStepCircleDiameter(this._containerHeight),this._turnCircleSize=this._getTurnCircleDiameter(this.containerHeight),this._outerRadius=this._getOuterRadius(this._containerHeight),this._innerRadius=this._getInnerRadius(this._containerHeight),this._shadowOffset=3,this._containerWidthCss=this._numberToCssPixels(this._containerWidth),this._containerMarginCss=this._numberToCssPixels(-.5*this._containerWidth),this._containerLeftCss=this._numberToCssPixels(Math.floor(.5*this._elementWidth)),this._containerHeightCss=this._numberToCssPixels(this._containerHeight),this._containerBottomCss=this._numberToCssPixels(Math.floor(-.08*this._containerHeight)),this._stepCircleSizeCss=this._numberToCssPixels(this._stepCircleSize),this._stepCircleMarginCss=this._numberToCssPixels(-.5*this._stepCircleSize),this._turnCircleSizeCss=this._numberToCssPixels(this._turnCircleSize)}_getContainerWidth(t,e){let i=(t-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),n=(e-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight),r=Math.max(0,Math.min(1,Math.min(i,n)));return r=.04*Math.round(25*r),this._minWidth+r*(this._maxWidth-this._minWidth)}_getContainerHeight(t){return.77*t}_getStepCircleDiameter(t){return.34*t}_getTurnCircleDiameter(t){return.3*t}_getOuterRadius(t){return.31*t}_getInnerRadius(t){return.125*t}_numberToCssPixels(t){return t+"px"}_getMaxWidth(t,e){return t>e?t:e}}class Kf{constructor(e,i){this._isEdge=!1,this._spatial=new ld,this._calculator=new Jf(e,i),this._image=null,this._rotation={phi:0,theta:0},this._epsilon=.5*Math.PI/180,this._highlightKey=null,this._distinguishSequence=!1,this._needsRender=!1,this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[],this._stepDirections=[t.NavigationDirection.StepForward,t.NavigationDirection.StepBackward,t.NavigationDirection.StepLeft,t.NavigationDirection.StepRight],this._turnDirections=[t.NavigationDirection.TurnLeft,t.NavigationDirection.TurnRight,t.NavigationDirection.TurnU],this._turnNames={},this._turnNames[t.NavigationDirection.TurnLeft]="mapillary-direction-turn-left",this._turnNames[t.NavigationDirection.TurnRight]="mapillary-direction-turn-right",this._turnNames[t.NavigationDirection.TurnU]="mapillary-direction-turn-around";let n=!!document.documentMode;this._isEdge=!n&&!!window.StyleMedia}get needsRender(){return this._needsRender}render(t){this._needsRender=!1;let e=this._rotation,i=[],n=[];return dd(this._image.cameraType)?i=i.concat(this._createSphericalArrows(t,e)):(i=i.concat(this._createPerspectiveToSphericalArrows(t,e)),i=i.concat(this._createStepArrows(t,e)),n=n.concat(this._createTurnArrows(t))),this._getContainer(i,n,e)}setEdges(t,e){this._setEdges(t,e),this._setNeedsRender()}setImage(t){this._image=t,this._clearEdges(),this._setNeedsRender()}setRenderCamera(t){let e=t.rotation;Math.abs(e.phi-this._rotation.phi)<this._epsilon||(this._rotation=e,this._setNeedsRender())}setConfiguration(t){let e=!1;this._highlightKey===t.highlightId&&this._distinguishSequence===t.distinguishSequence||(this._highlightKey=t.highlightId,this._distinguishSequence=t.distinguishSequence,e=!0),this._calculator.minWidth===t.minWidth&&this._calculator.maxWidth===t.maxWidth||(this._calculator.configure(t),e=!0),e&&this._setNeedsRender()}resize(t){this._calculator.resize(t),this._setNeedsRender()}_setNeedsRender(){null!=this._image&&(this._needsRender=!0)}_clearEdges(){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[]}_setEdges(e,i){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[];for(let i of e.edges){let e=i.data.direction;this._stepDirections.indexOf(e)>-1?this._stepEdges.push(i):this._turnDirections.indexOf(e)>-1?this._turnEdges.push(i):i.data.direction===t.NavigationDirection.Spherical&&this._sphericalEdges.push(i)}if(this._distinguishSequence&&null!=i){let t=this._sphericalEdges.concat(this._stepEdges).concat(this._turnEdges);for(let e of t){let t=e.target;for(let e of i.imageIds)if(e===t){this._sequenceEdgeKeys.push(t);break}}}}_createSphericalArrows(t,e){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(t,n.target,n.data.worldMotionAzimuth,e,this._calculator.outerRadius,"mapillary-direction-arrow-spherical"));for(let n of this._stepEdges)i.push(this._createSphericalToPerspectiveArrow(t,n.target,n.data.worldMotionAzimuth,e,n.data.direction));return i}_createSphericalToPerspectiveArrow(e,i,n,r,s){let o=Math.PI/8,a=r.phi;switch(s){case t.NavigationDirection.StepBackward:a=r.phi-Math.PI;break;case t.NavigationDirection.StepLeft:a=r.phi+Math.PI/2;break;case t.NavigationDirection.StepRight:a=r.phi-Math.PI/2}return Math.abs(this._spatial.wrapAngle(n-a))<o?this._createVNodeByKey(e,i,n,r,this._calculator.outerRadius,"mapillary-direction-arrow-step"):this._createVNodeInactive(i,n,r)}_createPerspectiveToSphericalArrows(t,e){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(t,n.target,n.data.worldMotionAzimuth,e,this._calculator.innerRadius,"mapillary-direction-arrow-spherical",!0));return i}_createStepArrows(t,e){let i=[];for(let n of this._stepEdges)i.push(this._createVNodeByDirection(t,n.target,n.data.worldMotionAzimuth,e,n.data.direction));return i}_createTurnArrows(t){let e=[];for(let i of this._turnEdges){let n=i.data.direction,r=this._turnNames[n];e.push(this._createVNodeByTurn(t,i.target,r,n))}return e}_createVNodeByKey(t,e,i,n,r,s,o){return this._createVNode(e,i,n,r,s,"mapillary-direction-circle",(i=>{t.moveTo$(e).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}),o)}_createVNodeByDirection(t,e,i,n,r){return this._createVNode(e,i,n,this._calculator.outerRadius,"mapillary-direction-arrow-step","mapillary-direction-circle",(e=>{t.moveDir$(r).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}))}_createVNodeByTurn(e,i,n,r){let s={height:this._calculator.turnCircleSizeCss,transform:"rotate(0)",width:this._calculator.turnCircleSizeCss};switch(r){case t.NavigationDirection.TurnLeft:s.left="5px",s.top="5px";break;case t.NavigationDirection.TurnRight:s.right="5px",s.top="5px";break;case t.NavigationDirection.TurnU:s.left="5px",s.bottom="5px"}let o={attributes:{"data-id":i},onclick:t=>{e.moveDir$(r).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))},style:s},a="mapillary-direction-turn-circle";this._sequenceEdgeKeys.indexOf(i)>-1&&(a+="-sequence"),this._highlightKey===i&&(a+="-highlight");let c=jf.h(`div.${n}`,{},[]);return jf.h("div."+a,o,[c])}_createVNodeInactive(t,e,i){return this._createVNode(t,e,i,this._calculator.outerRadius,"mapillary-direction-arrow-inactive","mapillary-direction-circle-inactive")}_createVNode(t,e,i,n,r,s,o,a){let c=this._calculator.angleToCoordinates(e-i.phi),h=Math.round(-n*c[1]+.5*this._calculator.containerWidth),l=Math.round(-n*c[0]+.5*this._calculator.containerHeight),u=this._calculator.relativeAngleToCoordiantes(e,i.phi),d=this._calculator.shadowOffset,p=`drop-shadow(${-d*u[1]}px ${d*u[0]}px 1px rgba(0,0,0,0.8))`,f={style:{"-webkit-filter":p,filter:p}},m=jf.h("div."+r,f,[]),g=-this._spatial.radToDeg(e-i.phi),_=a?`translate(${h}px, ${l}px) rotate(${g}deg) translateZ(-0.01px)`:`translate(${h}px, ${l}px) rotate(${g}deg)`,v={attributes:{"data-id":t},onclick:o,style:{height:this._calculator.stepCircleSizeCss,marginLeft:this._calculator.stepCircleMarginCss,marginTop:this._calculator.stepCircleMarginCss,transform:_,width:this._calculator.stepCircleSizeCss}};return this._sequenceEdgeKeys.indexOf(t)>-1&&(s+="-sequence"),this._highlightKey===t&&(s+="-highlight"),jf.h("div."+s,v,[m])}_getContainer(t,e,i){let n=this._isEdge?"rotateX(60deg)":`perspective(${this._calculator.containerWidthCss}) rotateX(60deg)`,r={oncontextmenu:t=>{t.preventDefault()},style:{bottom:this._calculator.containerBottomCss,height:this._calculator.containerHeightCss,left:this._calculator.containerLeftCss,marginLeft:this._calculator.containerMarginCss,transform:n,width:this._calculator.containerWidthCss}};return jf.h("div.mapillary-direction-perspective",r,e.concat(t))}}class Qf extends Vf{constructor(t,e,i,n){super(t,e,i),this._renderer=n||new Kf(this.defaultConfiguration,{height:e.container.offsetHeight,width:e.container.offsetWidth}),this._hoveredIdSubject$=new T,this._hoveredId$=this._hoveredIdSubject$.pipe(Ze())}fire(t,e){super.fire(t,e)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}_activate(){const t=this._subscriptions;t.push(this._configuration$.subscribe((t=>{this._renderer.setConfiguration(t)}))),t.push(this._container.renderService.size$.subscribe((t=>{this._renderer.resize(t)}))),t.push(this._navigator.stateService.currentImage$.pipe(pi((t=>{this._container.domRenderer.render$.next({name:this._name,vNode:jf.h("div",{},[])}),this._renderer.setImage(t)})),bi(this._configuration$),ri((([t,e])=>gt(t.spatialEdges$,e.distinguishSequence?this._navigator.graphService.cacheSequence$(t.sequenceId).pipe(te((e=>(console.error(`Failed to cache sequence (${t.sequenceId})`,e),G(null))))):G(null))))).subscribe((([t,e])=>{this._renderer.setEdges(t,e)}))),t.push(this._container.renderService.renderCameraFrame$.pipe(pi((t=>{this._renderer.setRenderCamera(t)})),rt((()=>this._renderer)),Nt((t=>t.needsRender)),rt((t=>({name:this._name,vNode:t.render(this._navigator)})))).subscribe(this._container.domRenderer.render$)),t.push(gt(this._container.domRenderer.element$,this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$.pipe(ni(null)),this._container.mouseService.mouseUp$.pipe(ni(null))).pipe(rt((([t])=>{let e=t.getElementsByClassName("mapillary-direction-perspective");for(let t=0;t<e.length;t++){let i=e.item(t).querySelector(":hover");if(null!=i&&i.hasAttribute("data-id"))return i.getAttribute("data-id")}return null})),ue()).subscribe(this._hoveredIdSubject$)),t.push(this._hoveredId$.subscribe((t=>{const e="hover",i={id:t,target:this,type:e};this.fire(e,i)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{distinguishSequence:!1,maxWidth:460,minWidth:260}}}Qf.componentName="direction";class tm{}tm.fisheye={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.fisheyeCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.perspective={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.perspectiveCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.perspectiveDistorted={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.perspectiveDistortedCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.spherical={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\n#define tau 6.28318530718\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lng = atan(b.x, b.z);\n    float x = lng / tau + 0.5;\n    float y = lat / tau * 2.0 + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},tm.sphericalCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\n#define tau 6.28318530718\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lng = atan(b.x, b.z);\n    float x = lng / tau + 0.5;\n    float y = lat / tau * 2.0 + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"};class em{constructor(t,e){this._imagePlaneDepth=null!=t?t:200,this._imageSphereRadius=null!=e?e:200}createMesh(t,e){return dd(e.cameraType)?this._createImageSphere(t,e):pd(e.cameraType)?this._createImagePlaneFisheye(t,e):this._createImagePlane(t,e)}createFlatMesh(t,e,i,n,r,s){let o=this._createTexture(t.image),a=new Os(this._createDistortedPlaneMaterialParameters(e,o));return new Es(this._getFlatImagePlaneGeoFromBasic(e,i,n,r,s),a)}createCurtainMesh(t,e){return dd(e.cameraType)?this._createSphereCurtainMesh(t,e):pd(e.cameraType)?this._createCurtainMeshFisheye(t,e):this._createCurtainMesh(t,e)}createDistortedCurtainMesh(t,e){return this._createDistortedCurtainMesh(t,e)}_createCurtainMesh(t,e){let i=this._createTexture(t.image),n=new Os(this._createCurtainPlaneMaterialParameters(e,i));return new Es(this._useMesh(e,t)?this._getImagePlaneGeo(e,t):this._getRegularFlatImagePlaneGeo(e),n)}_createCurtainMeshFisheye(t,e){let i=this._createTexture(t.image),n=new Os(this._createCurtainPlaneMaterialParametersFisheye(e,i));return new Es(this._useMesh(e,t)?this._getImagePlaneGeoFisheye(e,t):this._getRegularFlatImagePlaneGeo(e),n)}_createDistortedCurtainMesh(t,e){let i=this._createTexture(t.image),n=new Os(this._createDistortedCurtainPlaneMaterialParameters(e,i));return new Es(this._getRegularFlatImagePlaneGeo(e),n)}_createSphereCurtainMesh(t,e){let i=this._createTexture(t.image),n=new Os(this._createCurtainSphereMaterialParameters(e,i));return this._useMesh(e,t)?new Es(this._getImageSphereGeo(e,t),n):new Es(this._getFlatImageSphereGeo(e),n)}_createImageSphere(t,e){let i=this._createTexture(t.image),n=new Os(this._createSphereMaterialParameters(e,i));return this._useMesh(e,t)?new Es(this._getImageSphereGeo(e,t),n):new Es(this._getFlatImageSphereGeo(e),n)}_createImagePlane(t,e){let i=this._createTexture(t.image),n=new Os(this._createPlaneMaterialParameters(e,i));return new Es(this._useMesh(e,t)?this._getImagePlaneGeo(e,t):this._getRegularFlatImagePlaneGeo(e),n)}_createImagePlaneFisheye(t,e){let i=this._createTexture(t.image),n=new Os(this._createPlaneMaterialParametersFisheye(e,i));return new Es(this._useMesh(e,t)?this._getImagePlaneGeoFisheye(e,t):this._getRegularFlatImagePlaneGeoFisheye(e),n)}_createSphereMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.spherical.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:t.rt},projectorTex:{value:e}},vertexShader:tm.spherical.vertex}}_createCurtainSphereMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.sphericalCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:t.rt},projectorTex:{value:e}},vertexShader:tm.sphericalCurtain.vertex}}_createPlaneMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.perspective.fragment,side:2,transparent:!0,uniforms:{focal:{value:t.focal},k1:{value:t.ck1},k2:{value:t.ck2},opacity:{value:1},projectorMat:{value:t.basicRt},projectorTex:{value:e},radial_peak:{value:t.radialPeak?t.radialPeak:0},scale_x:{value:Math.max(t.basicHeight,t.basicWidth)/t.basicWidth},scale_y:{value:Math.max(t.basicWidth,t.basicHeight)/t.basicHeight}},vertexShader:tm.perspective.vertex}}_createPlaneMaterialParametersFisheye(t,e){return{depthWrite:!1,fragmentShader:tm.fisheye.fragment,side:2,transparent:!0,uniforms:{focal:{value:t.focal},k1:{value:t.ck1},k2:{value:t.ck2},opacity:{value:1},projectorMat:{value:t.basicRt},projectorTex:{value:e},radial_peak:{value:t.radialPeak?t.radialPeak:0},scale_x:{value:Math.max(t.basicHeight,t.basicWidth)/t.basicWidth},scale_y:{value:Math.max(t.basicWidth,t.basicHeight)/t.basicHeight}},vertexShader:tm.fisheye.vertex}}_createCurtainPlaneMaterialParametersFisheye(t,e){return{depthWrite:!1,fragmentShader:tm.fisheyeCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:t.focal},k1:{value:t.ck1},k2:{value:t.ck2},opacity:{value:1},projectorMat:{value:t.basicRt},projectorTex:{value:e},radial_peak:{value:t.radialPeak?t.radialPeak:0},scale_x:{value:Math.max(t.basicHeight,t.basicWidth)/t.basicWidth},scale_y:{value:Math.max(t.basicWidth,t.basicHeight)/t.basicHeight}},vertexShader:tm.fisheyeCurtain.vertex}}_createCurtainPlaneMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.perspectiveCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:t.focal},k1:{value:t.ck1},k2:{value:t.ck2},opacity:{value:1},projectorMat:{value:t.basicRt},projectorTex:{value:e},radial_peak:{value:t.radialPeak?t.radialPeak:0},scale_x:{value:Math.max(t.basicHeight,t.basicWidth)/t.basicWidth},scale_y:{value:Math.max(t.basicWidth,t.basicHeight)/t.basicHeight}},vertexShader:tm.perspectiveCurtain.vertex}}_createDistortedCurtainPlaneMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.perspectiveDistortedCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:t.projectorMatrix()},projectorTex:{value:e}},vertexShader:tm.perspectiveDistortedCurtain.vertex}}_createDistortedPlaneMaterialParameters(t,e){return{depthWrite:!1,fragmentShader:tm.perspectiveDistorted.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:t.projectorMatrix()},projectorTex:{value:e}},vertexShader:tm.perspectiveDistorted.vertex}}_createTexture(t){let e=new hn(t);return e.minFilter=Ai,e.needsUpdate=!0,e}_useMesh(t,e){return e.mesh.vertices.length&&t.hasValidScale}_getImageSphereGeo(t,e){const i=t.srtInverse;let n=5*t.scale,r=this._imageSphereRadius*t.scale,s=e.mesh.vertices,o=s.length/3,a=new Float32Array(s.length);for(let t=0;t<o;++t){let e=3*t,o=s[e+0],c=s[e+1],h=s[e+2],l=Math.sqrt(o*o+c*c+h*h),u=Math.max(n,Math.min(l,r))/l,d=new fn(o*u,c*u,h*u);d.applyMatrix4(i),a[e+0]=d.x,a[e+1]=d.y,a[e+2]=d.z}let c=e.mesh.faces,h=new Uint16Array(c.length);for(let t=0;t<c.length;++t)h[t]=c[t];let l=new hs;return l.setAttribute("position",new Hr(a,3)),l.setIndex(new Hr(h,1)),l}_getImagePlaneGeo(t,e){const i=t.srtInverse;let n=5*t.scale,r=this._imagePlaneDepth*t.scale,s=e.mesh.vertices,o=s.length/3,a=new Float32Array(s.length);for(let t=0;t<o;++t){let e=3*t,o=s[e+0],c=s[e+1],h=s[e+2];t<4&&(o*=3,c*=3);let l=Math.max(n,Math.min(h,r)),u=l/h,d=new fn(o*u,c*u,l);d.applyMatrix4(i),a[e+0]=d.x,a[e+1]=d.y,a[e+2]=d.z}let c=e.mesh.faces,h=new Uint16Array(c.length);for(let t=0;t<c.length;++t)h[t]=c[t];let l=new hs;return l.setAttribute("position",new Hr(a,3)),l.setIndex(new Hr(h,1)),l}_getImagePlaneGeoFisheye(t,e){const i=t.srtInverse;let n=5*t.scale,r=this._imagePlaneDepth*t.scale,s=e.mesh.vertices,o=s.length/3,a=new Float32Array(s.length);for(let t=0;t<o;++t){let e=3*t,o=s[e+0],c=s[e+1],h=s[e+2],l=Math.sqrt(o*o+c*c+h*h),u=Math.max(n,Math.min(l,r))/l,d=new fn(o*u,c*u,h*u);d.applyMatrix4(i),a[e+0]=d.x,a[e+1]=d.y,a[e+2]=d.z}let c=e.mesh.faces,h=new Uint16Array(c.length);for(let t=0;t<c.length;++t)h[t]=c[t];let l=new hs;return l.setAttribute("position",new Hr(a,3)),l.setIndex(new Hr(h,1)),l}_getFlatImageSphereGeo(t){const e=new zh(this._imageSphereRadius,20,40),i=t.rt.clone().invert();return e.applyMatrix4(i),e}_getRegularFlatImagePlaneGeo(t){let e=t.width,i=t.height,n=Math.max(e,i),r=e/2/n,s=i/2/n;return this._getFlatImagePlaneGeo(t,r,s)}_getFlatImagePlaneGeo(t,e,i){let n=[];return n.push(t.unprojectSfM([-e,-i],this._imagePlaneDepth)),n.push(t.unprojectSfM([e,-i],this._imagePlaneDepth)),n.push(t.unprojectSfM([e,i],this._imagePlaneDepth)),n.push(t.unprojectSfM([-e,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getRegularFlatImagePlaneGeoFisheye(t){let e=t.width,i=t.height,n=Math.max(e,i),r=e/2/n,s=i/2/n;return this._getFlatImagePlaneGeoFisheye(t,r,s)}_getFlatImagePlaneGeoFisheye(t,e,i){let n=[];return n.push(t.unprojectSfM([-e,-i],this._imagePlaneDepth)),n.push(t.unprojectSfM([e,-i],this._imagePlaneDepth)),n.push(t.unprojectSfM([e,i],this._imagePlaneDepth)),n.push(t.unprojectSfM([-e,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getFlatImagePlaneGeoFromBasic(t,e,i,n,r){let s=[];return s.push(t.unprojectBasic([e,n],this._imagePlaneDepth)),s.push(t.unprojectBasic([i,n],this._imagePlaneDepth)),s.push(t.unprojectBasic([i,r],this._imagePlaneDepth)),s.push(t.unprojectBasic([e,r],this._imagePlaneDepth)),this._createFlatGeometry(s)}_createFlatGeometry(t){let e=new Float32Array(12);for(let i=0;i<t.length;i++){let n=3*i;e[n+0]=t[i][0],e[n+1]=t[i][1],e[n+2]=t[i][2]}let i=new Uint16Array(6);i[0]=0,i[1]=1,i[2]=3,i[3]=1,i[4]=2,i[5]=3;let n=new hs;return n.setAttribute("position",new Hr(e,3)),n.setIndex(new Hr(i,1)),n}}class im{constructor(){this._planes={},this._planesOld={},this._planesPeriphery={},this._scene=new Qa,this._sceneOld=new Qa,this._scenePeriphery=new Qa}get planes(){return this._planes}get planesOld(){return this._planesOld}get planesPeriphery(){return this._planesPeriphery}get scene(){return this._scene}get sceneOld(){return this._sceneOld}get scenePeriphery(){return this._scenePeriphery}updateImagePlanes(t){this._dispose(this._planesOld,this.sceneOld);for(const t in this._planes){if(!this._planes.hasOwnProperty(t))continue;const e=this._planes[t];this._scene.remove(e),this._sceneOld.add(e)}for(const e in t)t.hasOwnProperty(e)&&this._scene.add(t[e]);this._planesOld=this._planes,this._planes=t}addImagePlanes(t){for(const e in t){if(!t.hasOwnProperty(e))continue;const i=t[e];this._scene.add(i),this._planes[e]=i}}addImagePlanesOld(t){for(const e in t){if(!t.hasOwnProperty(e))continue;const i=t[e];this._sceneOld.add(i),this._planesOld[e]=i}}setImagePlanes(t){this._clear(),this.addImagePlanes(t)}addPeripheryPlanes(t){for(const e in t){if(!t.hasOwnProperty(e))continue;const i=t[e];this._scenePeriphery.add(i),this._planesPeriphery[e]=i}}setPeripheryPlanes(t){this._clearPeriphery(),this.addPeripheryPlanes(t)}setImagePlanesOld(t){this._clearOld(),this.addImagePlanesOld(t)}clear(){this._clear(),this._clearOld()}_clear(){this._dispose(this._planes,this._scene),this._planes={}}_clearOld(){this._dispose(this._planesOld,this._sceneOld),this._planesOld={}}_clearPeriphery(){this._dispose(this._planesPeriphery,this._scenePeriphery),this._planesPeriphery={}}_dispose(t,e){for(const i in t){if(!t.hasOwnProperty(i))continue;const n=t[i];e.remove(n),n.geometry.dispose(),n.material.dispose();let r=n.material.uniforms.projectorTex.value;null!=r&&r.dispose()}}}class nm{constructor(){this._factory=new em,this._scene=new im,this._alpha=0,this._alphaOld=0,this._fadeOutSpeed=.05,this._currentKey=null,this._previousKey=null,this._providerDisposers={},this._frameId=0,this._needsRender=!1}get frameId(){return this._frameId}get needsRender(){return this._needsRender}indicateNeedsRender(){this._needsRender=!0}addPeripheryPlane(t,e){const i=this._factory.createMesh(t,e),n={};n[t.id]=i,this._scene.addPeripheryPlanes(n),this._needsRender=!0}clearPeripheryPlanes(){this._scene.setPeripheryPlanes({}),this._needsRender=!0}updateFrame(t){this._updateFrameId(t.id),this._needsRender=this._updateAlpha(t.state.alpha)||this._needsRender,this._needsRender=this._updateAlphaOld(t.state.alpha)||this._needsRender,this._needsRender=this._updateImagePlanes(t.state)||this._needsRender}setTextureProvider(t,e){if(t!==this._currentKey)return;let i=e.textureCreated$.subscribe((t=>{this._updateTexture(t)})),n=e.textureUpdated$.subscribe((t=>{this._needsRender=!0}));if(t in this._providerDisposers){(0,this._providerDisposers[t])(),delete this._providerDisposers[t]}this._providerDisposers[t]=()=>{i.unsubscribe(),n.unsubscribe(),e.dispose()}}updateTextureImage(t,e){this._needsRender=!0;const i=this._extend({},this._scene.planes,this._scene.planesOld,this._scene.planesPeriphery);for(const n in i){if(!i.hasOwnProperty(n))continue;if(n!==e.id)continue;let r=i[n].material.uniforms.projectorTex.value;r.image=t,r.needsUpdate=!0}}render(t,e){const i=this._scene.planes,n=this._scene.planesOld,r=this._scene.planesPeriphery,s=Object.keys(n).length?1:this._alpha,o=Object.keys(n).length?1:Math.floor(this._alpha);for(const t in i){if(!i.hasOwnProperty(t))continue;i[t].material.uniforms.opacity.value=s}for(const t in n){if(!n.hasOwnProperty(t))continue;n[t].material.uniforms.opacity.value=this._alphaOld}for(const t in r){if(!r.hasOwnProperty(t))continue;r[t].material.uniforms.opacity.value=o}e.render(this._scene.scenePeriphery,t),e.render(this._scene.scene,t),e.render(this._scene.sceneOld,t);for(const t in i){if(!i.hasOwnProperty(t))continue;i[t].material.uniforms.opacity.value=this._alpha}e.render(this._scene.scene,t)}clearNeedsRender(){this._needsRender=!1}dispose(){this._scene.clear()}_updateFrameId(t){this._frameId=t}_updateAlpha(t){return t!==this._alpha&&(this._alpha=t,!0)}_updateAlphaOld(t){return!(t<1||0===this._alphaOld)&&(this._alphaOld=Math.max(0,this._alphaOld-this._fadeOutSpeed),!0)}_updateImagePlanes(t){if(null==t.currentImage||t.currentImage.id===this._currentKey)return!1;let e=null!=t.previousImage?t.previousImage.id:null,i=t.currentImage.id;if(this._previousKey!==e&&this._previousKey!==i&&this._previousKey in this._providerDisposers){(0,this._providerDisposers[this._previousKey])(),delete this._providerDisposers[this._previousKey]}if(null!=e){if(e!==this._currentKey&&e!==this._previousKey){let i=this._factory.createMesh(t.previousImage,t.previousTransform);const n={};n[e]=i,this._scene.updateImagePlanes(n)}this._previousKey=e}this._currentKey=i;let n=this._factory.createMesh(t.currentImage,t.currentTransform);const r={};return r[i]=n,this._scene.updateImagePlanes(r),this._alphaOld=1,!0}_updateTexture(t){this._needsRender=!0;const e=this._scene.planes;for(const i in e){if(!e.hasOwnProperty(i))continue;let n=e[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=t}}_extend(t,...e){for(const i of e)for(const e in i)i.hasOwnProperty(e)&&(t[e]=i[e]);return t}}var rm;!function(t){t[t.Background=0]="Background",t[t.Opaque=1]="Opaque"}(rm||(rm={}));class sm{constructor(t){this._api=t,this._urls$=new Map}getImage$(t){let e;const i=new Promise(((t,i)=>{e=i}));return[b.create((n=>{this._api.data.getImageBuffer(t,i).then((t=>{e=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{window.URL.revokeObjectURL(i.src),n.next(i),n.complete()},i.onerror=()=>{e=null,window.URL.revokeObjectURL(i.src),n.error(new Error("Failed to load image tile"))};const r=new Blob([t]);i.src=window.URL.createObjectURL(r)}),(t=>{e=null,n.error(t)}))})),()=>{e&&e()}]}getURLs$(t,e){const i=this._inventId(t,e);if(this._urls$.has(i))return this._urls$.get(i);const n={imageId:t,z:e},r=this._api.getImageTiles$(n).pipe(rt((t=>t.node)),Me((()=>{this._urls$.delete(i)})),He(),E());return this._urls$.set(i,r),r}_inventId(t,e){return`${t}-${e}`}}class om{constructor(){this._tiles=new Map,this._urlLevels=new Set,this._urls=new Map}add(t,e){if(this._tiles.has(t))throw new Error(`Image tile already stored (${t})`);this._tiles.set(t,e)}addURLs(t,e){const i=this._urls;for(const t of e){const e=this.inventId(t);if(this._urls.has(e))throw new Error(`URL already stored (${e})`);i.set(e,t.url)}this._urlLevels.add(t)}dispose(){this._tiles.forEach((t=>window.URL.revokeObjectURL(t.src))),this._tiles.clear(),this._urls.clear(),this._urlLevels.clear()}get(t){return this._tiles.get(t)}getURL(t){return this._urls.get(t)}has(t){return this._tiles.has(t)}hasURL(t){return this._urls.has(t)}hasURLLevel(t){return this._urlLevels.has(t)}inventId(t){return`${t.z}-${t.x}-${t.y}`}}class am{constructor(){this._viewportCoords=new Wf}computeRegionOfInterest(t,e,i){const n=this._viewportBoundaryPoints(4),r=this._viewportPointsBoundingBox(n,t,i);this._clipBoundingBox(r);const s=2/e.width,o=2/e.height,a=[[-.5*s,.5*o],[.5*s,.5*o],[.5*s,-.5*o],[-.5*s,-.5*o]],c=this._viewportPointsBoundingBox(a,t,i),h=c.minX<c.maxX;return{bbox:r,pixelHeight:c.maxY-c.minY,pixelWidth:c.maxX-c.minX+(h?0:1)}}_viewportBoundaryPoints(t){const e=[],i=[[-1,1],[1,1],[1,-1],[-1,-1]],n=[[2,0],[0,-2],[-2,0],[0,2]];for(let r=0;r<4;++r){const s=i[r],o=n[r];for(let i=0;i<t;++i)e.push([s[0]+o[0]*i/t,s[1]+o[1]*i/t])}return e}_viewportPointsBoundingBox(t,e,i){const n=t.map((t=>this._viewportCoords.viewportToBasic(t[0],t[1],i,e.perspective)));return dd(i.cameraType)?this._boundingBoxSpherical(n):this._boundingBox(n)}_boundingBox(t){const e={maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY};for(let i=0;i<t.length;++i)e.minX=Math.min(e.minX,t[i][0]),e.maxX=Math.max(e.maxX,t[i][0]),e.minY=Math.min(e.minY,t[i][1]),e.maxY=Math.max(e.maxY,t[i][1]);return e}_boundingBoxSpherical(t){const e=[],i=[];for(let n=0;n<t.length;++n)e.push(t[n][0]),i.push(t[n][1]);e.sort(((t,e)=>this._sign(t-e))),i.sort(((t,e)=>this._sign(t-e)));const n=this._intervalSpherical(e);return{maxX:n[1],maxY:i[i.length-1],minX:n[0],minY:i[0]}}_intervalSpherical(t){let e=0,i=-1;for(let n=0;n<t.length-1;++n){const r=t[n+1]-t[n];r>e&&(e=r,i=n)}return t[0]+1-t[t.length-1]>e?[t[0],t[t.length-1]]:[t[i+1],t[i]]}_clipBoundingBox(t){t.minX=Math.max(0,Math.min(1,t.minX)),t.maxX=Math.max(0,Math.min(1,t.maxX)),t.minY=Math.max(0,Math.min(1,t.minY)),t.maxY=Math.max(0,Math.min(1,t.maxY))}_sign(t){return t>0?1:t<0?-1:0}}function cm(t,e,i){return Math.max(e,Math.min(i,t))}function hm(t){return 1024/lm(t)}function lm(t){return Math.pow(2,t.z-t.max)}function um(t){return Math.ceil(function(t){const e=Math.max(t.w,t.h);return Math.log(e)/Math.log(2)}(t))}function dm(t,e,i){const n=hm(i),r=e.w,s=e.h,o=Math.ceil(r/n)-1,a=Math.ceil(s/n)-1;return{x:cm(Math.floor(r*t[0]/n),0,o),y:cm(Math.floor(s*t[1]/n),0,a)}}function pm(t,e,i){const n=1024*(1/lm(i)),r=n*t.x,s=n*t.y,o=Math.min(n,e.w-r);return{h:Math.min(n,e.h-s),x:r,y:s,w:o}}function fm(t,e,i){return i*t<=e&&e<i*(t+1)}function mm(t,e){if(t.z===e.z)return t.x===e.x&&t.y===e.y;const i=t.z<e.z?t:e,n=t.z<e.z?e:t,r=1/lm({max:n.z,z:i.z}),s=fm(i.x,n.x,r),o=fm(i.y,n.y,r);return s&&o}function gm(t){return t.w>0&&t.h>0}class _m{constructor(t,e,i,n,r,s,o){const a={h:i,w:e};gm(a)||console.warn(`Original image size (${e}, ${i}) is invalid (${t}). Tiles will not be loaded.`),this._imageId=t,this._size=a,this._level={max:um(this._size),z:-1},this._holder=new Uf,this._updated$=new T,this._createdSubject$=new T,this._created$=this._createdSubject$.pipe(Ue(1),E()),this._holder.push(this._created$.subscribe((()=>{}))),this._hasSubject$=new T,this._has$=this._hasSubject$.pipe(ni(!1),Ue(1),E()),this._holder.push(this._has$.subscribe((()=>{}))),this._renderedLevel=new Set,this._rendered=new Map,this._subscriptions=new Map,this._urlSubscriptions=new Map,this._loader=r,this._store=s,this._background=n,this._renderer=o,this._aborts=[],this._render=null,this._disposed=!1}get disposed(){return this._disposed}get hasTexture$(){return this._has$}get id(){return this._imageId}get textureUpdated$(){return this._updated$}get textureCreated$(){return this._created$}abort(){this._subscriptions.forEach((t=>t.unsubscribe())),this._subscriptions.clear();for(const t of this._aborts)t();this._aborts=[]}dispose(){this._disposed?console.warn(`Texture already disposed (${this._imageId})`):(this._urlSubscriptions.forEach((t=>t.unsubscribe())),this._urlSubscriptions.clear(),this.abort(),null!=this._render&&(this._render.target.dispose(),this._render.target=null,this._render.camera=null,this._render=null),this._store.dispose(),this._holder.unsubscribe(),this._renderedLevel.clear(),this._background=null,this._renderer=null,this._disposed=!0)}setRegionOfInterest(t){if(!gm(this._size))return;const e=1/t.pixelWidth,i=function(t,e,i){return Math.max(e,Math.min(i,um(t)))}({h:1/t.pixelHeight,w:e},11,this._level.max);i!==this._level.z&&(this.abort(),this._level.z=i,this._renderedLevel.clear(),this._rendered.forEach(((t,e)=>{t.z===i&&this._renderedLevel.add(e)}))),null==this._render&&this._initRender();const n=function(t,e,i,n){const r=[];if(t.x>e.x){const s=hm(n),o=Math.ceil(i.w/s)-1;for(let e=t.x;e<=o;e++)r.push(e);for(let t=0;t<=e.x;t++)r.push(t)}else for(let i=t.x;i<=e.x;i++)r.push(i);const s=[];for(const i of r)for(let n=t.y;n<=e.y;n++)s.push({x:i,y:n});return s}(dm([t.bbox.minX,t.bbox.minY],this._size,this._level),dm([t.bbox.maxX,t.bbox.maxY],this._size,this._level),this._size,this._level);this._fetchTiles(i,n)}_fetchTile(t){const e=this._loader.getImage$(t.url),i=e[0],n=e[1];this._aborts.push(n);const r=this._store.inventId(t),s=i.subscribe((e=>{const i=pm(t,this._size,this._level);this._renderToTarget(i,e),this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),this._markRendered(t),this._store.add(r,e),this._updated$.next(!0)}),(t=>{this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),console.error(t)}));s.closed||this._subscriptions.set(r,s)}_fetchTiles(t,e){const i=(this._store.hasURLLevel(t)?G(void 0):this._loader.getURLs$(this._imageId,t).pipe(pi((e=>{this._store.hasURLLevel(t)||this._store.addURLs(t,e)})))).subscribe((()=>{if(t===this._level.z){for(const i of e){const e={x:i.x,y:i.y,z:t,url:null},n=this._store.inventId(e);if(!this._renderedLevel.has(n)&&!this._subscriptions.has(n))if(this._store.has(n)){const t=pm(i,this._size,this._level);this._renderToTarget(t,this._store.get(n)),this._markRendered(e),this._updated$.next(!0)}else e.url=this._store.getURL(n),this._fetchTile(e)}this._urlSubscriptions.delete(t)}}),(e=>{this._urlSubscriptions.delete(t),console.error(e)}));i.closed||this._urlSubscriptions.set(t,i)}_initRender(){const t=this._size.w/2,e=this._size.h/2,i=new Kl(-t,t,e,-e,-1,1);i.position.z=1;const n=this._renderer.getContext(),r=n.getParameter(n.MAX_TEXTURE_SIZE),s=Math.max(this._size.w,this._size.h),o=r>s?1:r/s,a=Math.floor(o*this._size.w),c=Math.floor(o*this._size.h),h=new dn(a,c,{depthBuffer:!1,format:ki,magFilter:Ai,minFilter:Ai,stencilBuffer:!1});this._render={camera:i,target:h};const l=pm({x:0,y:0},this._size,{max:this._level.max,z:0});this._renderToTarget(l,this._background),this._createdSubject$.next(h.texture),this._hasSubject$.next(!0)}_markRendered(t){const e=Array.from(this._rendered.entries()).filter((([e,i])=>i.z!==t.z));for(const[i,n]of e)mm(t,n)&&this._rendered.delete(i);const i=this._store.inventId(t);this._rendered.set(i,t),this._renderedLevel.add(i)}_removeFromArray(t,e){const i=e.indexOf(t);-1!==i&&e.splice(i,1)}_renderToTarget(t,e){const i=new hn(e);i.minFilter=Ai,i.needsUpdate=!0;const n=new qs(t.w,t.h),r=new Fr({map:i,side:0}),s=new Es(n,r);s.position.x=-this._size.w/2+t.x+t.w/2,s.position.y=this._size.h/2-t.y-t.h/2;const o=new Qa;o.add(s);const a=this._renderer.getRenderTarget();this._renderer.resetState(),this._renderer.setRenderTarget(this._render.target),this._renderer.render(o,this._render.camera),this._renderer.setRenderTarget(a),o.remove(s),n.dispose(),r.dispose(),i.dispose()}}var vm,ym,bm,xm,wm,Sm;!function(t){t[t.Custom=0]="Custom",t[t.Earth=1]="Earth",t[t.Traversing=2]="Traversing",t[t.Waiting=3]="Waiting",t[t.WaitingInteractively=4]="WaitingInteractively"}(vm||(vm={}));class Mm extends Vf{constructor(t,e,i){super(t,e,i),this._imageTileLoader=new sm(i.api),this._roiCalculator=new am,this._rendererOperation$=new T,this._rendererCreator$=new T,this._rendererDisposer$=new T,this._renderer$=this._rendererOperation$.pipe(Le(((t,e)=>e(t)),null),Nt((t=>null!=t)),ue(void 0,(t=>t.frameId))),this._rendererCreator$.pipe(rt((()=>t=>{if(null!=t)throw new Error("Multiple image plane states can not be created at the same time");return new nm}))).subscribe(this._rendererOperation$),this._rendererDisposer$.pipe(rt((()=>t=>(t.dispose(),null)))).subscribe(this._rendererOperation$)}_activate(){const t=this._subscriptions;t.push(this._renderer$.pipe(rt((t=>{const e={name:this._name,renderer:{frameId:t.frameId,needsRender:t.needsRender,render:t.render.bind(t),pass:rm.Background}};return t.clearNeedsRender(),e}))).subscribe(this._container.glRenderer.render$)),this._rendererCreator$.next(null),t.push(this._navigator.stateService.currentState$.pipe(rt((t=>e=>(e.updateFrame(t),e)))).subscribe(this._rendererOperation$));const e=this._container.configurationService.imageTiling$.pipe(ri((t=>t?this._navigator.stateService.currentState$:new T)),ue(void 0,(t=>t.state.currentImage.id)),bi(this._container.glRenderer.webGLRenderer$),rt((([t,e])=>{const i=t.state,n=i.currentImage,r=i.currentTransform;return new _m(n.id,r.basicWidth,r.basicHeight,n.image,this._imageTileLoader,new om,e)})),Ue(1),E());t.push(e.subscribe((()=>{}))),t.push(e.pipe(rt((t=>e=>(e.setTextureProvider(t.id,t),e)))).subscribe(this._rendererOperation$)),t.push(e.pipe(ze()).subscribe((t=>{t[0].abort()})));const i=this._container.configurationService.imageTiling$.pipe(ri((t=>t?gt(this._navigator.stateService.state$,this._navigator.stateService.inTranslation$):new T)),ri((([t,e])=>(t===vm.Traversing||t===vm.Waiting||t===vm.WaitingInteractively)&&!e?this._container.renderService.renderCameraFrame$:B())),rt((t=>({camera:t,height:t.size.height.valueOf(),lookat:t.camera.lookat.clone(),width:t.size.width.valueOf(),zoom:t.zoom.valueOf()}))),ze(),rt((([t,e])=>{const i=t.width===e.width&&t.height===e.height&&t.zoom===e.zoom&&t.lookat.equals(e.lookat);return{camera:e.camera,stalled:i}})),ue(((t,e)=>t.stalled===e.stalled)),Nt((t=>t.stalled)),bi(this._container.renderService.size$,this._navigator.stateService.currentTransform$));t.push(e.pipe(ri((t=>i.pipe(rt((([e,i,n])=>{const r=e.camera,s=(new Wf).viewportToBasic(0,0,n,r.perspective);if(!(s[0]<0||s[1]<0||s[0]>1||s[1]>1))return[this._roiCalculator.computeRegionOfInterest(r,i,n),t]})),Nt((t=>!!t))))),Nt((t=>!t[1].disposed))).subscribe((([t,e])=>{e.setRegionOfInterest(t)})));const n=e.pipe(ri((t=>t.hasTexture$)),ni(!1),Ue(1),E());t.push(n.subscribe((()=>{}))),t.push(this._navigator.panService.panImages$.pipe(Nt((t=>0===t.length)),rt((()=>t=>(t.clearPeripheryPlanes(),t)))).subscribe(this._rendererOperation$));const r=this._navigator.panService.panImages$.pipe(ri((t=>bt(t).pipe(Mt((([t,e])=>gt(this._navigator.graphService.cacheImage$(t.id).pipe(te((e=>(console.error(`Failed to cache periphery image (${t.id})`,e),B())))),G(e))))))),Ze());t.push(r.pipe(rt((([t,e])=>i=>(i.addPeripheryPlane(t,e),i)))).subscribe(this._rendererOperation$)),t.push(r.pipe(Mt((([t])=>t.cacheImage$().pipe(te((()=>B()))))),rt((t=>e=>(e.updateTextureImage(t.image,t),e)))).subscribe(this._rendererOperation$));const s=this._navigator.stateService.currentState$.pipe(rt((t=>t.state.alpha<1)),ue()),o=gt(this._container.mouseService.active$,this._container.touchService.active$,this._navigator.stateService.inMotion$,s).pipe(rt((([t,e,i,n])=>!(t||e||i||n))),Nt((t=>t)));t.push(this._navigator.stateService.state$.pipe(ri((t=>t===vm.Traversing?this._navigator.panService.panImages$:B())),ri((t=>o.pipe(bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.currentTransform$),Mt((([,e,i,n])=>G([e,i,n,t])))))),ri((([t,e,i,n])=>{const r=t.camera.lookat.clone().sub(t.camera.position),s=[(new ld).viewingDirection(e.rotation).angleTo(r),void 0],o=(new Wf).viewportToBasic(0,0,i,t.perspective);o[0]>=0&&o[0]<=1&&o[1]>=0&&o[1]<=1&&(s[0]=Number.NEGATIVE_INFINITY);for(const[t]of n){const e=(new ld).viewingDirection(t.rotation).angleTo(r);e<s[0]&&(s[0]=e,s[1]=t.id)}return s[1]?this._navigator.moveTo$(s[1]).pipe(te((()=>B()))):B()}))).subscribe())}_deactivate(){this._rendererDisposer$.next(null),this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Mm.componentName="image";class Tm{constructor(t,e,i){this._component=t,this._container=e,this._navigator=i,this._enabled=!1}get isEnabled(){return this._enabled}enable(){!this._enabled&&this._component.activated&&(this._enable(),this._enabled=!0,this._component.configure(this._getConfiguration(!0)))}disable(){this._enabled&&(this._disable(),this._enabled=!1,this._component.activated&&this._component.configure(this._getConfiguration(!1)))}}class Cm extends Tm{_enable(){const e=this._navigator.stateService.currentImage$.pipe(ri((t=>t.sequenceEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(bi(e)).subscribe((([e,i])=>{let n=null;switch(e.keyCode){case 38:n=t.NavigationDirection.Next;break;case 40:n=t.NavigationDirection.Prev;break;default:return}if(e.preventDefault(),e.altKey&&!e.shiftKey&&i.cached)for(const t of i.edges)if(t.data.direction===n)return void this._navigator.moveTo$(t.target).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(t){return{keySequenceNavigation:t}}}class Em extends Tm{constructor(t,e,i,n){super(t,e,i),this._spatial=n}_enable(){const e=this._navigator.stateService.currentImage$.pipe(ri((t=>t.spatialEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(bi(e,this._navigator.stateService.currentState$)).subscribe((([e,i,n])=>{let r=dd(n.state.currentImage.cameraType),s=null;switch(e.keyCode){case 37:s=e.shiftKey&&!r?t.NavigationDirection.TurnLeft:t.NavigationDirection.StepLeft;break;case 38:s=e.shiftKey&&!r?t.NavigationDirection.Spherical:t.NavigationDirection.StepForward;break;case 39:s=e.shiftKey&&!r?t.NavigationDirection.TurnRight:t.NavigationDirection.StepRight;break;case 40:s=e.shiftKey&&!r?t.NavigationDirection.TurnU:t.NavigationDirection.StepBackward;break;default:return}if(e.preventDefault(),!(e.altKey||!i.cached||e.shiftKey&&r))if(r){const e={};e[t.NavigationDirection.StepBackward]=Math.PI,e[t.NavigationDirection.StepForward]=0,e[t.NavigationDirection.StepLeft]=Math.PI/2,e[t.NavigationDirection.StepRight]=-Math.PI/2;const r=this._rotationFromCamera(n.state.camera).phi,o=this._spatial.wrapAngle(r+e[s]),a=Math.PI/4,c=i.edges.filter((e=>e.data.direction===t.NavigationDirection.Spherical||e.data.direction===s));let h=Number.MAX_VALUE,l=null;for(const t of c){const e=Math.abs(this._spatial.wrapAngle(t.data.worldMotionAzimuth-o));e<Math.min(h,a)&&(h=e,l=t.target)}if(null==l)return;this._moveTo(l)}else this._moveDir(s,i)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(t){return{keySpatialNavigation:t}}_moveDir(t,e){for(const i of e.edges)if(i.data.direction===t)return void this._moveTo(i.target)}_moveTo(t){this._navigator.moveTo$(t).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}_rotationFromCamera(t){let e=t.lookat.clone().sub(t.position),i=e.clone().dot(t.up),n=e.clone().sub(t.up.clone().multiplyScalar(i));return{phi:Math.atan2(n.y,n.x),theta:Math.PI/2-this._spatial.angleToPlane(e.toArray(),[0,0,1])}}}class Im extends Tm{constructor(t,e,i,n){super(t,e,i),this._viewportCoords=n}_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([t,e,i])=>{if(t.altKey||t.ctrlKey||t.metaKey)return;let n=0;switch(t.key){case"+":n=1;break;case"-":n=-1;break;default:return}t.preventDefault();const r=this._viewportCoords.unprojectFromViewport(0,0,e.perspective),s=i.projectBasic(r.toArray());this._navigator.stateService.zoomIn(n,s)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(t){return{keyZoom:t}}}class Am extends Tm{_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(bi(this._navigator.playService.playing$,this._navigator.playService.direction$,this._navigator.playService.speed$,this._navigator.stateService.currentImage$.pipe(ri((t=>t.sequenceEdges$))),this._navigator.stateService.state$.pipe(rt((t=>t===vm.Earth)),ue()))).subscribe((([e,i,n,r,s,o])=>{if(!(e.altKey||e.ctrlKey||e.metaKey)){switch(e.key){case"D":if(!e.shiftKey)return;const a=i?null:n===t.NavigationDirection.Next?t.NavigationDirection.Prev:n===t.NavigationDirection.Prev?t.NavigationDirection.Next:null;null!=a&&this._navigator.playService.setDirection(a);break;case" ":if(e.shiftKey)return;if(!o)if(i)this._navigator.playService.stop();else for(let t of s.edges)t.data.direction===n&&this._navigator.playService.play();break;case"<":this._navigator.playService.setSpeed(r-.05);break;case">":this._navigator.playService.setSpeed(r+.05);break;default:return}e.preventDefault()}}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(t){return{keyPlay:t}}}class Pm extends Vf{constructor(t,e,i){super(t,e,i),this._keyPlayHandler=new Am(this,e,i),this._keySequenceNavigationHandler=new Cm(this,e,i),this._keySpatialNavigationHandler=new Em(this,e,i,new ld),this._keyZoomHandler=new Im(this,e,i,new Wf)}get keyPlay(){return this._keyPlayHandler}get keySequenceNavigation(){return this._keySequenceNavigationHandler}get keySpatialNavigation(){return this._keySpatialNavigationHandler}get keyZoom(){return this._keyZoomHandler}_activate(){this._subscriptions.push(this._configuration$.subscribe((t=>{t.keyPlay?this._keyPlayHandler.enable():this._keyPlayHandler.disable(),t.keySequenceNavigation?this._keySequenceNavigationHandler.enable():this._keySequenceNavigationHandler.disable(),t.keySpatialNavigation?this._keySpatialNavigationHandler.enable():this._keySpatialNavigationHandler.disable(),t.keyZoom?this._keyZoomHandler.enable():this._keyZoomHandler.disable()})))}_deactivate(){this._subscriptions.unsubscribe(),this._keyPlayHandler.disable(),this._keySequenceNavigationHandler.disable(),this._keySpatialNavigationHandler.disable(),this._keyZoomHandler.disable()}_getDefaultConfiguration(){return{keyPlay:!0,keySequenceNavigation:!0,keySpatialNavigation:!0,keyZoom:!0}}}Pm.componentName="keyboard";class Rm{constructor(t,e){this._needsRender=!1,this._interactiveObjects=[],this._markers={},this._objectMarkers={},this._raycaster=e||new Bu,this._scene=t||new Qa}get markers(){return this._markers}get needsRender(){return this._needsRender}add(t,e){t.id in this._markers&&this._dispose(t.id),t.createGeometry(e),this._scene.add(t.geometry),this._markers[t.id]=t;for(let e of t.getInteractiveObjects())this._interactiveObjects.push(e),this._objectMarkers[e.uuid]=t.id;this._needsRender=!0}clear(){for(const t in this._markers)this._markers.hasOwnProperty&&this._dispose(t);this._needsRender=!0}get(t){return this._markers[t]}getAll(){return Object.keys(this._markers).map((t=>this._markers[t]))}has(t){return t in this._markers}intersectObjects([t,e],i){this._raycaster.setFromCamera(new rn(t,e),i);const n=this._raycaster.intersectObjects(this._interactiveObjects);for(const t of n)if(t.object.uuid in this._objectMarkers)return this._objectMarkers[t.object.uuid];return null}lerpAltitude(t,e,i){t in this._markers&&(this._markers[t].lerpAltitude(e,i),this._needsRender=!0)}remove(t){t in this._markers&&(this._dispose(t),this._needsRender=!0)}render(t,e){e.render(this._scene,t),this._needsRender=!1}update(t,e,i){if(!(t in this._markers))return;this._markers[t].updatePosition(e,i),this._needsRender=!0}_dispose(t){const e=this._markers[t];this._scene.remove(e.geometry);for(let i of e.getInteractiveObjects()){const e=this._interactiveObjects.indexOf(i);-1!==e?this._interactiveObjects.splice(e,1):console.warn(`Object does not exist (${i.id}) for ${t}`),delete this._objectMarkers[i.uuid]}e.disposeGeometry(),delete this._markers[t]}}class Lm extends Vf{constructor(t,e,i){super(t,e,i),this._graphCalculator=new td,this._markerScene=new Rm,this._markerSet=new yd,this._viewportCoords=new Wf,this._relativeGroundAltitude=-2}add(t){this._markerSet.add(t)}fire(t,e){super.fire(t,e)}get(t){return this._markerSet.get(t)}getAll(){return this._markerSet.getAll()}getMarkerIdAt(t){return new Promise(((e,i)=>{this._container.renderService.renderCamera$.pipe(Ee(),rt((e=>{const i=this._viewportCoords.canvasToViewport(t[0],t[1],this._container.container);return this._markerScene.intersectObjects(i,e.perspective)}))).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}has(t){return this._markerSet.has(t)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}remove(t){this._markerSet.remove(t)}removeAll(){this._markerSet.removeAll()}_activate(){const t=this._navigator.stateService.currentState$.pipe(rt((t=>t.state.camera.position.z+this._relativeGroundAltitude)),ue(((t,e)=>Math.abs(t-e)<.01)),Ue(1),E()),e=gt(t,this._navigator.stateService.reference$).pipe(Ee(),rt((()=>{})),Ue(1),E()),i=this._configuration$.pipe(rt((t=>({visibleBBoxSize:Math.max(1,Math.min(200,t.visibleBBoxSize))})))),n=this._navigator.stateService.currentImage$.pipe(rt((t=>t.lngLat)),Ue(1),E()),r=gt(i,n).pipe(rt((([t,e])=>this._graphCalculator.boundingBoxCorners(e,t.visibleBBoxSize/2))),Ue(1),E()),s=gt(At(G(this._markerSet),this._markerSet.changed$),r).pipe(rt((([t,e])=>t.search(e)))),o=this._subscriptions;o.push(e.pipe(ri((()=>s.pipe(bi(this._navigator.stateService.reference$,t))))).subscribe((([t,e,i])=>{const n=this._markerScene,r=n.markers,s=Object.assign({},r);for(const o of t)if(o.id in r)delete s[o.id];else{const t=Ju(o.lngLat.lng,o.lngLat.lat,e.alt+i,e.lng,e.lat,e.alt);n.add(o,t)}for(const t in s)s.hasOwnProperty(t)&&n.remove(t)}))),o.push(e.pipe(ri((()=>this._markerSet.updated$.pipe(bi(r,this._navigator.stateService.reference$,t))))).subscribe((([t,[e,i],n,r])=>{const s=this._markerScene;for(const o of t){const t=s.has(o.id),a=o.lngLat.lat>e.lat&&o.lngLat.lat<i.lat&&o.lngLat.lng>e.lng&&o.lngLat.lng<i.lng;if(a){const t=Ju(o.lngLat.lng,o.lngLat.lat,n.alt+r,n.lng,n.lat,n.alt);s.add(o,t)}else!a&&t&&s.remove(o.id)}}))),o.push(this._navigator.stateService.reference$.pipe(Je(1),bi(t)).subscribe((([t,e])=>{const i=this._markerScene;for(const n of i.getAll()){const r=Ju(n.lngLat.lng,n.lngLat.lat,t.alt+e,t.lng,t.lat,t.alt);i.update(n.id,r)}}))),o.push(t.pipe(Je(1),bi(this._navigator.stateService.reference$,n)).subscribe((([t,e,i])=>{const n=this._markerScene,r=Ju(i.lng,i.lat,e.alt+t,e.lng,e.lat,e.alt);for(const i of n.getAll()){const s=Ju(i.lngLat.lng,i.lngLat.lat,e.alt+t,e.lng,e.lat,e.alt),o=s[0]-r[0],a=s[1]-r[1],c=Math.sqrt(o*o+a*a);c>50||n.lerpAltitude(i.id,t,Math.min(1,Math.max(0,1.2-1.2*c/50)))}}))),o.push(this._navigator.stateService.currentState$.pipe(rt((t=>{const e=this._markerScene;return{name:this._name,renderer:{frameId:t.id,needsRender:e.needsRender,render:e.render.bind(e),pass:rm.Opaque}}}))).subscribe(this._container.glRenderer.render$));const a=gt(this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$).pipe(rt((([t,e])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(e,i),s=this._viewportCoords.canvasToViewport(n,r,i);return this._markerScene.intersectObjects(s,t.perspective)})),Ue(1),E()),c=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).pipe(rt((()=>!0))),h=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragEnd$).pipe(rt((()=>!1))),l=Ot(c,h).pipe(ni(!1));o.push(Ot(c.pipe(bi(a)),gt(h,G(null))).pipe(ni([!1,null]),ze()).subscribe((([t,e])=>{const i=e[0],n=i?"markerdragstart":"markerdragend",r=i?e[1]:t[1],s={marker:this._markerScene.get(r),target:this,type:n};this.fire(n,s)})));const u=Ot(this._container.mouseService.mouseDown$.pipe(rt((()=>!0))),this._container.mouseService.documentMouseUp$.pipe(rt((()=>!1)))).pipe(ni(!1));o.push(gt(this._container.mouseService.active$,a.pipe(ue()),u,l).pipe(rt((([t,e,i,n])=>!t&&null!=e&&i||n)),ue()).subscribe((t=>{t?(this._container.mouseService.claimMouse(this._name,1),this._container.mouseService.claimWheel(this._name,1)):(this._container.mouseService.unclaimMouse(this._name),this._container.mouseService.unclaimWheel(this._name))})));const d=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).pipe(bi(a,this._container.renderService.renderCamera$),rt((([t,e,i])=>{const n=this._markerScene.get(e),r=this._container.container,[s,o]=this._viewportCoords.projectToCanvas(n.geometry.position.toArray(),r,i.perspective),[a,c]=this._viewportCoords.canvasPosition(t,r);return[n,[a-s,c-o],i]})),Ue(1),E());o.push(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$).pipe(bi(d,this._navigator.stateService.reference$,i)).subscribe((([t,[e,i,n],r,s])=>{if(!this._markerScene.has(e.id))return;const o=this._container.container,[a,c]=this._viewportCoords.canvasPosition(t,o),h=a-i[0],l=c-i[1],[u,d]=this._viewportCoords.canvasToViewport(h,l,o),p=new fn(u,d,1).unproject(n.perspective).sub(n.perspective.position).normalize(),f=Math.min(this._relativeGroundAltitude/p.z,s.visibleBBoxSize/2-.1);if(f<0)return;const m=p.clone().multiplyScalar(f).add(n.perspective.position);m.z=n.perspective.position.z+this._relativeGroundAltitude;const[g,_]=Ku(m.x,m.y,m.z,r.lng,r.lat,r.alt);this._markerScene.update(e.id,m.toArray(),{lat:_,lng:g}),this._markerSet.update(e);const v="markerposition",y={marker:e,target:this,type:v};this.fire(v,y)})))}_deactivate(){this._subscriptions.unsubscribe(),this._markerScene.clear()}_getDefaultConfiguration(){return{visibleBBoxSize:100}}}function Om(t,e){return t.x<=Math.max(e.p1.x,e.p2.x)&&t.x>=Math.min(e.p1.x,e.p2.x)&&t.y>=Math.max(e.p1.y,e.p2.y)&&t.y>=Math.min(e.p1.y,e.p2.y)}function Nm(t,e){const i=t.p2.x-t.p1.x,n=t.p2.y-t.p1.y,r=e.p2.x-e.p1.x,s=e.p2.y-e.p1.y,o=i*s-n*r;return o*o<1e-10*(i*i+n*n)*(r*r+s*s)}function Dm(t,e,i){const n=(e.y-t.y)*(i.x-e.x)-(i.y-e.y)*(e.x-t.x);return(r=n)>0?1:r<0?-1:0;var r}function $m(t,e){if(Nm(t,e))return!1;const i=Dm(t.p1,t.p2,e.p1),n=Dm(t.p1,t.p2,e.p2),r=Dm(e.p1,e.p2,t.p1),s=Dm(e.p1,e.p2,t.p2);return i!==n&&r!==s||(!(0!==i||!Om(e.p1,t))||(!(0!==n||!Om(e.p2,t))||(!(0!==r||!Om(t.p1,e))||!(0!==s||!Om(t.p2,e)))))}function km(t,e){if(Nm(t,e))return;const i=t.p1.x,n=t.p2.x,r=t.p1.y,s=t.p2.y,o=e.p1.x,a=e.p2.x,c=e.p1.y,h=e.p2.y,l=(i-n)*(c-h)-(r-s)*(o-a);return{x:((i*s-r*n)*(o-a)-(i-n)*(o*h-c*a))/l,y:((i*s-r*n)*(c-h)-(r-s)*(o*h-c*a))/l}}function zm(t,e){return t>=-1&&t<=1&&e>=-1&&e<=1}function Fm(t,e){return t>=0&&t<=1&&e>=0&&e<=1}function Bm(t,e,i){const n=function(t){let e=[],i=[[0,0],[1,0],[1,1],[0,1]],n=[[1,0],[0,1],[-1,0],[0,-1]];for(let r=0;r<4;++r){let s=i[r],o=n[r];for(let i=0;i<t;++i)e.push([s[0]+o[0]*i/t,s[1]+o[1]*i/t])}return e}(100).map((n=>i.basicToViewportSafe(n[0],n[1],t,e))),r=[],s=[{x:-1,y:1},{x:1,y:1},{x:1,y:-1},{x:-1,y:-1}],o=[!1,!1,!1,!1];for(let t=0;t<n.length;t++){const e=n[t],i=n[(t+1)%n.length];if(null===e)continue;if(null===i){zm(e[0],e[1])&&r.push(e);continue}const[a,c]=e,[h,l]=i;if(zm(a,c))if(zm(h,l))r.push(e);else for(let t=0;t<4;t++){const i={p1:{x:a,y:c},p2:{x:h,y:l}},n={p1:s[t],p2:s[(t+1)%4]};if($m(i,n)){const s=km(i,n);r.push(e,[s.x,s.y]),o[t]=!0}}}const[a,c]=i.viewportToBasic(-1,1,t,e),[h,l]=i.viewportToBasic(1,1,t,e),[u,d]=i.viewportToBasic(1,-1,t,e),[p,f]=i.viewportToBasic(-1,-1,t,e);Fm(a,c)&&(o[3]=o[0]=!0),Fm(h,l)&&(o[0]=o[1]=!0),Fm(u,d)&&(o[1]=o[2]=!0),Fm(p,f)&&(o[2]=o[3]=!0);const m=[-1,-1,1,1];for(let t of r){const e=t[0],i=t[1];e>m[1]&&(m[1]=e),e<m[3]&&(m[3]=e),i>m[0]&&(m[0]=i),i<m[2]&&(m[2]=i)}const g=[1,1,-1,-1],_=[];for(let t=0;t<4;t++)o[t]?_.push(0):_.push(Math.abs(g[t]-m[t]));return _}Lm.componentName="marker";class jm extends Tm{constructor(t,e,i,n,r){super(t,e,i),this._spatial=r,this._viewportCoords=n}_enable(){const t=this._navigator.stateService.currentState$.pipe(rt((t=>t.state.alpha<1)),ue());this._bounceSubscription=gt(t,this._navigator.stateService.inTranslation$,this._container.mouseService.active$,this._container.touchService.active$).pipe(rt((t=>t[0]||t[1]||t[2]||t[3])),ue(),ri((t=>t?B():gt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$.pipe(Ee())))),bi(this._navigator.panService.panImages$)).subscribe((([[t,e],i])=>{if(!e.hasValidScale&&t.camera.focal<.1)return;if(0===t.perspective.aspect||t.perspective.aspect===Number.POSITIVE_INFINITY)return;const n=Bm(e,t.perspective,this._viewportCoords),r=this._viewportCoords.viewportToBasic(0,0,e,t.perspective);(r[0]<0||r[0]>1)&&i.length>0&&(n[0]=n[2]=0);for(const[,e]of i){const i=Bm(e,t.perspective,this._viewportCoords);for(let t=1;t<n.length;t+=2)i[t]<n[t]&&(n[t]=i[t])}if(Math.max(...n)<.01)return;const s=n[1]-n[3],o=n[0]-n[2],a=this._viewportCoords.unprojectFromViewport(0,0,t.perspective).sub(t.perspective.position),c=this._viewportCoords.unprojectFromViewport(s,0,t.perspective).sub(t.perspective.position),h=this._viewportCoords.unprojectFromViewport(0,o,t.perspective).sub(t.perspective.position);let l=(s>0?1:-1)*c.angleTo(a),u=(o>0?1:-1)*h.angleTo(a);const d=Math.PI/60;l=this._spatial.clamp(.1*l,-d,d),u=this._spatial.clamp(.1*u,-d,d),this._navigator.stateService.rotateUnbounded({phi:l,theta:u})}))}_disable(){this._bounceSubscription.unsubscribe()}_getConfiguration(){return{}}}class Hm{static filteredPairwiseMouseDrag$(t,e){return this._filteredPairwiseMouseDrag$(t,e,e.mouseDragStart$,e.mouseDrag$,e.mouseDragEnd$)}static filteredPairwiseMouseRightDrag$(t,e){return this._filteredPairwiseMouseDrag$(t,e,e.mouseRightDragStart$,e.mouseRightDrag$,e.mouseRightDragEnd$)}static _filteredPairwiseMouseDrag$(t,e,i,n,r){return e.filtered$(t,i).pipe(ri((i=>Ot(At(G(i),e.filtered$(t,n)),e.filtered$(t,r).pipe(rt((()=>null)))).pipe(li((t=>!!t)),ni(null)))),ze(),Nt((t=>null!=t[0]&&null!=t[1])))}}class Um extends Tm{constructor(t,e,i,n,r){super(t,e,i),this._spatial=r,this._viewportCoords=n}_enable(){let t=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragStart$).pipe(rt((()=>!0)),Ze()),e=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$).pipe(rt((()=>!1)),Ze());this._activeMouseSubscription=Ot(t,e).subscribe(this._container.mouseService.activate$);const i=Ot(t,e).pipe(ri((t=>t?this._container.mouseService.documentMouseMove$:B())));this._preventDefaultSubscription=Ot(i,this._container.touchService.touchMove$).subscribe((t=>{t.preventDefault()}));let n=this._container.touchService.singleTouchDragStart$.pipe(rt((()=>!0))),r=this._container.touchService.singleTouchDragEnd$.pipe(rt((()=>!1)));this._activeTouchSubscription=Ot(n,r).subscribe(this._container.touchService.activate$);const s=this._navigator.stateService.currentState$.pipe(rt((t=>dd(t.state.currentImage.cameraType)||t.state.imagesAhead<1)),ue(),ri((t=>{if(!t)return B();const e=Hm.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService),i=Ot(this._container.touchService.singleTouchDragStart$,this._container.touchService.singleTouchDrag$,this._container.touchService.singleTouchDragEnd$.pipe(rt((()=>null)))).pipe(rt((t=>null!=t&&t.touches.length>0?t.touches[0]:null)),ze(),Nt((t=>null!=t[0]&&null!=t[1])));return Ot(e,i)})),bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,this._navigator.panService.panImages$),rt((([t,e,i,n])=>{let r=t[0],s=t[1],o=s.clientX-r.clientX,a=s.clientY-r.clientY,c=this._container.container,[h,l]=this._viewportCoords.canvasPosition(s,c),u=this._viewportCoords.unprojectFromCanvas(h,l,c,e.perspective).sub(e.perspective.position),d=this._viewportCoords.unprojectFromCanvas(h-o,l,c,e.perspective).sub(e.perspective.position),p=this._viewportCoords.unprojectFromCanvas(h,l-a,c,e.perspective).sub(e.perspective.position),f=(o>0?1:-1)*d.angleTo(u),m=(a>0?-1:1)*p.angleTo(u);const g=Bm(i,e.perspective,this._viewportCoords);for(const[,t]of n){const i=Bm(t,e.perspective,this._viewportCoords);for(let t=0;t<g.length;t++)i[t]<g[t]&&(g[t]=i[t])}return g[0]>0&&m<0&&(m/=Math.max(1,200*g[0])),g[2]>0&&m>0&&(m/=Math.max(1,200*g[2])),g[1]>0&&f<0&&(f/=Math.max(1,200*g[1])),g[3]>0&&f>0&&(f/=Math.max(1,200*g[3])),{phi:f,theta:m}})),Ze());var o;this._rotateWithoutInertiaSubscription=s.subscribe((t=>{this._navigator.stateService.rotateWithoutInertia(t)})),this._rotateSubscription=s.pipe(Le(((t,e)=>(this._drainBuffer(t),t.push([Date.now(),e]),t)),[]),(o=Ot(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$),this._container.touchService.singleTouchDragEnd$),function(t){return t.lift(new We(o))}),rt((t=>{const e=this._drainBuffer(t.slice()),i={phi:0,theta:0};for(const t of e)i.phi+=t[1].phi,i.theta+=t[1].theta;const n=e.length;n>0&&(i.phi/=n,i.theta/=n);const r=Math.PI/18;return i.phi=this._spatial.clamp(i.phi,-r,r),i.theta=this._spatial.clamp(i.theta,-r,r),i}))).subscribe((t=>{this._navigator.stateService.rotate(t)}))}_disable(){this._activeMouseSubscription.unsubscribe(),this._activeTouchSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._rotateSubscription.unsubscribe(),this._rotateWithoutInertiaSubscription.unsubscribe(),this._activeMouseSubscription=null,this._activeTouchSubscription=null,this._preventDefaultSubscription=null,this._rotateSubscription=null}_getConfiguration(t){return{dragPan:t}}_drainBuffer(t){const e=Date.now();for(;t.length>0&&e-t[0][0]>50;)t.shift();return t}}class Vm extends Tm{constructor(t,e,i,n,r){super(t,e,i),this._spatial=r,this._viewportCoords=n,this._subscriptions=new Uf}_enable(){const t=this._navigator.stateService.state$.pipe(rt((t=>t===vm.Earth)),Ue(1),E()),e=this._subscriptions;e.push(t.pipe(ri((t=>t?this._container.mouseService.mouseWheel$:B()))).subscribe((t=>{t.preventDefault()}))),e.push(t.pipe(ri((t=>t?Hm.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(Nt((([t,e])=>!(t.ctrlKey&&e.ctrlKey)))):B())),bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),rt((([[t,e],i,n])=>{const r=[0,0,1],s=[0,0,-2],o=this._planeIntersection(e,r,s,i.perspective,this._container.container),a=this._planeIntersection(t,r,s,i.perspective,this._container.container);if(!o||!a)return null;return(new fn).subVectors(o,a).multiplyScalar(-1).toArray()})),Nt((t=>!!t))).subscribe((t=>{this._navigator.stateService.truck(t)}))),e.push(t.pipe(ri((t=>t?Hm.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(Nt((([t,e])=>t.ctrlKey&&e.ctrlKey))):B())),rt((([t,e])=>this._mousePairToRotation(t,e)))).subscribe((t=>{this._navigator.stateService.orbit(t)}))),e.push(t.pipe(ri((t=>t?Hm.filteredPairwiseMouseRightDrag$(this._component.name,this._container.mouseService).pipe(Nt((([t,e])=>!t.ctrlKey&&!e.ctrlKey))):B())),rt((([t,e])=>this._mousePairToRotation(t,e)))).subscribe((t=>{this._navigator.stateService.orbit(t)}))),e.push(t.pipe(ri((t=>t?this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$):B())),rt((t=>{let e=t.deltaY;1===t.deltaMode?e*=40:2===t.deltaMode&&(e*=800);return-e/this._viewportCoords.containerToCanvas(this._container.container)[1]}))).subscribe((t=>{this._navigator.stateService.dolly(t)})))}_disable(){this._subscriptions.unsubscribe()}_getConfiguration(){return{}}_eventToViewport(t,e){const i=this._viewportCoords.canvasPosition(t,e);return this._viewportCoords.canvasToViewport(i[0],i[1],e)}_mousePairToRotation(t,e){const[i,n]=this._eventToViewport(e,this._container.container),[r,s]=this._eventToViewport(t,this._container.container);return{phi:(r-i)*Math.PI,theta:(n-s)*Math.PI/2}}_planeIntersection(t,e,i,n,r){const[s,o]=this._viewportCoords.canvasPosition(t,r),a=this._viewportCoords.unprojectFromCanvas(s,o,r,n).sub(n.position).normalize();if(Math.abs(this._spatial.angleToPlane(a.toArray(),e))<Math.PI/90)return null;const c=n.position.clone(),h=(new fn).fromArray(e),l=(new fn).fromArray(i),u=(new fn).subVectors(l,c).dot(h)/a.clone().dot(h),d=(new fn).addVectors(c,a.multiplyScalar(u));return this._viewportCoords.worldToCamera(d.toArray(),n)[2]>0?null:d}}class Gm extends Tm{constructor(t,e,i,n){super(t,e,i),this._viewportCoords=n}_enable(){this._container.mouseService.claimWheel(this._component.name,0),this._preventDefaultSubscription=this._container.mouseService.mouseWheel$.subscribe((t=>{t.preventDefault()})),this._zoomSubscription=this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$).pipe(bi(this._navigator.stateService.currentState$,((t,e)=>[t,e])),Nt((t=>{let e=t[1].state;return dd(e.currentImage.cameraType)||e.imagesAhead<1})),rt((t=>t[0])),bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,((t,e,i)=>[t,e,i]))).subscribe((t=>{let e=t[0],i=t[1],n=t[2],r=this._container.container,[s,o]=this._viewportCoords.canvasPosition(e,r),a=this._viewportCoords.unprojectFromCanvas(s,o,r,i.perspective),c=n.projectBasic(a.toArray()),h=e.deltaY;1===e.deltaMode?h*=40:2===e.deltaMode&&(h*=800);let l=-3*h/this._viewportCoords.containerToCanvas(r)[1];this._navigator.stateService.zoomIn(l,c)}))}_disable(){this._container.mouseService.unclaimWheel(this._component.name),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(t){return{scrollZoom:t}}}class qm extends Tm{constructor(t,e,i,n){super(t,e,i),this._viewportCoords=n}_enable(){this._preventDefaultSubscription=this._container.touchService.pinch$.subscribe((t=>{t.originalEvent.preventDefault()}));let t=this._container.touchService.pinchStart$.pipe(rt((t=>!0))),e=this._container.touchService.pinchEnd$.pipe(rt((t=>!1)));this._activeSubscription=Ot(t,e).subscribe(this._container.touchService.activate$),this._zoomSubscription=this._container.touchService.pinch$.pipe(bi(this._navigator.stateService.currentState$),Nt((t=>{let e=t[1].state;return dd(e.currentImage.cameraType)||e.imagesAhead<1})),rt((t=>t[0])),bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([t,e,i])=>{let n=this._container.container,[r,s]=this._viewportCoords.canvasPosition(t,n),o=this._viewportCoords.unprojectFromCanvas(r,s,n,e.perspective),a=i.projectBasic(o.toArray());const[c,h]=this._viewportCoords.containerToCanvas(n);let l=3*t.distanceChange/Math.min(c,h);this._navigator.stateService.zoomIn(l,a)}))}_disable(){this._activeSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(t){return{touchZoom:t}}}class Wm extends Vf{constructor(t,e,i){super(t,e,i);const n=new ld,r=new Wf;this._bounceHandler=new jm(this,e,i,r,n),this._dragPanHandler=new Um(this,e,i,r,n),this._earthControlHandler=new Vm(this,e,i,r,n),this._scrollZoomHandler=new Gm(this,e,i,r),this._touchZoomHandler=new qm(this,e,i,r)}get dragPan(){return this._dragPanHandler}get earthControl(){return this._earthControlHandler}get scrollZoom(){return this._scrollZoomHandler}get touchZoom(){return this._touchZoomHandler}_activate(){this._bounceHandler.enable(),this._subscriptions.push(this._configuration$.subscribe((t=>{t.dragPan?this._dragPanHandler.enable():this._dragPanHandler.disable(),t.earthControl?this._earthControlHandler.enable():this._earthControlHandler.disable(),t.scrollZoom?this._scrollZoomHandler.enable():this._scrollZoomHandler.disable(),t.touchZoom?this._touchZoomHandler.enable():this._touchZoomHandler.disable()}))),this._container.mouseService.claimMouse(this._name,0)}_deactivate(){this._container.mouseService.unclaimMouse(this._name),this._subscriptions.unsubscribe(),this._bounceHandler.disable(),this._dragPanHandler.disable(),this._earthControlHandler.disable(),this._scrollZoomHandler.disable(),this._touchZoomHandler.disable()}_getDefaultConfiguration(){return{dragPan:!0,earthControl:!0,scrollZoom:!0,touchZoom:!0}}}Wm.componentName="pointer";class Xm{constructor(t){this._document=t||document}get document(){return this._document}createElement(t,e,i){const n=this._document.createElement(t);return e&&(n.className=e),i&&i.appendChild(n),n}}class Ym extends Vf{constructor(t,e,i,n){super(t,e,i),this._dom=n||new Xm,this._popups=[],this._added$=new T,this._popups$=new T}add(t){for(const e of t)-1===this._popups.indexOf(e)&&(this._popups.push(e),this._activated&&e.setParentContainer(this._popupContainer));this._added$.next(t),this._popups$.next(this._popups)}getAll(){return this._popups.slice()}remove(t){for(const e of t)this._remove(e);this._popups$.next(this._popups)}removeAll(){for(const t of this._popups.slice())this._remove(t);this._popups$.next(this._popups)}_activate(){this._popupContainer=this._dom.createElement("div","mapillary-popup-container",this._container.container);for(const t of this._popups)t.setParentContainer(this._popupContainer);const t=this._subscriptions;t.push(gt(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe((([t,e,i])=>{for(const n of this._popups)n.update(t,e,i)})));const e=this._popups$.pipe(ni(this._popups),ri((t=>bt(t).pipe(Mt((t=>t.changed$))))),rt((t=>[t])));t.push(Ot(this._added$,e).pipe(bi(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$)).subscribe((([t,e,i,n])=>{for(const r of t)r.update(e,i,n)})))}_deactivate(){this._subscriptions.unsubscribe();for(const t of this._popups)t.remove();this._container.container.removeChild(this._popupContainer),delete this._popupContainer}_getDefaultConfiguration(){return{}}_remove(t){const e=this._popups.indexOf(t);if(-1===e)return;const i=this._popups.splice(e,1)[0];this._activated&&i.remove()}}Ym.componentName="popup",function(t){t[t.Sequence=0]="Sequence",t[t.Spatial=1]="Spatial"}(ym||(ym={})),function(t){t[t.Default=0]="Default",t[t.Playback=1]="Playback",t[t.Timeline=2]="Timeline"}(bm||(bm={}));class Zm{constructor(t){this._container=t,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._stepperDefaultWidth=108,this._controlsDefaultWidth=88,this._defaultHeight=30,this._expandControls=!1,this._mode=bm.Default,this._speed=.5,this._changingSpeed=!1,this._index=null,this._changingPosition=!1,this._mouseEnterDirection$=new T,this._mouseLeaveDirection$=new T,this._notifyChanged$=new T,this._notifyChangingPositionChanged$=new T,this._notifySpeedChanged$=new T,this._notifyIndexChanged$=new T}get changed$(){return this._notifyChanged$}get changingPositionChanged$(){return this._notifyChangingPositionChanged$}get speed$(){return this._notifySpeedChanged$}get index$(){return this._notifyIndexChanged$}get mouseEnterDirection$(){return this._mouseEnterDirection$}get mouseLeaveDirection$(){return this._mouseLeaveDirection$}activate(){this._changingSubscription||(this._changingSubscription=Ot(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(Nt((t=>0===t.touches.length)))).subscribe((()=>{this._changingSpeed&&(this._changingSpeed=!1),this._changingPosition&&this._setChangingPosition(!1)})))}deactivate(){this._changingSubscription&&(this._changingSpeed=!1,this._changingPosition=!1,this._expandControls=!1,this._mode=bm.Default,this._changingSubscription.unsubscribe(),this._changingSubscription=null)}render(t,e,i,n,r,s,o,a,c){if(!1===e.visible)return jf.h("div.mapillary-sequence-container",{},[]);const h=this._createStepper(t,e,o,i,a,c),l=this._createSequenceControls(i),u=this._createPlaybackControls(i,n,a,e),d=this._createTimelineControls(i,r,s);return jf.h("div.mapillary-sequence-container",[h,l,u,d])}getContainerWidth(t,e){let i=e.minWidth,n=e.maxWidth;n<i&&(n=i);let r=(t.width-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),s=(t.height-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight);return i+Math.max(0,Math.min(1,Math.min(r,s)))*(n-i)}_createPositionInput(t,e){this._index=t;const i=t=>{this._index=Number(t.target.value),this._notifyIndexChanged$.next(this._index)},n=this._container.domContainer.getBoundingClientRect(),r=t=>{t.stopPropagation(),this._setChangingPosition(!0)},s=t=>{!0===this._changingPosition&&t.stopPropagation()},o={max:null!=e?e:1,min:0,onchange:i,oninput:i,onkeydown:t=>{"ArrowDown"!==t.key&&"ArrowLeft"!==t.key&&"ArrowRight"!==t.key&&"ArrowUp"!==t.key||t.preventDefault()},onpointerdown:r,onpointermove:s,ontouchmove:s,ontouchstart:r,style:{width:`${Math.max(276,Math.min(410,5+.8*n.width))-65}px`},type:"range",value:null!=t?t:0},a=null==t||null==e||e<=1;a&&(o.disabled="true");const c=jf.h("input.mapillary-sequence-position",o,[]),h=a?".mapillary-sequence-position-container-inactive":".mapillary-sequence-position-container";return jf.h("div"+h,[c])}_createSpeedInput(t){this._speed=t;const e=t=>{this._speed=Number(t.target.value)/1e3,this._notifySpeedChanged$.next(this._speed)},i=this._container.domContainer.getBoundingClientRect(),n=Math.max(276,Math.min(410,5+.8*i.width))-160,r=t=>{this._changingSpeed=!0,t.stopPropagation()},s=t=>{!0===this._changingSpeed&&t.stopPropagation()},o=jf.h("input.mapillary-sequence-speed",{max:1e3,min:0,onchange:e,oninput:e,onkeydown:t=>{"ArrowDown"!==t.key&&"ArrowLeft"!==t.key&&"ArrowRight"!==t.key&&"ArrowUp"!==t.key||t.preventDefault()},onpointerdown:r,onpointermove:s,ontouchmove:s,ontouchstart:r,style:{width:`${n}px`},type:"range",value:1e3*t},[]);return jf.h("div.mapillary-sequence-speed-container",[o])}_createPlaybackControls(e,i,n,r){if(this._mode!==bm.Playback)return jf.h("div.mapillary-sequence-playback",[]);const s=jf.h("div.mapillary-sequence-switch-icon.mapillary-sequence-icon-visible",[]),o=r.direction===t.NavigationDirection.Next?t.NavigationDirection.Prev:t.NavigationDirection.Next,a=r.playing,c={onclick:()=>{a||n.configure({direction:o})}},h=r.playing?".mapillary-sequence-switch-button-inactive":".mapillary-sequence-switch-button",l=jf.h("div"+h,c,[s]),u=jf.h("div.mapillary-sequence-slow-icon.mapillary-sequence-icon-visible",[]),d=jf.h("div.mapillary-sequence-slow-container",[u]),p=jf.h("div.mapillary-sequence-fast-icon.mapillary-sequence-icon-visible",[]),f=jf.h("div.mapillary-sequence-fast-container",[p]),m=jf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),g={onclick:()=>{this._mode=bm.Default,this._notifyChanged$.next(this)}},_=jf.h("div.mapillary-sequence-close-button",g,[m]),v=[l,d,this._createSpeedInput(i),f,_],y={style:{top:`${Math.round(e/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return jf.h("div.mapillary-sequence-playback",y,v)}_createPlayingButton(e,i,n,r,s){let o=r.direction===t.NavigationDirection.Next&&null!=e||r.direction===t.NavigationDirection.Prev&&null!=i;o=o&&n;let a={onclick:r.playing?()=>{s.stop()}:o?()=>{s.play()}:null},c={};r.direction===t.NavigationDirection.Prev&&(c.style={transform:"rotate(180deg) translate(50%, 50%)"});let h=jf.h("div.mapillary-sequence-icon",c,[]),l=r.playing?"mapillary-sequence-stop":o?"mapillary-sequence-play":"mapillary-sequence-play-inactive";return jf.h("div."+l,a,[h])}_createSequenceControls(t){const e=Math.round(8/this._stepperDefaultWidth*t),i={onclick:()=>{this._expandControls=!this._expandControls,this._mode=bm.Default,this._notifyChanged$.next(this)},style:{"border-bottom-right-radius":`${e}px`,"border-top-right-radius":`${e}px`}},n=jf.h("div.mapillary-sequence-expander-bar",[]),r=jf.h("div.mapillary-sequence-expander-button",i,[n]),s=this._mode===bm.Playback?".mapillary-sequence-fast-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-fast-icon",o=jf.h("div"+s,[]),a={onclick:()=>{this._mode=this._mode===bm.Playback?bm.Default:bm.Playback,this._notifyChanged$.next(this)}},c=jf.h("div.mapillary-sequence-playback-button",a,[o]),h=this._mode===bm.Timeline?".mapillary-sequence-timeline-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-timeline-icon",l=jf.h("div"+h,[]),u={onclick:()=>{this._mode=this._mode===bm.Timeline?bm.Default:bm.Timeline,this._notifyChanged$.next(this)}},d=jf.h("div.mapillary-sequence-timeline-button",u,[l]),p={style:{height:this._defaultHeight/this._stepperDefaultWidth*t+"px",transform:`translate(${t/2+2}px, 0)`,width:this._controlsDefaultWidth/this._stepperDefaultWidth*t+"px"}},f=".mapillary-sequence-controls"+(this._expandControls?".mapillary-sequence-controls-expanded":"");return jf.h("div"+f,p,[c,d,r])}_createSequenceArrows(e,i,n,r,s){let o={onclick:null!=e?()=>{s.moveDir$(t.NavigationDirection.Next).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(t.NavigationDirection.Next)},onpointerleave:()=>{this._mouseLeaveDirection$.next(t.NavigationDirection.Next)}};const a=Math.round(8/this._stepperDefaultWidth*n);let c={onclick:null!=i?()=>{s.moveDir$(t.NavigationDirection.Prev).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(t.NavigationDirection.Prev)},onpointerleave:()=>{this._mouseLeaveDirection$.next(t.NavigationDirection.Prev)},style:{"border-bottom-left-radius":`${a}px`,"border-top-left-radius":`${a}px`}},h=this._getStepClassName(t.NavigationDirection.Next,e,r.highlightId),l=this._getStepClassName(t.NavigationDirection.Prev,i,r.highlightId),u=jf.h("div.mapillary-sequence-icon",[]),d=jf.h("div.mapillary-sequence-icon",[]);return[jf.h("div."+l,c,[d]),jf.h("div."+h,o,[u])]}_createStepper(e,i,n,r,s,o){let a=null,c=null;for(let i of e.edges)i.data.direction===t.NavigationDirection.Next&&(a=i.target),i.data.direction===t.NavigationDirection.Prev&&(c=i.target);const h=this._createPlayingButton(a,c,n,i,s),l=this._createSequenceArrows(a,c,r,i,o);l.splice(1,0,h);const u={oncontextmenu:t=>{t.preventDefault()},style:{height:this._defaultHeight/this._stepperDefaultWidth*r+"px",width:r+"px"}};return jf.h("div.mapillary-sequence-stepper",u,l)}_createTimelineControls(t,e,i){if(this._mode!==bm.Timeline)return jf.h("div.mapillary-sequence-timeline",[]);const n=this._createPositionInput(e,i),r=jf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),s={onclick:()=>{this._mode=bm.Default,this._notifyChanged$.next(this)}},o=jf.h("div.mapillary-sequence-close-button",s,[r]),a={style:{top:`${Math.round(t/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return jf.h("div.mapillary-sequence-timeline",a,[n,o])}_getStepClassName(e,i,n){let r=e===t.NavigationDirection.Next?"mapillary-sequence-step-next":"mapillary-sequence-step-prev";return null==i?r+="-inactive":n===i&&(r+="-highlight"),r}_setChangingPosition(t){this._changingPosition=t,this._notifyChangingPositionChanged$.next(t)}}class Jm extends Vf{constructor(t,e,i,n,r){super(t,e,i),this._sequenceDOMRenderer=n||new Zm(e),this._scheduler=r,this._containerWidth$=new T,this._hoveredIdSubject$=new T,this._hoveredId$=this._hoveredIdSubject$.pipe(Ze()),this._navigator.playService.playing$.pipe(Je(1),bi(this._configuration$)).subscribe((([t,e])=>{const i="playing",n={playing:t,target:this,type:i};this.fire(i,n),t!==e.playing&&(t?this.play():this.stop())})),this._navigator.playService.direction$.pipe(Je(1),bi(this._configuration$)).subscribe((([t,e])=>{t!==e.direction&&this.configure({direction:t})}))}fire(t,e){super.fire(t,e)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}play(){this.configure({playing:!0})}stop(){this.configure({playing:!1})}_activate(){this._sequenceDOMRenderer.activate();const t=this._navigator.stateService.currentImage$.pipe(ri((t=>t.sequenceEdges$)),Ue(1),E()),e=this._navigator.stateService.currentImage$.pipe(ue(void 0,(t=>t.sequenceId)),ri((t=>At(G(null),this._navigator.graphService.cacheSequence$(t.sequenceId).pipe(Ve(3),te((t=>(console.error("Failed to cache sequence",t),G(null)))))))),ni(null),Ue(1),E()),i=this._subscriptions;i.push(e.subscribe());const n=this._sequenceDOMRenderer.index$.pipe(bi(e),rt((([t,e])=>null!=e?e.imageIds[t]:null)),Nt((t=>!!t)),ue(),He(),E());i.push(Ot(n.pipe(re(100,this._scheduler)),n.pipe(Wt(400,this._scheduler))).pipe(ue(),ri((t=>this._navigator.moveTo$(t).pipe(te((()=>B())))))).subscribe()),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(Nt((t=>t))).subscribe((()=>{this._navigator.graphService.setGraphMode(ym.Sequence)}))),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(Nt((t=>!t))).subscribe((()=>{this._navigator.graphService.setGraphMode(ym.Spatial)}))),this._navigator.graphService.graphMode$.pipe(ri((t=>t===ym.Spatial?this._navigator.stateService.currentImage$.pipe(ve(2)):B())),Nt((t=>!t.spatialEdges.cached)),ri((t=>this._navigator.graphService.cacheImage$(t.id).pipe(te((()=>B())))))).subscribe(),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(Nt((t=>t))).subscribe((()=>{this._navigator.playService.stop()}))),i.push(gt(this._navigator.graphService.graphMode$,this._sequenceDOMRenderer.changingPositionChanged$.pipe(ni(!1),ue())).pipe(bi(this._navigator.stateService.currentImage$),ri((([[t,e],i])=>e&&t===ym.Sequence?this._navigator.graphService.cacheSequenceImages$(i.sequenceId,i.id).pipe(Ve(3),te((t=>(console.error("Failed to cache sequence images.",t),B())))):B()))).subscribe());const r=e.pipe(ri((t=>{if(!t)return G({index:null,max:null});let e=!0;return this._sequenceDOMRenderer.changingPositionChanged$.pipe(ni(!1),ue(),ri((t=>{const i=!t&&e?0:1;return e=!1,t?n:this._navigator.stateService.currentImage$.pipe(rt((t=>t.id)),ue(),Je(i))})),rt((e=>{const i=t.imageIds.indexOf(e);return-1===i?{index:null,max:null}:{index:i,max:t.imageIds.length-1}})))}))),s=this._navigator.stateService.state$.pipe(rt((t=>t===vm.Earth)),ue());i.push(gt(t,this._configuration$,this._containerWidth$,this._sequenceDOMRenderer.changed$.pipe(ni(this._sequenceDOMRenderer)),this._navigator.playService.speed$,r,s).pipe(rt((([t,e,i,,n,r,s])=>{const o=this._sequenceDOMRenderer.render(t,e,i,n,r.index,r.max,!s,this,this._navigator);return{name:this._name,vNode:o}}))).subscribe(this._container.domRenderer.render$)),i.push(this._sequenceDOMRenderer.speed$.subscribe((t=>{this._navigator.playService.setSpeed(t)}))),i.push(this._configuration$.pipe(rt((t=>t.direction)),ue()).subscribe((t=>{this._navigator.playService.setDirection(t)}))),i.push(gt(this._container.renderService.size$,this._configuration$.pipe(ue(((t,e)=>t[0]===e[0]&&t[1]===e[1]),(t=>[t.minWidth,t.maxWidth])))).pipe(rt((([t,e])=>this._sequenceDOMRenderer.getContainerWidth(t,e)))).subscribe(this._containerWidth$)),i.push(this._configuration$.pipe(rt((t=>t.playing)),ue()).subscribe((t=>{t?this._navigator.playService.play():this._navigator.playService.stop()}))),i.push(this._sequenceDOMRenderer.mouseEnterDirection$.pipe(ri((e=>At(t.pipe(rt((t=>{for(let i of t.edges)if(i.data.direction===e)return i.target;return null})),ai(this._sequenceDOMRenderer.mouseLeaveDirection$)),G(null)))),ue()).subscribe(this._hoveredIdSubject$)),i.push(this._hoveredId$.subscribe((t=>{const e="hover",i={id:t,target:this,type:e};this.fire(e,i)})))}_deactivate(){this._subscriptions.unsubscribe(),this._sequenceDOMRenderer.deactivate()}_getDefaultConfiguration(){return{direction:t.NavigationDirection.Next,maxWidth:108,minWidth:70,playing:!1,visible:!0}}}Jm.componentName="sequence",t.SliderConfigurationMode=void 0,(xm=t.SliderConfigurationMode||(t.SliderConfigurationMode={}))[xm.Motion=0]="Motion",xm[xm.Stationary=1]="Stationary";class Km{constructor(){this._factory=new em,this._scene=new im,this._spatial=new ld,this._currentKey=null,this._previousKey=null,this._disabled=!1,this._curtain=1,this._frameId=0,this._needsRender=!1,this._mode=null,this._currentProviderDisposers={},this._previousProviderDisposers={}}get disabled(){return this._disabled}get frameId(){return this._frameId}get needsRender(){return this._needsRender}setTextureProvider(t,e){this._setTextureProvider(t,this._currentKey,e,this._currentProviderDisposers,this._updateTexture.bind(this))}setTextureProviderPrev(t,e){this._setTextureProvider(t,this._previousKey,e,this._previousProviderDisposers,this._updateTexturePrev.bind(this))}update(t,e){this._updateFrameId(t.id),this._updateImagePlanes(t.state,e)}updateCurtain(t){this._curtain!==t&&(this._curtain=t,this._updateCurtain(),this._needsRender=!0)}updateTexture(t,e){const i=e.id===this._currentKey?this._scene.planes:e.id===this._previousKey?this._scene.planesOld:{};if(0!==Object.keys(i).length){this._needsRender=!0;for(const e in i){if(!i.hasOwnProperty(e))continue;let n=i[e].material.uniforms.projectorTex.value;n.image=t,n.needsUpdate=!0}}}updateTextureImage(t,e){if(this._currentKey!==e.id)return;this._needsRender=!0;const i=this._scene.planes;for(const e in i){if(!i.hasOwnProperty(e))continue;let n=i[e].material.uniforms.projectorTex.value;n.image=t,n.needsUpdate=!0}}render(t,e){this.disabled||e.render(this._scene.sceneOld,t),e.render(this._scene.scene,t),this._needsRender=!1}dispose(){this._scene.clear();for(const t in this._currentProviderDisposers)this._currentProviderDisposers.hasOwnProperty(t)&&this._currentProviderDisposers[t]();for(const t in this._previousProviderDisposers)this._previousProviderDisposers.hasOwnProperty(t)&&this._previousProviderDisposers[t]();this._currentProviderDisposers={},this._previousProviderDisposers={}}_getBasicCorners(t,e){let i,n;return t>e?(i=.5,n=.5*t/e):(i=.5*e/t,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_setDisabled(t){this._disabled=null==t.currentImage||null==t.previousImage||dd(t.currentImage.cameraType)&&!dd(t.previousImage.cameraType)}_setTextureProvider(t,e,i,n,r){if(t!==e)return;let s=i.textureCreated$.subscribe(r),o=i.textureUpdated$.subscribe((t=>{this._needsRender=!0}));if(t in n){(0,n[t])(),delete n[t]}n[t]=()=>{s.unsubscribe(),o.unsubscribe(),i.dispose()}}_updateCurtain(){const t=this._scene.planes;for(const e in t){if(!t.hasOwnProperty(e))continue;let i=t[e].material;i.uniforms.curtain&&(i.uniforms.curtain.value=this._curtain)}}_updateFrameId(t){this._frameId=t}_updateImagePlanes(e,i){const n=null!=e.currentImage&&this._currentKey!==e.currentImage.id,r=null!=e.previousImage&&this._previousKey!==e.previousImage.id,s=this._mode!==i;if(!(n||r||s))return;this._setDisabled(e),this._needsRender=!0,this._mode=i;const o=e.motionless||i===t.SliderConfigurationMode.Stationary||dd(e.currentImage.cameraType);if((this.disabled||r)&&this._previousKey in this._previousProviderDisposers&&(this._previousProviderDisposers[this._previousKey](),delete this._previousProviderDisposers[this._previousKey]),this.disabled)this._scene.setImagePlanesOld({});else if(r||s){const t=e.previousImage;this._previousKey=t.id;const i=e.currentTransform.rt.elements;let n=[i[12],i[13],i[14]];const r=e.currentTransform.basicAspect,s=e.previousTransform.basicAspect,a=r>s?[1,s/r]:[r/s,1];let c=e.currentImage.rotation,h=e.currentImage.width,l=e.currentImage.height;dd(t.cameraType)&&(c=e.previousImage.rotation,n=this._spatial.rotate(this._spatial.opticalCenter(e.currentImage.rotation,n).toArray(),c).multiplyScalar(-1).toArray(),h=e.previousImage.width,l=e.previousImage.height);const u=new Hd(e.currentImage.exifOrientation,h,l,e.currentImage.scale,c,n,t.image,a,e.currentImage.cameraParameters,e.currentImage.cameraType);let d;if(dd(t.cameraType))d=this._factory.createMesh(t,o||dd(e.currentImage.cameraType)?u:e.previousTransform);else if(o){const[[t,i],[n,o]]=this._getBasicCorners(r,s);d=this._factory.createFlatMesh(e.previousImage,u,t,n,i,o)}else d=this._factory.createMesh(e.previousImage,e.previousTransform);const p={};p[t.id]=d,this._scene.setImagePlanesOld(p)}if(n||s){this._currentKey in this._currentProviderDisposers&&(this._currentProviderDisposers[this._currentKey](),delete this._currentProviderDisposers[this._currentKey]),this._currentKey=e.currentImage.id;const t={};dd(e.currentImage.cameraType)?t[e.currentImage.id]=this._factory.createCurtainMesh(e.currentImage,e.currentTransform):t[e.currentImage.id]=o?this._factory.createDistortedCurtainMesh(e.currentImage,e.currentTransform):this._factory.createCurtainMesh(e.currentImage,e.currentTransform),this._scene.setImagePlanes(t),this._updateCurtain()}}_updateTexture(t){this._needsRender=!0;const e=this._scene.planes;for(const i in e){if(!e.hasOwnProperty(i))continue;let n=e[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=t}}_updateTexturePrev(t){this._needsRender=!0;const e=this._scene.planesOld;for(const i in e){if(!e.hasOwnProperty(i))continue;let n=e[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=t}}}class Qm{constructor(t){this._container=t,this._interacting=!1,this._notifyModeChanged$=new T,this._notifyPositionChanged$=new T,this._stopInteractionSubscription=null}get mode$(){return this._notifyModeChanged$}get position$(){return this._notifyPositionChanged$}activate(){this._stopInteractionSubscription||(this._stopInteractionSubscription=Ot(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(Nt((t=>0===t.touches.length)))).subscribe((t=>{this._interacting&&(this._interacting=!1)})))}deactivate(){this._stopInteractionSubscription&&(this._interacting=!1,this._stopInteractionSubscription.unsubscribe(),this._stopInteractionSubscription=null)}render(t,e,i,n,r){const s=[];if(r){s.push(jf.h("div.mapillary-slider-border",[]));const r=!(i||n);r&&(s.push(this._createModeButton(e)),s.push(this._createModeButton2d(e))),s.push(this._createPositionInput(t,r))}const o=this._container.domContainer.getBoundingClientRect(),a=Math.max(215,Math.min(400,o.width-100));return jf.h("div.mapillary-slider-container",{style:{width:`${a}px`}},s)}_createModeButton(e){const i={onclick:()=>{e!==t.SliderConfigurationMode.Motion&&this._notifyModeChanged$.next(t.SliderConfigurationMode.Motion)}},n=e===t.SliderConfigurationMode.Stationary?"mapillary-slider-mode-button-inactive":"mapillary-slider-mode-button";return jf.h("div."+n,i,[jf.h("div.mapillary-slider-mode-icon",[])])}_createModeButton2d(e){const i={onclick:()=>{e!==t.SliderConfigurationMode.Stationary&&this._notifyModeChanged$.next(t.SliderConfigurationMode.Stationary)}},n=e===t.SliderConfigurationMode.Motion?"mapillary-slider-mode-button-2d-inactive":"mapillary-slider-mode-button-2d";return jf.h("div."+n,i,[jf.h("div.mapillary-slider-mode-icon-2d",[])])}_createPositionInput(t,e){const i=t=>{this._notifyPositionChanged$.next(Number(t.target.value)/1e3)},n=t=>{this._interacting=!0,t.stopPropagation()},r=t=>{this._interacting&&t.stopPropagation()},s=this._container.domContainer.getBoundingClientRect(),o=Math.max(215,Math.min(400,s.width-105))-84+(e?0:52),a=jf.h("input.mapillary-slider-position",{max:1e3,min:0,onchange:i,oninput:i,onkeydown:t=>{"ArrowDown"!==t.key&&"ArrowLeft"!==t.key&&"ArrowRight"!==t.key&&"ArrowUp"!==t.key||t.preventDefault()},onpointerdown:n,onpointermove:r,ontouchmove:r,ontouchstart:n,style:{width:`${o}px`},type:"range",value:1e3*t},[]);return jf.h("div.mapillary-slider-position-container",[a])}}class tg extends Vf{constructor(t,e,i,n){super(t,e,i),this._viewportCoords=n||new Wf,this._domRenderer=new Qm(e),this._imageTileLoader=new sm(i.api),this._roiCalculator=new am,this._spatial=new ld,this._glRendererOperation$=new T,this._glRendererCreator$=new T,this._glRendererDisposer$=new T,this._glRenderer$=this._glRendererOperation$.pipe(Le(((t,e)=>e(t)),null),Nt((t=>null!=t)),ue(void 0,(t=>t.frameId))),this._glRendererCreator$.pipe(rt((()=>t=>{if(null!=t)throw new Error("Multiple slider states can not be created at the same time");return new Km}))).subscribe(this._glRendererOperation$),this._glRendererDisposer$.pipe(rt((()=>t=>(t.dispose(),null)))).subscribe(this._glRendererOperation$)}_activate(){const e=this._subscriptions;e.push(this._domRenderer.mode$.subscribe((t=>{this.configure({mode:t})}))),e.push(this._glRenderer$.pipe(rt((t=>({name:this._name,renderer:{frameId:t.frameId,needsRender:t.needsRender,render:t.render.bind(t),pass:rm.Background}})))).subscribe(this._container.glRenderer.render$));const i=At(this.configuration$.pipe(rt((t=>null!=t.initialPosition?t.initialPosition:1)),Ee()),this._domRenderer.position$),n=this.configuration$.pipe(rt((t=>t.mode)),ue()),r=this._navigator.stateService.currentState$.pipe(rt((t=>t.state.motionless)),ue()),s=this._navigator.stateService.currentState$.pipe(rt((t=>dd(t.state.currentImage.cameraType))),ue()),o=gt(this._configuration$.pipe(rt((t=>t.sliderVisible))),this._navigator.stateService.currentState$.pipe(rt((t=>!(null==t.state.currentImage||null==t.state.previousImage||dd(t.state.currentImage.cameraType)&&!dd(t.state.previousImage.cameraType)))),ue())).pipe(rt((([t,e])=>t&&e)),ue());this._waitSubscription=gt(n,r,s,o).pipe(bi(this._navigator.stateService.state$)).subscribe((([[e,i,n,r],s])=>{const o=r&&(i||e===t.SliderConfigurationMode.Stationary||n);o&&s!==vm.WaitingInteractively?this._navigator.stateService.waitInteractively():o||s===vm.Waiting||this._navigator.stateService.wait()})),e.push(gt(i,n,r,s,o).subscribe((([e,i,n,r])=>{n||i===t.SliderConfigurationMode.Stationary||r?this._navigator.stateService.moveTo(1):this._navigator.stateService.moveTo(e)}))),e.push(gt(i,n,r,s,o,this._container.renderService.size$).pipe(rt((([t,e,i,n,r])=>({name:this._name,vNode:this._domRenderer.render(t,e,i,n,r)})))).subscribe(this._container.domRenderer.render$)),this._glRendererCreator$.next(null),e.push(gt(i,s,o,this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(rt((([t,e,i,n,r])=>{if(!e)return i?t:1;const s=this._viewportCoords.viewportToBasic(-1.15,0,r,n.perspective),o=this._viewportCoords.viewportToBasic(1.15,0,r,n.perspective),a=o[0]<s[0]?o[0]+1:o[0],c=s[0]+t*(a-s[0]);return c>1?c-1:c})),rt((t=>e=>(e.updateCurtain(t),e)))).subscribe(this._glRendererOperation$)),e.push(gt(this._navigator.stateService.currentState$,n).pipe(rt((([t,e])=>i=>(i.update(t,e),i)))).subscribe(this._glRendererOperation$)),e.push(this._configuration$.pipe(Nt((t=>null!=t.ids)),ri((t=>Ft(Ft(this._catchCacheImage$(t.ids.background),this._catchCacheImage$(t.ids.foreground)).pipe(rt((t=>({background:t[0],foreground:t[1]})))),this._navigator.stateService.currentState$.pipe(Ee())).pipe(rt((t=>({images:t[0],state:t[1].state}))))))).subscribe((t=>{null!=t.state.currentImage&&null!=t.state.previousImage&&t.state.currentImage.id===t.images.foreground.id&&t.state.previousImage.id===t.images.background.id||(t.state.currentImage.id!==t.images.background.id?t.state.currentImage.id!==t.images.foreground.id||1!==t.state.trajectory.length?(this._navigator.stateService.setImages([t.images.background]),this._navigator.stateService.setImages([t.images.foreground])):this._navigator.stateService.prependImages([t.images.background]):this._navigator.stateService.setImages([t.images.foreground]))}),(t=>{console.error(t)})));const a=this._container.configurationService.imageTiling$.pipe(ri((t=>t?this._navigator.stateService.currentState$:new T)),ue(void 0,(t=>t.state.currentImage.id)),bi(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),rt((([t,e,i])=>{const n=t.state;Math.max(i.width,i.height);const r=n.currentImage,s=n.currentTransform;return new _m(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new om,e)})),Ue(1),E());e.push(a.subscribe((()=>{}))),e.push(a.pipe(rt((t=>e=>(e.setTextureProvider(t.id,t),e)))).subscribe(this._glRendererOperation$)),e.push(a.pipe(ze()).subscribe((t=>{t[0].abort()})));const c=this._container.configurationService.imageTiling$.pipe(ri((t=>t?gt(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(re(250))):new T)),rt((([t,e])=>[t.camera.position.clone(),t.camera.lookat.clone(),t.zoom.valueOf(),e.height.valueOf(),e.width.valueOf()])),ze(),ti((t=>t[1][2]-t[0][2]<0||0===t[1][2])),rt((t=>{let e=t[0][0].equals(t[1][0]),i=t[0][1].equals(t[1][1]),n=t[0][2]===t[1][2],r=t[0][3]===t[1][3],s=t[0][4]===t[1][4];return e&&i&&n&&r&&s})),ue(),Nt((t=>t)),ri((()=>this._container.renderService.renderCameraFrame$.pipe(Ee()))),bi(this._container.renderService.size$,this._navigator.stateService.currentTransform$));e.push(a.pipe(ri((t=>c.pipe(rt((([e,i,n])=>[this._roiCalculator.computeRegionOfInterest(e,i,n),t]))))),Nt((t=>!t[1].disposed))).subscribe((t=>{let e=t[0];t[1].setRegionOfInterest(e)})));const h=a.pipe(ri((t=>t.hasTexture$)),ni(!1),Ue(1),E());e.push(h.subscribe((()=>{})));const l=this._container.configurationService.imageTiling$.pipe(ri((t=>t?this._navigator.stateService.currentState$:new T)),Nt((t=>!!t.state.previousImage)),ue(void 0,(t=>t.state.previousImage.id)),bi(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),rt((([t,e,i])=>{const n=t.state,r=n.previousImage,s=n.previousTransform;return new _m(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new om,e)})),Ue(1),E());e.push(l.subscribe((()=>{}))),e.push(l.pipe(rt((t=>e=>(e.setTextureProviderPrev(t.id,t),e)))).subscribe(this._glRendererOperation$)),e.push(l.pipe(ze()).subscribe((t=>{t[0].abort()})));const u=this._container.configurationService.imageTiling$.pipe(ri((t=>t?gt(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(re(250))):new T)),rt((([t,e])=>[t.camera.position.clone(),t.camera.lookat.clone(),t.zoom.valueOf(),e.height.valueOf(),e.width.valueOf()])),ze(),ti((t=>t[1][2]-t[0][2]<0||0===t[1][2])),rt((t=>{let e=t[0][0].equals(t[1][0]),i=t[0][1].equals(t[1][1]),n=t[0][2]===t[1][2],r=t[0][3]===t[1][3],s=t[0][4]===t[1][4];return e&&i&&n&&r&&s})),ue(),Nt((t=>t)),ri((()=>this._container.renderService.renderCameraFrame$.pipe(Ee()))),bi(this._container.renderService.size$,this._navigator.stateService.currentTransform$));e.push(l.pipe(ri((t=>u.pipe(rt((([e,i,n])=>[this._roiCalculator.computeRegionOfInterest(e,i,n),t]))))),Nt((t=>!t[1].disposed)),bi(this._navigator.stateService.currentState$)).subscribe((([[t,e],i])=>{let n=null;if(dd(i.state.previousImage.cameraType))if(dd(i.state.currentImage.cameraType)){const e=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(e.x,e.y,r.x,r.y)/(2*Math.PI);n={bbox:{maxX:this._spatial.wrap(t.bbox.maxX+s,0,1),maxY:t.bbox.maxY,minX:this._spatial.wrap(t.bbox.minX+s,0,1),minY:t.bbox.minY},pixelHeight:t.pixelHeight,pixelWidth:t.pixelWidth}}else{const e=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(e.x,e.y,r.x,r.y)/(2*Math.PI),o=this._spatial.angleToPlane(e.toArray(),[0,0,1]),a=(this._spatial.angleToPlane(r.toArray(),[0,0,1])-o)/(2*Math.PI),c=i.state.currentTransform,h=Math.max(c.basicWidth,c.basicHeight),l=h>0?2*Math.atan(.5*c.basicWidth/(h*c.focal)):Math.PI/3,u=h>0?2*Math.atan(.5*c.basicHeight/(h*c.focal)):Math.PI/3,d=l/(2*Math.PI),p=u/Math.PI,f=(t.bbox.maxX-t.bbox.minX)*d,m=(t.bbox.maxY-t.bbox.minY)*p,g=t.pixelWidth*d,_=t.pixelHeight*p,v=(t.bbox.minX+t.bbox.maxX)/2-.5,y=(t.bbox.minY+t.bbox.maxY)/2-.5,b=.5+s+d*v-f/2,x=.5+s+d*v+f/2,w=.5+a+p*y-m/2,S=.5+a+p*y+m/2;n={bbox:{maxX:this._spatial.wrap(x,0,1),maxY:S,minX:this._spatial.wrap(b,0,1),minY:w},pixelHeight:_,pixelWidth:g}}else{const e=i.state.currentTransform.basicAspect,r=i.state.previousTransform.basicAspect,[[s,o],[a,c]]=this._getBasicCorners(e,r),h=a-s,l=c-o,u=t.pixelWidth/h,d=t.pixelHeight/l,p=(h-1)/(2*h)+t.bbox.minX/h,f=(h-1)/(2*h)+t.bbox.maxX/h,m=(l-1)/(2*l)+t.bbox.minY/l,g={maxX:f,maxY:(l-1)/(2*l)+t.bbox.maxY/l,minX:p,minY:m};this._clipBoundingBox(g),n={bbox:g,pixelHeight:d,pixelWidth:u}}e.setRegionOfInterest(n)})));const d=l.pipe(ri((t=>t.hasTexture$)),ni(!1),Ue(1),E());e.push(d.subscribe((()=>{})))}_deactivate(){this._waitSubscription.unsubscribe(),this._navigator.stateService.state$.pipe(Ee()).subscribe((t=>{t!==vm.Traversing&&this._navigator.stateService.traverse()})),this._glRendererDisposer$.next(null),this._domRenderer.deactivate(),this._subscriptions.unsubscribe(),this.configure({ids:null})}_getDefaultConfiguration(){return{initialPosition:1,mode:t.SliderConfigurationMode.Motion,sliderVisible:!0}}_catchCacheImage$(t){return this._navigator.graphService.cacheImage$(t).pipe(te((e=>(console.error(`Failed to cache slider image (${t})`,e),B()))))}_getBasicCorners(t,e){let i,n;return t>e?(i=.5,n=.5*t/e):(i=.5*e/t,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_clipBoundingBox(t){t.minX=Math.max(0,Math.min(1,t.minX)),t.maxX=Math.max(0,Math.min(1,t.maxX)),t.minY=Math.max(0,Math.min(1,t.minY)),t.maxY=Math.max(0,Math.min(1,t.maxY))}}tg.componentName="slider";class eg{constructor(e,i){this._subscriptions=new Uf,this._graphService=e,this._stateService=i;const n=this._subscriptions;this._directionSubject$=new T,this._direction$=this._directionSubject$.pipe(ni(t.NavigationDirection.Next),Ue(1),E()),n.push(this._direction$.subscribe()),this._playing=!1,this._playingSubject$=new T,this._playing$=this._playingSubject$.pipe(ni(this._playing),Ue(1),E()),n.push(this._playing$.subscribe()),this._speed=.5,this._speedSubject$=new T,this._speed$=this._speedSubject$.pipe(ni(this._speed),Ue(1),E()),n.push(this._speed$.subscribe()),this._imagesAhead=this._mapImagesAhead(this._mapSpeed(this._speed)),this._bridging$=null}get playing(){return this._playing}get direction$(){return this._direction$}get playing$(){return this._playing$}get speed$(){return this._speed$}play(){if(this._playing)return;this._stateService.cutImages();const e=this._setSpeed(this._speed);this._stateService.setSpeed(e),this._graphModeSubscription=this._speed$.pipe(rt((t=>t>eg.sequenceSpeed?ym.Sequence:ym.Spatial)),ue()).subscribe((t=>{this._graphService.setGraphMode(t)})),this._cacheSubscription=gt(this._stateService.currentImage$.pipe(rt((t=>[t.sequenceId,t.id])),ue(void 0,(([t])=>t))),this._graphService.graphMode$,this._direction$).pipe(ri((([[e,i],n,r])=>{if(r!==t.NavigationDirection.Next&&r!==t.NavigationDirection.Prev)return G([void 0,r]);return gt((n===ym.Sequence?this._graphService.cacheSequenceImages$(e,i):this._graphService.cacheSequence$(e)).pipe(Ve(3),te((t=>(console.error(t),G(void 0))))),G(r))})),ri((([e,i])=>{if(void 0===e)return B();const n=e.imageIds.slice();return i===t.NavigationDirection.Prev&&n.reverse(),this._stateService.currentState$.pipe(rt((t=>[t.state.trajectory[t.state.trajectory.length-1].id,t.state.imagesAhead])),Le((([t,e],[i,r])=>{void 0===t&&(t=i);const s=n.length-1;if(r>=this._imagesAhead||n[s]===t)return[t,[]];const o=n.indexOf(i),a=n.indexOf(t)+1,c=Math.min(s,o+this._imagesAhead-r)+1;return c<=a?[t,[]]:[n[c-1],n.slice(a,c)]}),[void 0,[]]),Mt((([t,e])=>bt(e))))})),Mt((t=>this._graphService.cacheImage$(t).pipe(te((()=>B())))),6)).subscribe(),this._playingSubscription=this._stateService.currentState$.pipe(Nt((t=>t.state.imagesAhead<this._imagesAhead)),ue(void 0,(t=>t.state.lastImage.id)),rt((t=>{const e=t.state.lastImage,i=t.state.trajectory;let n;for(let t=i.length-2;t>=0;t--){const r=i[t];if(r.sequenceId!==e.sequenceId)break;if(r.capturedAt!==e.capturedAt){n=r.capturedAt<e.capturedAt;break}}return[t.state.lastImage,n]})),bi(this._direction$),ri((([[e,i],n])=>Ft(([t.NavigationDirection.Next,t.NavigationDirection.Prev].indexOf(n)>-1?e.sequenceEdges$:e.spatialEdges$).pipe(Ee((t=>t.cached)),yi(15e3)),G(n)).pipe(rt((([t,e])=>{for(let i of t.edges)if(i.data.direction===e)return i.target;return null})),ri((t=>null!=t?this._graphService.cacheImage$(t):B())))))).subscribe((t=>{this._stateService.appendImagess([t])}),(t=>{console.error(t),this.stop()})),this._clearSubscription=this._stateService.currentImage$.pipe(Xt(1,10)).subscribe((t=>{this._stateService.clearPriorImages()})),this._setPlaying(!0);const i=this._stateService.currentState$.pipe(rt((t=>t.state)),ue((([t,e],[i,n])=>t===i&&e===n),(t=>[t.currentImage.id,t.lastImage.id])),Nt((t=>t.currentImage.id===t.lastImage.id&&t.currentIndex===t.trajectory.length-1)),rt((t=>t.currentImage)));this._stopSubscription=gt(i,this._direction$).pipe(ri((([e,i])=>{const n=([t.NavigationDirection.Next,t.NavigationDirection.Prev].indexOf(i)>-1?e.sequenceEdges$:e.spatialEdges$).pipe(Ee((t=>t.cached)),yi(15e3),te((t=>(console.error(t),G({cached:!1,edges:[]})))));return gt(G(i),n).pipe(rt((([t,e])=>{for(const i of e.edges)if(i.data.direction===t)return!0;return!1})))})),Mt((t=>t||!this._bridging$?G(t):this._bridging$.pipe(rt((t=>null!=t)),te((t=>(console.error(t),G(!1))))))),Ee((t=>!t))).subscribe(void 0,void 0,(()=>{this.stop()})),this._stopSubscription.closed&&(this._stopSubscription=null),this._earthSubscription=this._stateService.state$.pipe(rt((t=>t===vm.Earth)),ue(),Ee((t=>t))).subscribe(void 0,void 0,(()=>{this.stop()})),this._earthSubscription.closed&&(this._earthSubscription=null)}dispose(){this.stop(),this._subscriptions.unsubscribe()}setDirection(t){this._directionSubject$.next(t)}setSpeed(t){if((t=Math.max(0,Math.min(1,t)))===this._speed)return;const e=this._setSpeed(t);this._playing&&this._stateService.setSpeed(e),this._speedSubject$.next(this._speed)}stop(){this._playing&&(this._stopSubscription&&(this._stopSubscription.closed||this._stopSubscription.unsubscribe(),this._stopSubscription=null),this._earthSubscription&&(this._earthSubscription.closed||this._earthSubscription.unsubscribe(),this._earthSubscription=null),this._graphModeSubscription.unsubscribe(),this._graphModeSubscription=null,this._cacheSubscription.unsubscribe(),this._cacheSubscription=null,this._playingSubscription.unsubscribe(),this._playingSubscription=null,this._clearSubscription.unsubscribe(),this._clearSubscription=null,this._stateService.setSpeed(1),this._stateService.cutImages(),this._graphService.setGraphMode(ym.Spatial),this._setPlaying(!1))}_mapSpeed(t){const e=2*t-1;return Math.pow(10,e)-.2*e}_mapImagesAhead(t){return Math.round(Math.max(10,Math.min(50,8+6*t)))}_setPlaying(t){this._playing=t,this._playingSubject$.next(t)}_setSpeed(t){this._speed=t;const e=this._mapSpeed(this._speed);return this._imagesAhead=this._mapImagesAhead(e),e}}eg.sequenceSpeed=.54,t.CameraVisualizationMode=void 0,(wm=t.CameraVisualizationMode||(t.CameraVisualizationMode={}))[wm.Hidden=0]="Hidden",wm[wm.Homogeneous=1]="Homogeneous",wm[wm.Cluster=2]="Cluster",wm[wm.ConnectedComponent=3]="ConnectedComponent",wm[wm.Sequence=4]="Sequence",t.OriginalPositionMode=void 0,(Sm=t.OriginalPositionMode||(t.OriginalPositionMode={}))[Sm.Hidden=0]="Hidden",Sm[Sm.Altitude=1]="Altitude",Sm[Sm.Flat=2]="Flat";class ig extends Qc{constructor(t){super(),this._originalSize=t.originalSize;const e=t.cluster,i=t.scale,n=t.translation;this._makeAttributes(e),this.material.size=i*this._originalSize,this.material.vertexColors=!0,this.material.needsUpdate=!0,this.matrixAutoUpdate=!1,this.position.fromArray(n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}resize(t){this.material.size=t*this._originalSize,this.material.needsUpdate=!0}_makeAttributes(t){const e=[],i=[],n=t.points;for(const t in n){if(!n.hasOwnProperty(t))continue;const r=n[t];e.push(...r.coordinates);const s=r.color;i.push(s[0]),i.push(s[1]),i.push(s[2])}const r=this.geometry;r.setAttribute("position",new Hr(new Float32Array(e),3)),r.setAttribute("color",new Hr(new Float32Array(i),3))}}class ng extends Uc{constructor(t){super(),this._makeAttributes(t),this.matrixAutoUpdate=!1,this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}_makeAttributes(t){const e=t.slice();e.push(t[0]);let i=0;const n=new Float32Array(3*(t.length+1));for(const t of e)n[i++]=t[0],n[i++]=t[1],n[i++]=t[2];this.geometry.setAttribute("position",new Hr(n,3))}}function rg(t,e){return t===e}function sg(t){const e=function(t){return Math.pow(2,t)}(t)/2;return{min:[-e,-e,-e],max:[e,e,e]}}class og{constructor(t,e,i,n){this.level=t,this.leafLevel=e,this.boundingBox=i,this.parent=n,this.children=[],this.items=[],n&&n.children.push(this)}get isEmpty(){return!(this.children.length||this.items.length)}add(t){const e=this;if(!e.boundingBox.containsPoint(t.position))throw new Error("Item not contained in node");if(rg(e.level,e.leafLevel))return e.items.push(t),this;for(const i of e.children)if(i.boundingBox.containsPoint(t.position))return i.add(t);for(const i of e._generateBoundingBoxes())if(i.containsPoint(t.position)){return new og(e.level-1,e.leafLevel,i,e).add(t)}throw new Error("Item not contained in children")}intersect(t,e,i){if(t.intersectBox(this.boundingBox,e))if(rg(this.level,this.leafLevel))i.push(this);else for(const n of this.children)n.intersect(t,e,i)}remove(t){const e=this.items.indexOf(t);if(e<0)throw new Error(`Item does not exist ${t.uuid}`);this.items.splice(e,1)}traverse(){const t=this;if(!t.isEmpty)return;const e=t.parent;if(!e)return;const i=e.children.indexOf(t);if(i<0)throw new Error("Corrupt octree");e.children.splice(i,1),this.parent=null,e.traverse()}_generateBoundingBoxes(){const t=this.boundingBox.min,e=(this.boundingBox.max.x-t.x)/2,i=[[t.x,t.y+e,t.z+e],[t.x+e,t.y+e,t.z+e],[t.x,t.y,t.z+e],[t.x+e,t.y,t.z+e],[t.x,t.y+e,t.z],[t.x+e,t.y+e,t.z],[t.x,t.y,t.z],[t.x+e,t.y,t.z]],n=[];for(const[t,r,s]of i)n.push(new _n(new fn(t,r,s),new fn(t+e,r+e,s+e)));return n}}class ag{constructor(t,e){if(this.rootLevel=t,this.leafLevel=e,e>t)throw new Error;this._index=new Map,this._root=this._makeRoot()}get root(){return this._root}add(t){if(!this.root.boundingBox.containsPoint(t.position))return void console.warn(`Object outside bounding box ${t.uuid}`);const e=this._root.add(t);this._index.set(t.uuid,e)}has(t){return this._index.has(t.uuid)}intersect(t){const e=[],i=new fn;return this._root.intersect(t,i,e),e.map((t=>t.items)).reduce(((t,e)=>(t.push(...e),t)),[])}reset(){this._root=this._makeRoot(),this._index.clear()}remove(t){if(!this.has(t))throw new Error(`Frame does not exist ${t.uuid}`);const e=this._index.get(t.uuid);e.remove(t),e.traverse(),this._index.delete(t.uuid)}_makeRoot(){const t=this.rootLevel,e=sg(t),i=new _n((new fn).fromArray(e.min),(new fn).fromArray(e.max));return new og(t,this.leafLevel,i)}}class cg{constructor(t,e){this._objects=[],this._objectImageMap=new Map,this._octree=null!=t?t:new ag(14,6),this._raycaster=null!=e?e:new Bu,this._interactiveLayer=1,this._raycaster=e||new Bu(void 0,void 0,1,1e4),this._lineThreshold=.2,this._largeLineThreshold=.4,this._raycaster.params.Line.threshold=this._lineThreshold,this._raycaster.layers.set(this._interactiveLayer)}get interactiveLayer(){return this._interactiveLayer}get octree(){return this._octree}get raycaster(){return this._raycaster}add(t,e){const i=t.uuid;this._objectImageMap.set(i,e),this._objects.push(t),this._octree.add(t)}intersectObjects(t,e){this._raycaster.setFromCamera((new rn).fromArray(t),e);const i=this._octree.intersect(this.raycaster.ray),n=this._raycaster.intersectObjects(i),r=this._objectImageMap;for(const t of n){const e=t.object.uuid;if(r.has(e))return r.get(e)}return null}remove(t){const e=this._objects,i=e.indexOf(t);if(-1!==i){const n=e.splice(i,1);for(const t of n)this._objectImageMap.delete(t.uuid);this._octree.remove(t)}else console.warn("Object does not exist")}resetIntersectionThreshold(t){this._raycaster.params.Line.threshold=t?this._largeLineThreshold:this._lineThreshold}}class hg extends Uc{constructor(t){super(t.geometry,t.material);const e=t.mode,i=t.originalOrigin,n=t.transform.unprojectBasic([0,0],0);this._relativeAltitude=i[2]-n[2],this._makeAttributes(n,i,e),this.matrixAutoUpdate=!1,this.position.fromArray(n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setMode(t){const e=this.geometry.attributes.position;e.array[5]=this._modeToAltitude(t),e.needsUpdate=!0,this.geometry.computeBoundingSphere()}_makeAttributes(t,e,i){const n=new Float32Array(6);n[0]=0,n[1]=0,n[2]=0,n[3]=e[0]-t[0],n[4]=e[1]-t[1],n[5]=this._modeToAltitude(i);const r=new Hr(n,3);this.geometry.setAttribute("position",r),r.needsUpdate=!0,this.geometry.computeBoundingSphere()}_modeToAltitude(e){return e===t.OriginalPositionMode.Altitude?this._relativeAltitude:0}}class lg extends qc{constructor(t){super(t.geometry,t.material);const e=t.color,i=t.size,n=t.scale,r=t.transform,s=r.unprojectBasic([0,0],0),o=this._makePositions(i,r,s);this._makeAttributes(o,e),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),this.matrixAutoUpdate=!1,this.position.fromArray(s),this.scale.set(n,n,n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setColor(t){return this._updateColorAttribute(t),this}resize(t){return this.scale.set(t,t,t),this.updateMatrix(),this.updateMatrixWorld(!1),this}_makeAttributes(t,e){const i=this.geometry,n=new Hr(new Float32Array(t),3);i.setAttribute("position",n),n.needsUpdate=!0;const r=new Hr(new Float32Array(t.length),3);i.setAttribute("color",r),this._updateColorAttribute(e)}_updateColorAttribute(t){const[e,i,n]=new Dr(t).toArray(),r=this.geometry.attributes.color,s=r.array,o=s.length;let a=0;for(let t=0;t<o;t++)s[a++]=e,s[a++]=i,s[a++]=n;r.needsUpdate=!0}}class ug extends lg{_makePositions(t,e,i){const n=[];n.push(...this._makeAxis(t,e,i)),n.push(...this._makeLat(.5,10,t,e,i));for(const r of[0,.25,.5,.75])n.push(...this._makeLng(r,10,t,e,i));return n}_makeAxis(t,e,i){const n=e.unprojectBasic([.5,1],.8*t),r=e.unprojectBasic([.5,0],1.2*t);return[n[0]-i[0],n[1]-i[1],n[2]-i[2],r[0]-i[0],r[1]-i[1],r[2]-i[2]]}_makeLat(t,e,i,n,r){const s=.8*i,[o,a,c]=r,h=[],l=n.unprojectBasic([0,t],s);l[0]-=o,l[1]-=a,l[2]-=c,h.push(...l);for(let i=1;i<=e;i++){const r=n.unprojectBasic([i/e,t],s);r[0]-=o,r[1]-=a,r[2]-=c,h.push(...r,...r)}return h.push(...l),h}_makeLng(t,e,i,n,r){const s=.8*i,[o,a,c]=r,h=[],l=n.unprojectBasic([t,0],s);l[0]-=o,l[1]-=a,l[2]-=c,h.push(...l);for(let i=0;i<=e;i++){const r=n.unprojectBasic([t,i/e],s);r[0]-=o,r[1]-=a,r[2]-=c,h.push(...r,...r)}return h.push(...l),h}}class dg extends lg{_makePositions(t,e,i){const n=[];return n.push(...this._makeDiags(t,e,i)),n.push(...this._makeFrame(t,8,e,i)),n}_makeDiags(t,e,i){const n=t,[r,s,o]=i,a=[0,0,0],c=[];for(const t of[[0,0],[1,0],[1,1],[0,1]]){const i=e.unprojectBasic(t,n,!0);i[0]-=r,i[1]-=s,i[2]-=o,c.push(...a,...i)}return c}_makeFrame(t,e,i,n){const r=[];r.push(...this._subsample([0,1],[0,0],e)),r.push(...this._subsample([0,0],[1,0],e)),r.push(...this._subsample([1,0],[1,1],e));const s=t,[o,a,c]=n,h=[];for(const t of r){const e=i.unprojectBasic(t,s,!0);e[0]-=o,e[1]-=a,e[2]-=c,h.push(...e)}return h}_interpolate(t,e,i){return t+i*(e-t)}_subsample(t,e,i){if(i<1)return[t,e];const n=[];n.push(t);for(let r=0;r<=i;r++){const s=[];for(let n=0;n<3;n++)s.push(this._interpolate(t[n],e[n],r/(i+1)));n.push(s),n.push(s)}return n.push(e),n}}class pg{constructor(t,e,i){this.id=t,this._scene=e,this._intersection=i,this.cameras=new pr,this.keys=[],this._positionLines={},this._positions=new pr,this._cameraFrames={},this._clusters=new Map,this._connectedComponents=new Map,this._sequences=new Map,this._props={},this.clusterVisibles={},this._frameMaterial=new kc({fog:!1,vertexColors:!0}),this._positionMaterial=new kc({fog:!1,color:16711680}),this._scene.add(this.cameras,this._positions)}addImage(t){const e=t.image,i=e.id;if(this.hasImage(i))throw new Error(`Image exists ${i}`);const n=t.idMap.ccId;this._connectedComponents.has(n)||this._connectedComponents.set(n,[]);const r=t.idMap.clusterId;this._clusters.has(r)||this._clusters.set(r,[]);const s=t.idMap.sequenceId;this._sequences.has(s)||this._sequences.set(s,[]),this._props[i]={image:e,ids:{ccId:n,clusterId:r,sequenceId:s}},this.keys.push(i)}applyCameraColor(t,e){this._cameraFrames[t].setColor(e)}applyCameraSize(t){for(const e of this.cameras.children)e.resize(t)}applyFilter(t){var e;const i=this.clusterVisibles;for(const t in i)i.hasOwnProperty(t)&&(i[t]=!1);const n=this._cameraFrames,r=this._positionLines,s=this._intersection.interactiveLayer;for(const o of Object.values(this._props)){const a=o.image,c=t(a),h=a.id;r[h].visible=c;const l=n[h];this._setCameraVisibility(l,c,s),i[e=o.ids.clusterId]||(i[e]=c)}}applyPositionMode(e){this._positions.visible=e!==t.OriginalPositionMode.Hidden;for(const t of this._positions.children)t.setMode(e)}dispose(){this._disposeCameras(),this._disposePositions(),this._scene=null,this._intersection=null}getCamerasByMode(e){if(e===t.CameraVisualizationMode.Cluster)return this._clusters;if(e===t.CameraVisualizationMode.ConnectedComponent)return this._connectedComponents;if(e===t.CameraVisualizationMode.Sequence)return this._sequences;const i=t.CameraVisualizationMode,n=i[i.Homogeneous],r=new Map;return r.set(n,this.cameras.children),r}getColorId(e,i){const n=this._props[e],r=t.CameraVisualizationMode;switch(i){case r.Cluster:return n.ids.clusterId;case r.ConnectedComponent:return n.ids.ccId;case r.Sequence:return n.ids.sequenceId;default:return r[r.Homogeneous]}}hasImage(t){return-1!==this.keys.indexOf(t)}visualize(t){var e,i;const n=t.id,r=t.visible,s=t.transform,o={color:t.color,material:this._frameMaterial,scale:t.scale,size:t.maxSize,transform:s},a=dd(s.cameraType)?new ug(o):new dg(o),c=this._intersection.interactiveLayer;this._setCameraVisibility(a,r,c),this.cameras.add(a),this._cameraFrames[n]=a;this._intersection.add(a,n);const h=this._props[n].ids;(e=this.clusterVisibles)[i=h.clusterId]||(e[i]=r),this._connectedComponents.get(h.ccId).push(a),this._clusters.get(h.clusterId).push(a),this._sequences.get(h.sequenceId).push(a);const l={material:this._positionMaterial,mode:t.positionMode,originalOrigin:t.originalPosition,transform:s},u=new hg(l);u.visible=r,this._positions.add(u),this._positionLines[n]=u}_disposeCameras(){const t=this._intersection,e=this.cameras;for(const i of e.children.slice())i.dispose(),t.remove(i),e.remove(i);this._scene.remove(this.cameras)}_disposePositions(){const t=this._positions;for(const e of t.children.slice())e.dispose(),t.remove(e);this._scene.remove(this._positions)}_setCameraVisibility(t,e,i){t.visible=e,e?t.layers.enable(i):t.layers.disable(i)}}class fg{constructor(){this._colors=new Map;const e=t.CameraVisualizationMode;this._colors.set(e[e.Homogeneous],"#FFFFFF")}getColor(t){const e=this._colors;return e.has(t)||e.set(t,this._randomColor()),e.get(t)}_randomColor(){return`hsl(${Math.floor(360*Math.random())}, 100%, 50%)`}}function mg(e){return e!==t.CameraVisualizationMode.Hidden}class gg{constructor(e,i){this._rayNearScale=1.1,this._originalPointSize=2,this._originalCameraSize=2,this._imageCellMap=new Map,this._scene=i||new Qa,this._scene.autoUpdate=!1,this._intersection=new cg,this._assets=new fg,this._needsRender=!1,this._images={},this._cells={},this._cellClusters={},this._clusters={},this._cameraVisualizationMode=e.cameraVisualizationMode?e.cameraVisualizationMode:t.CameraVisualizationMode.Homogeneous,this._cameraSize=e.cameraSize,this._pointSize=e.pointSize,this._pointsVisible=e.pointsVisible,this._positionMode=e.originalPositionMode,this._cellsVisible=e.cellsVisible,this._hoveredId=null,this._selectedId=null,this._colors={hover:"#FF0000",select:"#FF8000"},this._filter=()=>!0}get needsRender(){return this._needsRender}get intersection(){return this._intersection}addCluster(t,e,i){if(this.hasCluster(t.id,i))return;const n=t.id;if(!(n in this._clusters)){this._clusters[n]={points:new pr,cellIds:[]};const i=this._getClusterVisible(n);this._clusters[n].points.visible=i,this._clusters[n].points.add(new ig({cluster:t,originalSize:this._originalPointSize,scale:this._pointSize,translation:e})),this._scene.add(this._clusters[n].points)}-1===this._clusters[n].cellIds.indexOf(i)&&this._clusters[n].cellIds.push(i),i in this._cellClusters||(this._cellClusters[i]={keys:[]}),-1===this._cellClusters[i].keys.indexOf(n)&&this._cellClusters[i].keys.push(n),this._needsRender=!0}addImage(t,e,i,n){var r,s,o;const a=t.id,c={clusterId:null!==(r=t.clusterId)&&void 0!==r?r:"NO_CLUSTER_ID",sequenceId:null!==(s=t.sequenceId)&&void 0!==s?s:"NO_SEQUENCE_ID",ccId:null!==(o=t.mergeId)&&void 0!==o?o:"NO_MERGE_ID"};if(!(n in this._images)){const t=new pg(n,this._scene,this._intersection);t.cameras.visible=mg(this._cameraVisualizationMode),t.applyPositionMode(this._positionMode),this._images[n]=t}const h=this._images[n];if(h.hasImage(a))return;h.addImage({idMap:c,image:t});const l=h.getColorId(a,this._cameraVisualizationMode),u=this._assets.getColor(l),d=this._filter(t);if(h.visualize({id:a,color:u,positionMode:this._positionMode,scale:this._cameraSize,transform:e,visible:d,maxSize:this._originalCameraSize,originalPosition:i}),this._imageCellMap.set(a,n),a===this._selectedId&&this._highlight(a,this._colors.select,this._cameraVisualizationMode),c.clusterId in this._clusters){const t=this._getClusterVisible(c.clusterId);this._clusters[c.clusterId].points.visible=t}this._needsRender=!0}addCell(t,e){if(this.hasCell(e))return;const i=new ng(t);this._cells[e]=new pr,this._cells[e].visible=this._cellsVisible,this._cells[e].add(i),this._scene.add(this._cells[e]),this._needsRender=!0}deactivate(){this._filter=()=>!0,this._selectedId=null,this._hoveredId=null,this.uncache()}hasCluster(t,e){return t in this._clusters&&-1!==this._clusters[t].cellIds.indexOf(e)}hasCell(t){return t in this._cells}hasImage(t,e){return e in this._images&&this._images[e].hasImage(t)}setCameraSize(t){if(Math.abs(t-this._cameraSize)<.001)return;const e=this._images;for(const i of Object.keys(e))e[i].applyCameraSize(t);this._intersection.raycaster.near=this._getNear(t),this._cameraSize=t,this._needsRender=!0}setFilter(t){this._filter=t;const e={};for(const i of Object.values(this._images)){i.applyFilter(t);const n=i.clusterVisibles;for(const t in n)n.hasOwnProperty(t)&&(t in e||(e[t]=!1),e[t]||(e[t]=n[t]))}const i=this._pointsVisible;for(const t in e){if(!e.hasOwnProperty(t))continue;e[t]&&(e[t]=i);const n=e[t];t in this._clusters&&(this._clusters[t].points.visible=n)}this._needsRender=!0}setHoveredImage(t){if(null!=t&&!this._imageCellMap.has(t))throw new cd(`Image does not exist: ${t}`);this._hoveredId!==t&&(this._needsRender=!0,null!=this._hoveredId&&(this._hoveredId===this._selectedId?this._highlight(this._hoveredId,this._colors.select,this._cameraVisualizationMode):this._resetCameraColor(this._hoveredId)),this._highlight(t,this._colors.hover,this._cameraVisualizationMode),this._hoveredId=t)}setNavigationState(t){this._intersection.resetIntersectionThreshold(t)}setPointSize(t){if(Math.abs(t-this._pointSize)<.001)return;const e=this._clusters;for(const i in e)if(e.hasOwnProperty(i))for(const n of e[i].points.children)n.resize(t);this._pointSize=t,this._needsRender=!0}setPointVisibility(t){if(t!==this._pointsVisible){for(const e in this._clusters)this._clusters.hasOwnProperty(e)&&(this._clusters[e].points.visible=t);this._pointsVisible=t,this._needsRender=!0}}setPositionMode(t){if(t!==this._positionMode){for(const e of Object.values(this._images))e.applyPositionMode(t);this._positionMode=t,this._needsRender=!0}}setSelectedImage(t){this._selectedId!==t&&(this._needsRender=!0,null!=this._selectedId&&this._resetCameraColor(this._selectedId),this._highlight(t,this._colors.select,this._cameraVisualizationMode),this._selectedId=t)}setCellVisibility(t){if(t!==this._cellsVisible){for(const e in this._cells)this._cells.hasOwnProperty(e)&&(this._cells[e].visible=t);this._cellsVisible=t,this._needsRender=!0}}setCameraVisualizationMode(t){if(t===this._cameraVisualizationMode)return;const e=mg(t),i=this._assets;for(const n of Object.values(this._images)){n.cameras.visible=e;n.getCamerasByMode(t).forEach(((t,e)=>{const n=i.getColor(e);for(const e of t)e.setColor(n)}))}this._highlight(this._hoveredId,this._colors.hover,t),this._highlight(this._selectedId,this._colors.select,t),this._cameraVisualizationMode=t,this._needsRender=!0}render(t,e){e.render(this._scene,t),this._needsRender=!1}uncache(t){for(const e of Object.keys(this._cellClusters))t&&-1!==t.indexOf(e)||this._disposeReconstruction(e);for(const e of Object.keys(this._images)){if(t&&-1!==t.indexOf(e))continue;const i=this._imageCellMap,n=this._images[e].keys;for(const t of n)i.delete(t);this._images[e].dispose(),delete this._images[e]}for(const e of Object.keys(this._cells))t&&-1!==t.indexOf(e)||this._disposeCell(e);this._needsRender=!0}_getClusterVisible(t){if(!this._pointsVisible)return!1;let e=!1;for(const i of Object.values(this._images)){const n=i.clusterVisibles;t in n&&(e||(e=n[t]))}return e}_disposePoints(t){for(const e of this._cellClusters[t].keys){if(!(e in this._clusters))continue;const i=this._clusters[e].cellIds.indexOf(t);if(-1!==i&&(this._clusters[e].cellIds.splice(i,1),!(this._clusters[e].cellIds.length>0))){for(const t of this._clusters[e].points.children.slice())t.dispose();this._scene.remove(this._clusters[e].points),delete this._clusters[e]}}}_disposeReconstruction(t){this._disposePoints(t),delete this._cellClusters[t]}_disposeCell(t){const e=this._cells[t];for(const t of e.children.slice())t.dispose(),e.remove(t);this._scene.remove(e),delete this._cells[t]}_getNear(t){const e=this._rayNearScale*this._originalCameraSize*t;return Math.max(1,e)}_resetCameraColor(t){const e=this._imageCellMap;if(null==t||!e.has(t))return;const i=e.get(t),n=this._images[i],r=n.getColorId(t,this._cameraVisualizationMode),s=this._assets.getColor(r);n.applyCameraColor(t,s)}_highlight(e,i,n){const r=this._imageCellMap;if(null==e||!r.has(e))return;const s=r.get(e);i=n===t.CameraVisualizationMode.Homogeneous?i:"#FFFFFF",this._images[s].applyCameraColor(e,i)}}class _g{constructor(t,e){this._graphService=t,this._data=e,this._cells={},this._cacheRequests={},this._clusters={},this._clusterCells={},this._cellClusters={},this._cachingCells$={},this._cachingClusters$={}}cacheClusters$(t){if(!this.hasCell(t))throw new Error("Cannot cache reconstructions of a non-existing cell.");if(this.hasClusters(t))throw new Error("Cannot cache reconstructions that already exists.");if(this.isCachingClusters(t))return this._cachingClusters$[t];const e=this.getCell(t).filter((t=>!!t.clusterId&&!!t.clusterUrl)).map((t=>({key:t.clusterId,url:t.clusterUrl}))),i=Array.from(new Map(e.map((t=>[t.key,t]))).values());let n;this._cellClusters[t]=i,this._cacheRequests[t]=[];const r=new Promise(((t,e)=>{n=e}));return this._cacheRequests[t].push(n),this._cachingClusters$[t]=this._cacheClusters$(i,t,r).pipe(Me((()=>{t in this._cachingClusters$&&delete this._cachingClusters$[t],t in this._cacheRequests&&delete this._cacheRequests[t]})),He(),E()),this._cachingClusters$[t]}cacheCell$(t){if(this.hasCell(t))throw new Error("Cannot cache cell that already exists.");return this.isCachingCell(t)||(this._cachingCells$[t]=this._graphService.cacheCell$(t).pipe(te((t=>(console.error(t),B()))),Nt((()=>!(t in this._cells))),pi((e=>{this._cells[t]=[],this._cells[t].push(...e),delete this._cachingCells$[t]})),Me((()=>{t in this._cachingCells$&&delete this._cachingCells$[t]})),He(),E())),this._cachingCells$[t]}isCachingClusters(t){return t in this._cachingClusters$}isCachingCell(t){return t in this._cachingCells$}hasClusters(t){if(t in this._cachingClusters$||!(t in this._cellClusters))return!1;for(const e of this._cellClusters[t])if(!(e.key in this._clusters))return!1;return!0}hasCell(t){return!(t in this._cachingCells$)&&t in this._cells}getClusters(t){return t in this._cellClusters?this._cellClusters[t].map((t=>this._clusters[t.key])).filter((t=>!!t)):[]}getCell(t){return t in this._cells?this._cells[t]:[]}uncache(t){for(let e of Object.keys(this._cacheRequests))if(!t||-1===t.indexOf(e)){for(const t of this._cacheRequests[e])t();delete this._cacheRequests[e]}for(let e of Object.keys(this._cellClusters))if(!t||-1===t.indexOf(e)){for(const t of this._cellClusters[e]){if(!(t.key in this._clusterCells))continue;const i=this._clusterCells[t.key].indexOf(e);-1!==i&&(this._clusterCells[t.key].splice(i,1),this._clusterCells[t.key].length>0||(delete this._clusterCells[t.key],delete this._clusters[t.key]))}delete this._cellClusters[e]}for(let e of Object.keys(this._cells))t&&-1!==t.indexOf(e)||delete this._cells[e]}updateCell$(t){if(!this.hasCell(t))throw new Error("Cannot update cell that does not exists.");return this._graphService.cacheCell$(t).pipe(te((t=>(console.error(t),B()))),Nt((()=>t in this._cells)),pi((e=>{this._cells[t]=[],this._cells[t].push(...e)})),He(),E())}updateClusters$(t){if(!this.hasCell(t))throw new Error("Cannot update reconstructions of a non-existing cell.");if(!this.hasClusters(t))throw new Error("Cannot update reconstructions for cell that is not cached.");const e=this.getCell(t).filter((t=>!!t.clusterId&&!!t.clusterUrl)).map((t=>({key:t.clusterId,url:t.clusterUrl}))),i=Array.from(new Map(e.map((t=>[t.key,t]))).values()).filter((t=>!(t.key in this._clusters)));return this._cellClusters[t].push(...i),this._cacheClusters$(i,t,null)}_cacheClusters$(t,e,i){return bt(t).pipe(Mt((t=>this._hasCluster(t.key)?G(this._getCluster(t.key)):this._getCluster$(t.url,t.key,i).pipe(te((t=>(t instanceof Zf||console.error(t),B()))))),6),Nt((()=>e in this._cellClusters)),pi((t=>{this._hasCluster(t.id)||(this._clusters[t.id]=t),t.id in this._clusterCells||(this._clusterCells[t.id]=[]),-1===this._clusterCells[t.id].indexOf(e)&&this._clusterCells[t.id].push(e)})))}_getCluster(t){return this._clusters[t]}_getCluster$(t,e,i){return b.create((n=>{this._data.getCluster(t,i).then((t=>{t.id=e,n.next(t),n.complete()}),(t=>{n.error(t)}))}))}_hasCluster(t){return t in this._clusters}}function vg(t,e,i){const n=new Set;return n.add(t),yg(n,[t],0,e,i),Array.from(n)}function yg(t,e,i,n,r){if(i>=n)return;const s=[];for(const t of e){const e=r.getAdjacent(t);s.push(...e)}const o=[];for(const e of s)t.has(e)||(t.add(e),o.push(e));yg(t,o,i+1,n,r)}class bg extends Vf{constructor(t,e,i){super(t,e,i),this._cache=new _g(i.graphService,i.api.data),this._scene=new gg(this._getDefaultConfiguration()),this._viewportCoords=new Wf,this._spatial=new ld}getFrameIdAt(t){return new Promise(((e,i)=>{this._container.renderService.renderCamera$.pipe(Ee(),rt((e=>{const i=this._viewportCoords.canvasToViewport(t[0],t[1],this._container.container);return this._scene.intersection.intersectObjects(i,e.perspective)}))).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}_activate(){this._navigator.cacheService.configure({cellDepth:3});const t=this._subscriptions;t.push(this._navigator.stateService.reference$.subscribe((()=>{this._scene.uncache()}))),t.push(this._navigator.graphService.filter$.subscribe((t=>{this._scene.setFilter(t)})));const e=this._container.renderService.bearing$.pipe(rt((t=>6*Math.floor(t/6))),ue(),Ue(1),E()),i=this._navigator.stateService.currentImage$.pipe(rt((t=>this._navigator.api.data.geometry.lngLatToCellId(t.originalLngLat))),ue(),Ue(1),E()),n=this._configuration$.pipe(rt((t=>this._spatial.clamp(t.cellGridDepth,1,3))),ue(),Ue(1),E()),r=gt(this._navigator.playService.playing$,this._navigator.playService.speed$).pipe(rt((([t,e])=>t&&e>eg.sequenceSpeed)),ue(),Ue(1),E()),s=this._navigator.stateService.state$.pipe(rt((t=>function(t){return t===vm.Custom||t===vm.Earth}(t))),ue(),Ue(1),E());t.push(s.subscribe((t=>{this._scene.setNavigationState(t)})));const o=gt(s,r,e,n,this._navigator.stateService.currentImage$).pipe(ue((([t,e,i,n,r],[s,o,a,c,h])=>{if(t!==s)return!1;const l=r.id===h.id&&e===o&&n===c;return t?l:l&&i===a})),ne((([t,e,i,n,r])=>{if(t){const t=this._navigator.api.data.geometry,i=t.lngLatToCellId(r.originalLngLat);return G(e?[i]:vg(i,n,t))}const s=e?30:90;return G(this._cellsInFov(r,i,s))})),ri((t=>bt(t).pipe(Mt((t=>(this._cache.hasCell(t)?G(this._cache.getCell(t)):this._cache.cacheCell$(t)).pipe(rt((e=>({id:t,images:e}))))),6)))));t.push(o.pipe(bi(this._navigator.stateService.reference$)).subscribe((([t,e])=>{this._scene.hasCell(t.id)||this._scene.addCell(this._cellToTopocentric(t.id,e),t.id)}))),t.push(o.pipe(bi(this._navigator.stateService.reference$)).subscribe((([t,e])=>{this._addSceneImages(t,e)}))),t.push(o.pipe(ne((t=>{const e=t.id;let i;return i=this._cache.hasClusters(e)?bt(this._cache.getClusters(e)):this._cache.isCachingClusters(e)?this._cache.cacheClusters$(e).pipe(Re(null,{}),ri((()=>bt(this._cache.getClusters(e))))):this._cache.hasCell(e)?this._cache.cacheClusters$(e):B(),gt(G(e),i)})),bi(this._navigator.stateService.reference$)).subscribe((([[t,e],i])=>{this._scene.hasCluster(e.id,t)||this._scene.addCluster(e,this._computeTranslation(e,i),t)}))),t.push(this._configuration$.pipe(rt((t=>(t.cameraSize=this._spatial.clamp(t.cameraSize,.01,1),t.pointSize=this._spatial.clamp(t.pointSize,.01,1),{cameraSize:t.cameraSize,cameraVisualizationMode:t.cameraVisualizationMode,cellsVisible:t.cellsVisible,originalPositionMode:t.originalPositionMode,pointSize:t.pointSize,pointsVisible:t.pointsVisible}))),ue(((t,e)=>t.cameraSize===e.cameraSize&&t.cameraVisualizationMode===e.cameraVisualizationMode&&t.cellsVisible===e.cellsVisible&&t.originalPositionMode===e.originalPositionMode&&t.pointSize===e.pointSize&&t.pointsVisible===e.pointsVisible))).subscribe((t=>{this._scene.setCameraSize(t.cameraSize),this._scene.setPointSize(t.pointSize),this._scene.setPointVisibility(t.pointsVisible),this._scene.setCellVisibility(t.cellsVisible);const e=t.cameraVisualizationMode;this._scene.setCameraVisualizationMode(e);const i=t.originalPositionMode;this._scene.setPositionMode(i)}))),t.push(gt(i,n).subscribe((([t,e])=>{const i=vg(t,e,this._navigator.api.data.geometry);this._scene.uncache(i),this._cache.uncache(i)}))),t.push(this._navigator.playService.playing$.pipe(ri((t=>t?B():this._container.mouseService.dblClick$)),bi(this._container.renderService.renderCamera$),ri((([t,e])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(t,i),s=this._viewportCoords.canvasToViewport(n,r,i),o=this._scene.intersection.intersectObjects(s,e.perspective);return o?this._navigator.moveTo$(o).pipe(te((()=>B()))):B()}))).subscribe());const a=gt(this._configuration$,this._navigator.stateService.state$).pipe(rt((([t,e])=>(t.cameraSize=this._spatial.clamp(t.cameraSize,.01,1),{size:t.cameraSize,visible:mg(t.cameraVisualizationMode),state:e}))),ue(((t,e)=>t.size===e.size&&t.visible===e.visible&&t.state===e.state))),c=this._container.mouseService.mouseMove$.pipe(Ue(1),E());t.push(c.subscribe());const h=Ot(this._container.mouseService.mouseEnter$,this._container.mouseService.mouseLeave$,this._container.mouseService.windowBlur$);t.push(gt(this._navigator.playService.playing$,h,s,this._navigator.graphService.filter$).pipe(ri((([t,e])=>t||"pointerenter"!==e.type?gt(G(e),G(null),G(null)):gt(At(c.pipe(ve(1)),this._container.mouseService.mouseMove$),this._container.renderService.renderCamera$,a)))).subscribe((([t,e])=>{if("pointermove"!==t.type)return void this._scene.setHoveredImage(null);const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(t,i),s=this._viewportCoords.canvasToViewport(n,r,i),o=this._scene.intersection.intersectObjects(s,e.perspective);this._scene.setHoveredImage(o)}))),t.push(this._navigator.stateService.currentId$.subscribe((t=>{this._scene.setSelectedImage(t)}))),t.push(this._navigator.stateService.currentState$.pipe(rt((t=>{const e=this._scene;return{name:this._name,renderer:{frameId:t.id,needsRender:e.needsRender,render:e.render.bind(e),pass:rm.Opaque}}}))).subscribe(this._container.glRenderer.render$));const l=this._navigator.graphService.dataAdded$.pipe(Nt((t=>this._cache.hasCell(t))),Mt((t=>this._cache.updateCell$(t).pipe(rt((e=>({id:t,images:e}))),bi(this._navigator.stateService.reference$)))),He(),E());t.push(l.subscribe((([t,e])=>{this._addSceneImages(t,e)}))),t.push(l.pipe(ne((([t])=>{const e=t.id,i=this._cache;let n;return n=i.hasClusters(e)?i.updateClusters$(e):i.isCachingClusters(e)?this._cache.cacheClusters$(e).pipe(Re(null,{}),ri((()=>bt(i.updateClusters$(e))))):B(),gt(G(e),n)})),bi(this._navigator.stateService.reference$)).subscribe((([[t,e],i])=>{this._scene.hasCluster(e.id,t)||this._scene.addCluster(e,this._computeTranslation(e,i),t)})))}_deactivate(){this._subscriptions.unsubscribe(),this._cache.uncache(),this._scene.deactivate(),this._navigator.cacheService.configure()}_getDefaultConfiguration(){return{cameraSize:.1,cameraVisualizationMode:t.CameraVisualizationMode.Homogeneous,cellGridDepth:1,originalPositionMode:t.OriginalPositionMode.Hidden,pointSize:.1,pointsVisible:!0,cellsVisible:!1}}_addSceneImages(t,e){const i=t.id,n=t.images;for(const t of n)this._scene.hasImage(t.id,i)||this._scene.addImage(t,this._createTransform(t,e),this._computeOriginalPosition(t,e),i)}_cellsInFov(t,e,i){const n=this._spatial,r=this._navigator.api.data.geometry,s=r.lngLatToCellId(t.originalLngLat),o=[s],a=i/2,c=r.getAdjacent(s);for(const i of c){const s=r.getVertices(i);for(const r of s){const[s,c]=Ju(r.lng,r.lat,0,t.lngLat.lng,t.lngLat.lat,0),h=Math.atan2(c,s),l=n.radToDeg(n.azimuthalToBearing(h));Math.abs(l-e)<a&&o.push(i)}}return o}_computeOriginalPosition(t,e){return Ju(t.originalLngLat.lng,t.originalLngLat.lat,null!=t.originalAltitude?t.originalAltitude:t.computedAltitude,e.lng,e.lat,e.alt)}_cellToTopocentric(t,e){return this._navigator.api.data.geometry.getVertices(t).map((t=>Ju(t.lng,t.lat,-2,e.lng,e.lat,e.alt)))}_computeTranslation(t,e){return Ju(t.reference.lng,t.reference.lat,t.reference.alt,e.lng,e.lat,e.alt)}_createTransform(t,e){const i=fd({alt:t.computedAltitude,lat:t.lngLat.lat,lng:t.lngLat.lng},t.rotation,e);return new Hd(t.exifOrientation,t.width,t.height,t.scale,t.rotation,i,void 0,void 0,t.cameraParameters,t.cameraType)}}bg.componentName="spatial";class xg{constructor(){this._notifyChanged$=new T}get changed$(){return this._notifyChanged$}}class wg extends cd{constructor(t){super(null!=t?t:"The provided geometry value is incorrect"),Object.setPrototypeOf(this,wg.prototype),this.name="GeometryTagError"}}class Sg extends xg{constructor(t){super();if(t.length<2)throw new wg("A points geometry must have two or more positions.");this._points=[];for(const e of t){if(e[0]<0||e[0]>1||e[1]<0||e[1]>1)throw new wg("Basic coordinates of points must be on the interval [0, 1].");this._points.push(e.slice())}}get points(){return this._points}addPoint2d(t){const e=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];this._points.push(e),this._notifyChanged$.next(this)}getPoint2d(t){return this._points[t].slice()}removePoint2d(t){if(t<0||t>=this._points.length||this._points.length<3)throw new wg("Index for removed point must be valid.");this._points.splice(t,1),this._notifyChanged$.next(this)}setVertex2d(t,e,i){this.setPoint2d(t,e,i)}setPoint2d(t,e,i){const n=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._points[t]=n,this._notifyChanged$.next(this)}getPoints3d(t){return this._getPoints3d(this._points,t)}getPoint3d(t,e){return e.unprojectBasic(this._points[t],200)}getPoints2d(){return this._points.slice()}getCentroid2d(t){if(!t)throw new wg("Get centroid must be called with a transform for points geometries.");const[e,i,n,r]=this.getRect2d(t);return[e<n?(e+n)/2:(e+n+1)/2%1,(i+r)/2]}getCentroid3d(t){let e=this.getCentroid2d();return t.unprojectBasic(e,200)}getRect2d(t){let e=1,i=0,n=1,r=0;const s=this._points;for(const t of s)t[0]<e&&(e=t[0]),t[0]>i&&(i=t[0]),t[1]<n&&(n=t[1]),t[1]>r&&(r=t[1]);if(dd(t.cameraType)){const t=[];for(let e=0;e<s.length;e++)t[e]=e;t.sort(((t,e)=>s[t][0]<s[e][0]?-1:s[t][0]>s[e][0]?1:t<e?-1:1));let n=s[t[0]][0]+1-s[t[t.length-1]][0],r=0;for(let e=0;e<t.length-1;e++){const i=t[e],o=t[e+1],a=s[o][0]-s[i][0];a>n&&(n=a,r=e+1)}r>0&&(e=s[t[r]][0],i=s[t[r-1]][0])}return[e,n,i,r]}setCentroid2d(t,e){throw new Error("Not implemented")}_getPoints3d(t,e){return t.map((t=>e.unprojectBasic(t,200)))}}class Mg{constructor(t,e,i){this._geometry=t,this._transform=e,this._viewportCoords=i||new Wf,this._aborted$=new T,this._created$=new T,this._glObjectsChanged$=new T,this._geometryChangedSubscription=this._geometry.changed$.subscribe((()=>{this._onGeometryChanged(),this._glObjectsChanged$.next(this)}))}get geometry(){return this._geometry}get glObjects(){return this._glObjects}get aborted$(){return this._aborted$}get created$(){return this._created$}get glObjectsChanged$(){return this._glObjectsChanged$}get geometryChanged$(){return this._geometry.changed$.pipe(rt((()=>this)))}dispose(){this._geometryChangedSubscription.unsubscribe()}_canvasToTransform(t){return`translate(-50%,-50%) translate(${Math.round(t[0])}px,${Math.round(t[1])}px)`}_colorToBackground(t){return"#"+("000000"+t.toString(16)).substr(-6)}_createOutine(t,e){const i=this._getLinePositions(t),n=new hs;n.setAttribute("position",new Hr(i,3));return new Uc(n,new kc({color:e,linewidth:1}))}_disposeLine(t){null!=t&&(t.geometry.dispose(),t.material.dispose())}_getLinePositions(t){const e=t.length,i=new Float32Array(3*e);for(let n=0;n<e;++n){const e=3*n,r=t[n];i[e]=r[0],i[e+1]=r[1],i[e+2]=r[2]}return i}}var Tg=Eg,Cg=Eg;function Eg(t,e,i){i=i||2;var n,r,s,o,a,c,h,l=e&&e.length,u=l?e[0]*i:t.length,d=Ig(t,0,u,i,!0),p=[];if(!d||d.next===d.prev)return p;if(l&&(d=function(t,e,i,n){var r,s,o,a=[];for(r=0,s=e.length;r<s;r++)(o=Ig(t,e[r]*n,r<s-1?e[r+1]*n:t.length,n,!1))===o.next&&(o.steiner=!0),a.push(Fg(o));for(a.sort(Dg),r=0;r<a.length;r++)$g(a[r],i),i=Ag(i,i.next);return i}(t,e,d,i)),t.length>80*i){n=s=t[0],r=o=t[1];for(var f=i;f<u;f+=i)(a=t[f])<n&&(n=a),(c=t[f+1])<r&&(r=c),a>s&&(s=a),c>o&&(o=c);h=0!==(h=Math.max(s-n,o-r))?1/h:0}return Pg(d,p,i,n,r,h),p}function Ig(t,e,i,n,r){var s,o;if(r===Kg(t,e,i,n)>0)for(s=e;s<i;s+=n)o=Yg(s,t[s],t[s+1],o);else for(s=i-n;s>=e;s-=n)o=Yg(s,t[s],t[s+1],o);return o&&Ug(o,o.next)&&(Zg(o),o=o.next),o}function Ag(t,e){if(!t)return t;e||(e=t);var i,n=t;do{if(i=!1,n.steiner||!Ug(n,n.next)&&0!==Hg(n.prev,n,n.next))n=n.next;else{if(Zg(n),(n=e=n.prev)===n.next)break;i=!0}}while(i||n!==e);return e}function Pg(t,e,i,n,r,s,o){if(t){!o&&s&&function(t,e,i,n){var r=t;do{null===r.z&&(r.z=zg(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){var e,i,n,r,s,o,a,c,h=1;do{for(i=t,t=null,s=null,o=0;i;){for(o++,n=i,a=0,e=0;e<h&&(a++,n=n.nextZ);e++);for(c=h;a>0||c>0&&n;)0!==a&&(0===c||!n||i.z<=n.z)?(r=i,i=i.nextZ,a--):(r=n,n=n.nextZ,c--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,h*=2}while(o>1)}(r)}(t,n,r,s);for(var a,c,h=t;t.prev!==t.next;)if(a=t.prev,c=t.next,s?Lg(t,n,r,s):Rg(t))e.push(a.i/i),e.push(t.i/i),e.push(c.i/i),Zg(t),t=c.next,h=c.next;else if((t=c)===h){o?1===o?Pg(t=Og(Ag(t),e,i),e,i,n,r,s,2):2===o&&Ng(t,e,i,n,r,s):Pg(Ag(t),e,i,n,r,s,1);break}}}function Rg(t){var e=t.prev,i=t,n=t.next;if(Hg(e,i,n)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(Bg(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&Hg(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Lg(t,e,i,n){var r=t.prev,s=t,o=t.next;if(Hg(r,s,o)>=0)return!1;for(var a=r.x<s.x?r.x<o.x?r.x:o.x:s.x<o.x?s.x:o.x,c=r.y<s.y?r.y<o.y?r.y:o.y:s.y<o.y?s.y:o.y,h=r.x>s.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,l=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,u=zg(a,c,e,i,n),d=zg(h,l,e,i,n),p=t.prevZ,f=t.nextZ;p&&p.z>=u&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Bg(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&Hg(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Bg(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&Hg(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&Bg(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&Hg(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Bg(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&Hg(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function Og(t,e,i){var n=t;do{var r=n.prev,s=n.next.next;!Ug(r,s)&&Vg(r,n,n.next,s)&&Wg(r,s)&&Wg(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),Zg(n),Zg(n.next),n=t=s),n=n.next}while(n!==t);return Ag(n)}function Ng(t,e,i,n,r,s){var o=t;do{for(var a=o.next.next;a!==o.prev;){if(o.i!==a.i&&jg(o,a)){var c=Xg(o,a);return o=Ag(o,o.next),c=Ag(c,c.next),Pg(o,e,i,n,r,s),void Pg(c,e,i,n,r,s)}a=a.next}o=o.next}while(o!==t)}function Dg(t,e){return t.x-e.x}function $g(t,e){if(e=function(t,e){var i,n=e,r=t.x,s=t.y,o=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var a=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=r&&a>o){if(o=a,a===r){if(s===n.y)return n;if(s===n.next.y)return n.next}i=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!i)return null;if(r===o)return i;var c,h=i,l=i.x,u=i.y,d=1/0;n=i;do{r>=n.x&&n.x>=l&&r!==n.x&&Bg(s<u?r:o,s,l,u,s<u?o:r,s,n.x,n.y)&&(c=Math.abs(s-n.y)/(r-n.x),Wg(n,t)&&(c<d||c===d&&(n.x>i.x||n.x===i.x&&kg(i,n)))&&(i=n,d=c)),n=n.next}while(n!==h);return i}(t,e)){var i=Xg(e,t);Ag(e,e.next),Ag(i,i.next)}}function kg(t,e){return Hg(t.prev,t,e.prev)<0&&Hg(e.next,t,t.next)<0}function zg(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Fg(t){var e=t,i=t;do{(e.x<i.x||e.x===i.x&&e.y<i.y)&&(i=e),e=e.next}while(e!==t);return i}function Bg(t,e,i,n,r,s,o,a){return(r-o)*(e-a)-(t-o)*(s-a)>=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(s-a)-(r-o)*(n-a)>=0}function jg(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Vg(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(Wg(t,e)&&Wg(e,t)&&function(t,e){var i=t,n=!1,r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(Hg(t.prev,t,e.prev)||Hg(t,e.prev,e))||Ug(t,e)&&Hg(t.prev,t,t.next)>0&&Hg(e.prev,e,e.next)>0)}function Hg(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Ug(t,e){return t.x===e.x&&t.y===e.y}function Vg(t,e,i,n){var r=qg(Hg(t,e,i)),s=qg(Hg(t,e,n)),o=qg(Hg(i,n,t)),a=qg(Hg(i,n,e));return r!==s&&o!==a||(!(0!==r||!Gg(t,i,e))||(!(0!==s||!Gg(t,n,e))||(!(0!==o||!Gg(i,t,n))||!(0!==a||!Gg(i,e,n)))))}function Gg(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function qg(t){return t>0?1:t<0?-1:0}function Wg(t,e){return Hg(t.prev,t,t.next)<0?Hg(t,e,t.next)>=0&&Hg(t,t.prev,e)>=0:Hg(t,e,t.prev)<0||Hg(t,t.next,e)<0}function Xg(t,e){var i=new Jg(t.i,t.x,t.y),n=new Jg(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Yg(t,e,i,n){var r=new Jg(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Zg(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Jg(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Kg(t,e,i,n){for(var r=0,s=e,o=i-n;s<i;s+=n)r+=(t[o]-t[s])*(t[s+1]+t[o+1]),o=s;return r}Eg.deviation=function(t,e,i,n){var r=e&&e.length,s=r?e[0]*i:t.length,o=Math.abs(Kg(t,0,s,i));if(r)for(var a=0,c=e.length;a<c;a++){var h=e[a]*i,l=a<c-1?e[a+1]*i:t.length;o-=Math.abs(Kg(t,h,l,i))}var u=0;for(a=0;a<n.length;a+=3){var d=n[a]*i,p=n[a+1]*i,f=n[a+2]*i;u+=Math.abs((t[d]-t[f])*(t[p+1]-t[d+1])-(t[d]-t[p])*(t[f+1]-t[d+1]))}return 0===o&&0===u?0:Math.abs((u-o)/o)},Eg.flatten=function(t){for(var e=t[0][0].length,i={vertices:[],holes:[],dimensions:e},n=0,r=0;r<t.length;r++){for(var s=0;s<t[r].length;s++)for(var o=0;o<e;o++)i.vertices.push(t[r][s][o]);r>0&&(n+=t[r-1].length,i.holes.push(n))}return i},Tg.default=Cg;function Qg(t,e){return t<e?-1:t>e?1:0}var t_=xp(Object.freeze({__proto__:null,default:class{constructor(t=[],e=Qg){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:i}=this,n=e[t];for(;t>0;){const r=t-1>>1,s=e[r];if(i(n,s)>=0)break;e[t]=s,t=r}e[t]=n}_down(t){const{data:e,compare:i}=this,n=this.length>>1,r=e[t];for(;t<n;){let n=1+(t<<1),s=e[n];const o=n+1;if(o<this.length&&i(e[o],s)<0&&(n=o,s=e[o]),i(s,r)>=0)break;e[t]=s,t=n}e[t]=r}}}));t_.default&&(t_=t_.default);var e_=n_,i_=n_;function n_(t,e,i){var n,r,s,o;e=e||1;for(var a=0;a<t[0].length;a++){var c=t[0][a];(!a||c[0]<n)&&(n=c[0]),(!a||c[1]<r)&&(r=c[1]),(!a||c[0]>s)&&(s=c[0]),(!a||c[1]>o)&&(o=c[1])}var h=s-n,l=o-r,u=Math.min(h,l),d=u/2;if(0===u){var p=[n,r];return p.distance=0,p}for(var f=new t_(void 0,r_),m=n;m<s;m+=u)for(var g=r;g<o;g+=u)f.push(new s_(m+d,g+d,d,t));var _=function(t){for(var e=0,i=0,n=0,r=t[0],s=0,o=r.length,a=o-1;s<o;a=s++){var c=r[s],h=r[a],l=c[0]*h[1]-h[0]*c[1];i+=(c[0]+h[0])*l,n+=(c[1]+h[1])*l,e+=3*l}return 0===e?new s_(r[0][0],r[0][1],0,t):new s_(i/e,n/e,0,t)}(t),v=new s_(n+h/2,r+l/2,0,t);v.d>_.d&&(_=v);for(var y=f.length;f.length;){var b=f.pop();b.d>_.d&&(_=b,i&&console.log("found best %d after %d probes",Math.round(1e4*b.d)/1e4,y)),b.max-_.d<=e||(d=b.h/2,f.push(new s_(b.x-d,b.y-d,d,t)),f.push(new s_(b.x+d,b.y-d,d,t)),f.push(new s_(b.x-d,b.y+d,d,t)),f.push(new s_(b.x+d,b.y+d,d,t)),y+=4)}i&&(console.log("num probes: "+y),console.log("best distance: "+_.d));var x=[_.x,_.y];return x.distance=_.d,x}function r_(t,e){return e.max-t.max}function s_(t,e,i,n){this.x=t,this.y=e,this.h=i,this.d=function(t,e,i){for(var n=!1,r=1/0,s=0;s<i.length;s++)for(var o=i[s],a=0,c=o.length,h=c-1;a<c;h=a++){var l=o[a],u=o[h];l[1]>e!=u[1]>e&&t<(u[0]-l[0])*(e-l[1])/(u[1]-l[1])+l[0]&&(n=!n),r=Math.min(r,o_(t,e,l,u))}return 0===r?0:(n?1:-1)*Math.sqrt(r)}(t,e,n),this.max=this.d+this.h*Math.SQRT2}function o_(t,e,i,n){var r=i[0],s=i[1],o=n[0]-r,a=n[1]-s;if(0!==o||0!==a){var c=((t-r)*o+(e-s)*a)/(o*o+a*a);c>1?(r=n[0],s=n[1]):c>0&&(r+=o*c,s+=a*c)}return(o=t-r)*o+(a=e-s)*a}function a_(t,e){return t>e?1:t<e?-1:0}e_.default=i_;class c_{constructor(t=a_,e=!1){this._compare=t,this._root=null,this._size=0,this._noDuplicates=!!e}rotateLeft(t){var e=t.right;e&&(t.right=e.left,e.left&&(e.left.parent=t),e.parent=t.parent),t.parent?t===t.parent.left?t.parent.left=e:t.parent.right=e:this._root=e,e&&(e.left=t),t.parent=e}rotateRight(t){var e=t.left;e&&(t.left=e.right,e.right&&(e.right.parent=t),e.parent=t.parent),t.parent?t===t.parent.left?t.parent.left=e:t.parent.right=e:this._root=e,e&&(e.right=t),t.parent=e}_splay(t){for(;t.parent;){var e=t.parent;e.parent?e.left===t&&e.parent.left===e?(this.rotateRight(e.parent),this.rotateRight(e)):e.right===t&&e.parent.right===e?(this.rotateLeft(e.parent),this.rotateLeft(e)):e.left===t&&e.parent.right===e?(this.rotateRight(e),this.rotateLeft(e)):(this.rotateLeft(e),this.rotateRight(e)):e.left===t?this.rotateRight(e):this.rotateLeft(e)}}splay(t){for(var e,i,n,r,s;t.parent;)(i=(e=t.parent).parent)&&i.parent?((n=i.parent).left===i?n.left=t:n.right=t,t.parent=n):(t.parent=null,this._root=t),r=t.left,s=t.right,t===e.left?(i&&(i.left===e?(e.right?(i.left=e.right,i.left.parent=i):i.left=null,e.right=i,i.parent=e):(r?(i.right=r,r.parent=i):i.right=null,t.left=i,i.parent=t)),s?(e.left=s,s.parent=e):e.left=null,t.right=e,e.parent=t):(i&&(i.right===e?(e.left?(i.right=e.left,i.right.parent=i):i.right=null,e.left=i,i.parent=e):(s?(i.left=s,s.parent=i):i.left=null,t.right=i,i.parent=t)),r?(e.right=r,r.parent=e):e.right=null,t.left=e,e.parent=t)}replace(t,e){t.parent?t===t.parent.left?t.parent.left=e:t.parent.right=e:this._root=e,e&&(e.parent=t.parent)}minNode(t=this._root){if(t)for(;t.left;)t=t.left;return t}maxNode(t=this._root){if(t)for(;t.right;)t=t.right;return t}insert(t,e){var i=this._root,n=null,r=this._compare;if(this._noDuplicates)for(;i;){if(n=i,0===r(i.key,t))return;i=r(i.key,t)<0?i.right:i.left}else for(;i;)n=i,i=r(i.key,t)<0?i.right:i.left;return i={key:t,data:e,left:null,right:null,parent:n},n?r(n.key,i.key)<0?n.right=i:n.left=i:this._root=i,this.splay(i),this._size++,i}find(t){for(var e=this._root,i=this._compare;e;){var n=i(e.key,t);if(n<0)e=e.right;else{if(!(n>0))return e;e=e.left}}return null}contains(t){for(var e=this._root,i=this._compare;e;){var n=i(t,e.key);if(0===n)return!0;e=n<0?e.left:e.right}return!1}remove(t){var e=this.find(t);if(!e)return!1;if(this.splay(e),e.left)if(e.right){var i=this.minNode(e.right);i.parent!==e&&(this.replace(i,i.right),i.right=e.right,i.right.parent=i),this.replace(e,i),i.left=e.left,i.left.parent=i}else this.replace(e,e.left);else this.replace(e,e.right);return this._size--,!0}removeNode(t){if(!t)return!1;if(this.splay(t),t.left)if(t.right){var e=this.minNode(t.right);e.parent!==t&&(this.replace(e,e.right),e.right=t.right,e.right.parent=e),this.replace(t,e),e.left=t.left,e.left.parent=e}else this.replace(t,t.left);else this.replace(t,t.right);return this._size--,!0}erase(t){var e=this.find(t);if(e){this.splay(e);var i=e.left,n=e.right,r=null;i&&(i.parent=null,r=this.maxNode(i),this.splay(r),this._root=r),n&&(i?r.right=n:this._root=n,n.parent=r),this._size--}}pop(){var t=this._root,e=null;if(t){for(;t.left;)t=t.left;e={key:t.key,data:t.data},this.remove(t.key)}return e}next(t){var e=t;if(e)if(e.right)for(e=e.right;e&&e.left;)e=e.left;else for(e=t.parent;e&&e.right===t;)t=e,e=e.parent;return e}prev(t){var e=t;if(e)if(e.left)for(e=e.left;e&&e.right;)e=e.right;else for(e=t.parent;e&&e.left===t;)t=e,e=e.parent;return e}forEach(t){for(var e=this._root,i=[],n=!1,r=0;!n;)e?(i.push(e),e=e.left):i.length>0?(t(e=i.pop(),r++),e=e.right):n=!0;return this}range(t,e,i,n){const r=[],s=this._compare;let o,a=this._root;for(;0!==r.length||a;)if(a)r.push(a),a=a.left;else{if(a=r.pop(),o=s(a.key,e),o>0)break;if(s(a.key,t)>=0&&i.call(n,a))return this;a=a.right}return this}keys(){for(var t=this._root,e=[],i=[],n=!1;!n;)t?(e.push(t),t=t.left):e.length>0?(t=e.pop(),i.push(t.key),t=t.right):n=!0;return i}values(){for(var t=this._root,e=[],i=[],n=!1;!n;)t?(e.push(t),t=t.left):e.length>0?(t=e.pop(),i.push(t.data),t=t.right):n=!0;return i}at(t){for(var e=this._root,i=[],n=!1,r=0;!n;)if(e)i.push(e),e=e.left;else if(i.length>0){if(e=i.pop(),r===t)return e;r++,e=e.right}else n=!0;return null}load(t=[],e=[],i=!1){if(0!==this._size)throw new Error("bulk-load: tree is not empty");const n=t.length;return i&&l_(t,e,0,n-1,this._compare),this._root=h_(null,t,e,0,n),this._size=n,this}min(){var t=this.minNode(this._root);return t?t.key:null}max(){var t=this.maxNode(this._root);return t?t.key:null}isEmpty(){return null===this._root}get size(){return this._size}static createTree(t,e,i,n,r){return new c_(i,r).load(t,e,n)}}function h_(t,e,i,n,r){const s=r-n;if(s>0){const o=n+Math.floor(s/2),a={key:e[o],data:i[o],parent:t};return a.left=h_(a,e,i,n,o),a.right=h_(a,e,i,o+1,r),a}return null}function l_(t,e,i,n,r){if(i>=n)return;const s=t[i+n>>1];let o=i-1,a=n+1;for(;;){do{o++}while(r(t[o],s)<0);do{a--}while(r(t[a],s)>0);if(o>=a)break;let i=t[o];t[o]=t[a],t[a]=i,i=e[o],e[o]=e[a],e[a]=i}l_(t,e,i,a,r),l_(t,e,a+1,n,r)}function u_(t,e,i){null===e?(t.inOut=!1,t.otherInOut=!0):(t.isSubject===e.isSubject?(t.inOut=!e.inOut,t.otherInOut=e.otherInOut):(t.inOut=!e.otherInOut,t.otherInOut=e.isVertical()?!e.inOut:e.inOut),e&&(t.prevInResult=!d_(e,i)||e.isVertical()?e.prevInResult:e));let n=d_(t,i);t.resultTransition=n?function(t,e){let i,n=!t.inOut,r=!t.otherInOut;switch(e){case 0:i=n&&r;break;case 1:i=n||r;break;case 3:i=n^r;break;case 2:i=t.isSubject?n&&!r:r&&!n}return i?1:-1}(t,i):0}function d_(t,e){switch(t.type){case 0:switch(e){case 0:return!t.otherInOut;case 1:return t.otherInOut;case 2:return t.isSubject&&t.otherInOut||!t.isSubject&&!t.otherInOut;case 3:return!0}break;case 2:return 0===e||1===e;case 3:return 2===e;case 1:return!1}return!1}class p_{constructor(t,e,i,n,r){this.left=e,this.point=t,this.otherEvent=i,this.isSubject=n,this.type=r||0,this.inOut=!1,this.otherInOut=!1,this.prevInResult=null,this.resultTransition=0,this.otherPos=-1,this.outputContourId=-1,this.isExteriorRing=!0}isBelow(t){const e=this.point,i=this.otherEvent.point;return this.left?(e[0]-t[0])*(i[1]-t[1])-(i[0]-t[0])*(e[1]-t[1])>0:(i[0]-t[0])*(e[1]-t[1])-(e[0]-t[0])*(i[1]-t[1])>0}isAbove(t){return!this.isBelow(t)}isVertical(){return this.point[0]===this.otherEvent.point[0]}get inResult(){return 0!==this.resultTransition}clone(){const t=new p_(this.point,this.left,this.otherEvent,this.isSubject,this.type);return t.contourId=this.contourId,t.resultTransition=this.resultTransition,t.prevInResult=this.prevInResult,t.isExteriorRing=this.isExteriorRing,t.inOut=this.inOut,t.otherInOut=this.otherInOut,t}}function f_(t,e){return t[0]===e[0]&&t[1]===e[1]}const m_=134217729;function g_(t,e,i,n,r){let s,o,a,c,h=e[0],l=n[0],u=0,d=0;l>h==l>-h?(s=h,h=e[++u]):(s=l,l=n[++d]);let p=0;if(u<t&&d<i)for(l>h==l>-h?(o=h+s,a=s-(o-h),h=e[++u]):(o=l+s,a=s-(o-l),l=n[++d]),s=o,0!==a&&(r[p++]=a);u<t&&d<i;)l>h==l>-h?(o=s+h,c=o-s,a=s-(o-c)+(h-c),h=e[++u]):(o=s+l,c=o-s,a=s-(o-c)+(l-c),l=n[++d]),s=o,0!==a&&(r[p++]=a);for(;u<t;)o=s+h,c=o-s,a=s-(o-c)+(h-c),h=e[++u],s=o,0!==a&&(r[p++]=a);for(;d<i;)o=s+l,c=o-s,a=s-(o-c)+(l-c),l=n[++d],s=o,0!==a&&(r[p++]=a);return 0===s&&0!==p||(r[p++]=s),p}function __(t){return new Float64Array(t)}const v_=__(4),y_=__(8),b_=__(12),x_=__(16),w_=__(4);function S_(t,e,i,n,r,s){const o=(e-s)*(i-r),a=(t-r)*(n-s),c=o-a;if(0===o||0===a||o>0!=a>0)return c;const h=Math.abs(o+a);return Math.abs(c)>=33306690738754716e-32*h?c:-function(t,e,i,n,r,s,o){let a,c,h,l,u,d,p,f,m,g,_,v,y,b,x,w,S,M;const T=t-r,C=i-r,E=e-s,I=n-s;b=T*I,d=m_*T,p=d-(d-T),f=T-p,d=m_*I,m=d-(d-I),g=I-m,x=f*g-(b-p*m-f*m-p*g),w=E*C,d=m_*E,p=d-(d-E),f=E-p,d=m_*C,m=d-(d-C),g=C-m,S=f*g-(w-p*m-f*m-p*g),_=x-S,u=x-_,v_[0]=x-(_+u)+(u-S),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,v_[1]=y-(_+u)+(u-w),M=v+_,u=M-v,v_[2]=v-(M-u)+(_-u),v_[3]=M;let A=function(t,e){let i=e[0];for(let n=1;n<t;n++)i+=e[n];return i}(4,v_),P=22204460492503146e-32*o;if(A>=P||-A>=P)return A;if(u=t-T,a=t-(T+u)+(u-r),u=i-C,h=i-(C+u)+(u-r),u=e-E,c=e-(E+u)+(u-s),u=n-I,l=n-(I+u)+(u-s),0===a&&0===c&&0===h&&0===l)return A;if(P=11093356479670487e-47*o+33306690738754706e-32*Math.abs(A),A+=T*l+I*a-(E*h+C*c),A>=P||-A>=P)return A;b=a*I,d=m_*a,p=d-(d-a),f=a-p,d=m_*I,m=d-(d-I),g=I-m,x=f*g-(b-p*m-f*m-p*g),w=c*C,d=m_*c,p=d-(d-c),f=c-p,d=m_*C,m=d-(d-C),g=C-m,S=f*g-(w-p*m-f*m-p*g),_=x-S,u=x-_,w_[0]=x-(_+u)+(u-S),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,w_[1]=y-(_+u)+(u-w),M=v+_,u=M-v,w_[2]=v-(M-u)+(_-u),w_[3]=M;const R=g_(4,v_,4,w_,y_);b=T*l,d=m_*T,p=d-(d-T),f=T-p,d=m_*l,m=d-(d-l),g=l-m,x=f*g-(b-p*m-f*m-p*g),w=E*h,d=m_*E,p=d-(d-E),f=E-p,d=m_*h,m=d-(d-h),g=h-m,S=f*g-(w-p*m-f*m-p*g),_=x-S,u=x-_,w_[0]=x-(_+u)+(u-S),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,w_[1]=y-(_+u)+(u-w),M=v+_,u=M-v,w_[2]=v-(M-u)+(_-u),w_[3]=M;const L=g_(R,y_,4,w_,b_);b=a*l,d=m_*a,p=d-(d-a),f=a-p,d=m_*l,m=d-(d-l),g=l-m,x=f*g-(b-p*m-f*m-p*g),w=c*h,d=m_*c,p=d-(d-c),f=c-p,d=m_*h,m=d-(d-h),g=h-m,S=f*g-(w-p*m-f*m-p*g),_=x-S,u=x-_,w_[0]=x-(_+u)+(u-S),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,w_[1]=y-(_+u)+(u-w),M=v+_,u=M-v,w_[2]=v-(M-u)+(_-u),w_[3]=M;const O=g_(L,b_,4,w_,x_);return x_[O-1]}(t,e,i,n,r,s,h)}function M_(t,e,i){const n=S_(t[0],t[1],e[0],e[1],i[0],i[1]);return n>0?-1:n<0?1:0}function T_(t,e){const i=t.point,n=e.point;return i[0]>n[0]?1:i[0]<n[0]?-1:i[1]!==n[1]?i[1]>n[1]?1:-1:function(t,e,i,n){if(t.left!==e.left)return t.left?1:-1;if(0!==M_(i,t.otherEvent.point,e.otherEvent.point))return t.isBelow(e.otherEvent.point)?-1:1;return!t.isSubject&&e.isSubject?1:-1}(t,e,i)}function C_(t,e,i){const n=new p_(e,!1,t,t.isSubject),r=new p_(e,!0,t.otherEvent,t.isSubject);return f_(t.point,t.otherEvent.point)&&console.warn("what is that, a collapsed segment?",t),n.contourId=r.contourId=t.contourId,T_(r,t.otherEvent)>0&&(t.otherEvent.left=!0,r.left=!1),t.otherEvent.otherEvent=r,t.otherEvent=n,i.push(r),i.push(n),i}function E_(t,e){return t[0]*e[1]-t[1]*e[0]}function I_(t,e){return t[0]*e[0]+t[1]*e[1]}function A_(t,e,i){const n=function(t,e,i,n,r){const s=[e[0]-t[0],e[1]-t[1]],o=[n[0]-i[0],n[1]-i[1]];function a(t,e,i){return[t[0]+e*i[0],t[1]+e*i[1]]}const c=[i[0]-t[0],i[1]-t[1]];let h=E_(s,o),l=h*h;const u=I_(s,s);if(l>0){const e=E_(c,o)/h;if(e<0||e>1)return null;const n=E_(c,s)/h;return n<0||n>1?null:0===e||1===e?r?null:[a(t,e,s)]:0===n||1===n?r?null:[a(i,n,o)]:[a(t,e,s)]}if(h=E_(c,s),l=h*h,l>0)return null;const d=I_(s,c)/u,p=d+I_(s,o)/u,f=Math.min(d,p),m=Math.max(d,p);return f<=1&&m>=0?1===f?r?null:[a(t,f>0?f:0,s)]:0===m?r?null:[a(t,m<1?m:1,s)]:r&&0===f&&1===m?null:[a(t,f>0?f:0,s),a(t,m<1?m:1,s)]:null}(t.point,t.otherEvent.point,e.point,e.otherEvent.point),r=n?n.length:0;if(0===r)return 0;if(1===r&&(f_(t.point,e.point)||f_(t.otherEvent.point,e.otherEvent.point)))return 0;if(2===r&&t.isSubject===e.isSubject)return 0;if(1===r)return f_(t.point,n[0])||f_(t.otherEvent.point,n[0])||C_(t,n[0],i),f_(e.point,n[0])||f_(e.otherEvent.point,n[0])||C_(e,n[0],i),1;const s=[];let o=!1,a=!1;return f_(t.point,e.point)?o=!0:1===T_(t,e)?s.push(e,t):s.push(t,e),f_(t.otherEvent.point,e.otherEvent.point)?a=!0:1===T_(t.otherEvent,e.otherEvent)?s.push(e.otherEvent,t.otherEvent):s.push(t.otherEvent,e.otherEvent),o&&a||o?(e.type=1,t.type=e.inOut===t.inOut?2:3,o&&!a&&C_(s[1].otherEvent,s[0].point,i),2):a?(C_(s[0],s[1].point,i),3):s[0]!==s[3].otherEvent?(C_(s[0],s[1].point,i),C_(s[1],s[2].point,i),3):(C_(s[0],s[1].point,i),C_(s[3].otherEvent,s[2].point,i),3)}function P_(t,e){if(t===e)return 0;if(0!==M_(t.point,t.otherEvent.point,e.point)||0!==M_(t.point,t.otherEvent.point,e.otherEvent.point))return f_(t.point,e.point)?t.isBelow(e.otherEvent.point)?-1:1:t.point[0]===e.point[0]?t.point[1]<e.point[1]?-1:1:1===T_(t,e)?e.isAbove(t.point)?-1:1:t.isBelow(e.point)?-1:1;if(t.isSubject!==e.isSubject)return t.isSubject?-1:1;{let i=t.point,n=e.point;if(i[0]===n[0]&&i[1]===n[1])return i=t.otherEvent.point,n=e.otherEvent.point,i[0]===n[0]&&i[1]===n[1]?0:t.contourId>e.contourId?1:-1}return 1===T_(t,e)?1:-1}class R_{constructor(){this.points=[],this.holeIds=[],this.holeOf=null,this.depth=null}isExterior(){return null==this.holeOf}}function L_(t,e,i,n){let r,s=t+1,o=e[t].point;const a=e.length;for(s<a&&(r=e[s].point);s<a&&r[0]===o[0]&&r[1]===o[1];){if(!i[s])return s;s++,r=e[s].point}for(s=t-1;i[s]&&s>n;)s--;return s}function O_(t,e,i){const n=new R_;if(null!=t.prevInResult){const r=t.prevInResult,s=r.outputContourId;if(r.resultTransition>0){const t=e[s];if(null!=t.holeOf){const r=t.holeOf;e[r].holeIds.push(i),n.holeOf=r,n.depth=e[s].depth}else e[s].holeIds.push(i),n.holeOf=s,n.depth=e[s].depth+1}else n.holeOf=null,n.depth=e[s].depth}else n.holeOf=null,n.depth=0;return n}function N_(t){let e,i;const n=function(t){let e,i,n,r;const s=[];for(i=0,n=t.length;i<n;i++)e=t[i],(e.left&&e.inResult||!e.left&&e.otherEvent.inResult)&&s.push(e);let o=!1;for(;!o;)for(o=!0,i=0,n=s.length;i<n;i++)i+1<n&&1===T_(s[i],s[i+1])&&(r=s[i],s[i]=s[i+1],s[i+1]=r,o=!1);for(i=0,n=s.length;i<n;i++)e=s[i],e.otherPos=i;for(i=0,n=s.length;i<n;i++)e=s[i],e.left||(r=e.otherPos,e.otherPos=e.otherEvent.otherPos,e.otherEvent.otherPos=r);return s}(t),r={},s=[];for(e=0,i=n.length;e<i;e++){if(r[e])continue;const t=s.length,i=O_(n[e],s,t),o=e=>{r[e]=!0,n[e].outputContourId=t};let a=e,c=e;const h=n[e].point;for(i.points.push(h);o(a),a=n[a].otherPos,o(a),i.points.push(n[a].point),a=L_(a,n,r,c),a!=c;);s.push(i)}return s}var D_=k_,$_=k_;function k_(t,e){if(!(this instanceof k_))return new k_(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||z_,this.length>0)for(var i=(this.length>>1)-1;i>=0;i--)this._down(i)}function z_(t,e){return t<e?-1:t>e?1:0}k_.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,i=this.compare,n=e[t];t>0;){var r=t-1>>1,s=e[r];if(i(n,s)>=0)break;e[t]=s,t=r}e[t]=n},_down:function(t){for(var e=this.data,i=this.compare,n=this.length>>1,r=e[t];t<n;){var s=1+(t<<1),o=s+1,a=e[s];if(o<this.length&&i(e[o],a)<0&&(s=o,a=e[o]),i(a,r)>=0)break;e[t]=a,t=s}e[t]=r}},D_.default=$_;const F_=Math.max,B_=Math.min;let j_=0;function H_(t,e,i,n,r,s){let o,a,c,h,l,u;for(o=0,a=t.length-1;o<a;o++){if(c=t[o],h=t[o+1],l=new p_(c,!1,void 0,e),u=new p_(h,!1,l,e),l.otherEvent=u,c[0]===h[0]&&c[1]===h[1])continue;l.contourId=u.contourId=i,s||(l.isExteriorRing=!1,u.isExteriorRing=!1),T_(l,u)>0?u.left=!0:l.left=!0;const a=c[0],d=c[1];r[0]=B_(r[0],a),r[1]=B_(r[1],d),r[2]=F_(r[2],a),r[3]=F_(r[3],d),n.push(l),n.push(u)}}const U_=[];function V_(t,e,i){"number"==typeof t[0][0][0]&&(t=[t]),"number"==typeof e[0][0][0]&&(e=[e]);let n=function(t,e,i){let n=null;return t.length*e.length==0&&(0===i?n=U_:2===i?n=t:1!==i&&3!==i||(n=0===t.length?e:t)),n}(t,e,i);if(n)return n===U_?null:n;const r=[1/0,1/0,-1/0,-1/0],s=[1/0,1/0,-1/0,-1/0],o=function(t,e,i,n,r){const s=new D_(null,T_);let o,a,c,h,l,u;for(c=0,h=t.length;c<h;c++)for(o=t[c],l=0,u=o.length;l<u;l++)a=0===l,a&&j_++,H_(o[l],!0,j_,s,i,a);for(c=0,h=e.length;c<h;c++)for(o=e[c],l=0,u=o.length;l<u;l++)a=0===l,2===r&&(a=!1),a&&j_++,H_(o[l],!1,j_,s,n,a);return s}(t,e,r,s,i);if(n=function(t,e,i,n,r){let s=null;return(i[0]>n[2]||n[0]>i[2]||i[1]>n[3]||n[1]>i[3])&&(0===r?s=U_:2===r?s=t:1!==r&&3!==r||(s=t.concat(e))),s}(t,e,r,s,i),n)return n===U_?null:n;const a=N_(function(t,e,i,n,r,s){const o=new c_(P_),a=[],c=Math.min(n[2],r[2]);let h,l,u;for(;0!==t.length;){let e=t.pop();if(a.push(e),0===s&&e.point[0]>c||2===s&&e.point[0]>n[2])break;if(e.left){l=h=o.insert(e),u=o.minNode(),h=h!==u?o.prev(h):null,l=o.next(l);const i=h?h.key:null;let n;if(u_(e,i,s),l&&2===A_(e,l.key,t)&&(u_(e,i,s),u_(e,l.key,s)),h&&2===A_(h.key,e,t)){let t=h;t=t!==u?o.prev(t):null,n=t?t.key:null,u_(i,n,s),u_(e,i,s)}}else e=e.otherEvent,l=h=o.find(e),h&&l&&(h=h!==u?o.prev(h):null,l=o.next(l),o.remove(e),l&&h&&A_(h.key,l.key,t))}return a}(o,0,0,r,s,i)),c=[];for(let t=0;t<a.length;t++){let e=a[t];if(e.isExterior()){let t=[e.points];for(let i=0;i<e.holeIds.length;i++){let n=e.holeIds[i];t.push(a[n].points)}c.push(t)}}return c}class G_ extends xg{constructor(){super(),this._subsampleThreshold=.005}_getPoleOfInaccessibility2d(t){return e_([t],.03)}_project(t,e){const i=this._createCamera(e.upVector().toArray(),e.unprojectSfM([0,0],0),e.unprojectSfM([0,0],10));return this._deunproject(t,e,i)}_subsample(t,e=this._subsampleThreshold){const i=[],n=t.length;for(let r=0;r<n;r++){const s=t[r],o=t[(r+1)%n];i.push(s);const a=Math.sqrt(Math.pow(o[0]-s[0],2)+Math.pow(o[1]-s[1],2)),c=Math.floor(a/e),h=1/(c+1);for(let t=1;t<=c;t++){const e=t*h,n=[(1-e)*s[0]+e*o[0],(1-e)*s[1]+e*o[1]];i.push(n)}}return i}_triangulate(t,e,i,n){let r=[t.slice(0,-1)];for(let t of null!=i?i:[])r.push(t.slice(0,-1));let s=e.slice(0,-1);for(let t of null!=n?n:[])s=s.concat(t.slice(0,-1));let o=Tg.flatten(r),a=Tg(o.vertices,o.holes,o.dimensions),c=[];for(let t=0;t<a.length;++t){let e=s[a[t]];c.push(e[0]),c.push(e[1]),c.push(e[2])}return c}_triangulateSpherical(t,e,i){const n=[],r=1e-9;for(let s=0;s<3;s++)for(let o=0;o<3;o++){const a=s/3+(0===s?-1e-9:r),c=o/3+(0===o?-1e-9:r),h=(s+1)/3+r,l=(o+1)/3+r,u=[[a,c],[a,l],[h,l],[h,c],[a,c]],d=[(2*s+1)/6,(2*o+1)/6];n.push(...this._triangulateSubarea(t,e,u,d,i))}return n}_unproject(t,e,i=200){return t.map((t=>e.unprojectBasic(t,i)))}_createCamera(t,e,i){const n=new Ns;return n.up.copy((new fn).fromArray(t)),n.position.copy((new fn).fromArray(e)),n.lookAt((new fn).fromArray(i)),n.updateMatrix(),n.updateMatrixWorld(!0),n}_deunproject(t,e,i){return t.map((t=>{const n=e.unprojectBasic(t,1e4),r=new fn(n[0],n[1],n[2]).applyMatrix4(i.matrixWorldInverse);return[r.x/r.z,r.y/r.z]}))}_triangulateSubarea(t,e,i,n,r){const s=V_([t,...e],[i],0);if(!s)return[];const o=[],a=this._subsampleThreshold,c=this._createCamera(r.upVector().toArray(),r.unprojectSfM([0,0],0),r.unprojectBasic(n,10));for(const t of s){const e=this._subsample(t[0],a),i=this._deunproject(e,r,c),n=this._unproject(e,r),s=[],h=[];for(let e=1;e<t.length;e++){let i=this._subsample(t[e],a);const n=this._deunproject(i,r,c),o=this._unproject(i,r);s.push(n),h.push(o)}o.push(...this._triangulate(i,n,s,h))}return o}}class q_ extends G_{constructor(t){if(super(),4!==t.length)throw new wg("Rectangle needs to have four values.");if(t[1]>t[3])throw new wg("Basic Y coordinates values can not be inverted.");for(let e of t)if(e<0||e>1)throw new wg("Basic coordinates must be on the interval [0, 1].");this._anchorIndex=void 0,this._rect=t.slice(0,4),this._inverted=this._rect[0]>this._rect[2]}get anchorIndex(){return this._anchorIndex}get inverted(){return this._inverted}get rect(){return this._rect}initializeAnchorIndexing(t){if(void 0!==this._anchorIndex)throw new wg("Anchor indexing is already initialized.");if(t<0||t>3)throw new wg(`Invalid anchor index: ${t}.`);this._anchorIndex=void 0===t?0:t}terminateAnchorIndexing(){this._anchorIndex=void 0}setOppositeVertex2d(t,e){if(void 0===this._anchorIndex)throw new wg("Anchor indexing needs to be initialized.");const i=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))],n=this._rect.slice(),r=0===this._anchorIndex?[n[0],n[3]]:1===this._anchorIndex?[n[0],n[1]]:2===this._anchorIndex?[n[2],n[1]]:[n[2],n[3]];if(dd(e.cameraType)){const t=this._anchorIndex<2?i[0]-n[2]:i[0]-n[0];!this._inverted&&this._anchorIndex<2&&i[0]<.25&&n[2]>.75&&t<-.5||!this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[2]>.75&&t<-.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?0:1):this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[0]>.75&&t<-.5?(this._inverted=!1,this._anchorIndex=r[0]>i[0]?r[1]>i[1]?3:2:r[1]>i[1]?0:1):!this._inverted&&this._anchorIndex>=2&&i[0]>.75&&n[0]<.25&&t>.5||!this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[0]<.25&&t>.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?3:2):this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[2]<.25&&t>.5?(this._inverted=!1,this._anchorIndex=r[0]>i[0]?r[1]>i[1]?3:2:r[1]>i[1]?0:1):this._inverted&&this._anchorIndex<2&&i[0]>n[0]?(this._inverted=!1,this._anchorIndex=r[1]>i[1]?0:1):this._inverted&&this._anchorIndex>=2&&i[0]<n[2]?(this._inverted=!1,this._anchorIndex=r[1]>i[1]?3:2):this._inverted?this._anchorIndex<2?this._anchorIndex=r[1]>i[1]?0:1:this._anchorIndex=r[1]>i[1]?3:2:this._anchorIndex=r[0]<=i[0]&&r[1]>i[1]?0:r[0]<=i[0]&&r[1]<=i[1]?1:r[0]>i[0]&&r[1]<=i[1]?2:3;const e=[];0===this._anchorIndex?(e[0]=r[0],e[1]=i[1],e[2]=i[0],e[3]=r[1]):1===this._anchorIndex?(e[0]=r[0],e[1]=r[1],e[2]=i[0],e[3]=i[1]):2===this._anchorIndex?(e[0]=i[0],e[1]=r[1],e[2]=r[0],e[3]=i[1]):(e[0]=i[0],e[1]=i[1],e[2]=r[0],e[3]=r[1]),(!this._inverted&&e[0]>e[2]||this._inverted&&e[0]<e[2])&&(e[0]=n[0],e[2]=n[2]),e[1]>e[3]&&(e[1]=n[1],e[3]=n[3]),this._rect[0]=e[0],this._rect[1]=e[1],this._rect[2]=e[2],this._rect[3]=e[3]}else{this._anchorIndex=r[0]<=i[0]&&r[1]>i[1]?0:r[0]<=i[0]&&r[1]<=i[1]?1:r[0]>i[0]&&r[1]<=i[1]?2:3;const t=[];0===this._anchorIndex?(t[0]=r[0],t[1]=i[1],t[2]=i[0],t[3]=r[1]):1===this._anchorIndex?(t[0]=r[0],t[1]=r[1],t[2]=i[0],t[3]=i[1]):2===this._anchorIndex?(t[0]=i[0],t[1]=r[1],t[2]=r[0],t[3]=i[1]):(t[0]=i[0],t[1]=i[1],t[2]=r[0],t[3]=r[1]),t[0]>t[2]&&(t[0]=n[0],t[2]=n[2]),t[1]>t[3]&&(t[1]=n[1],t[3]=n[3]),this._rect[0]=t[0],this._rect[1]=t[1],this._rect[2]=t[2],this._rect[3]=t[3]}this._notifyChanged$.next(this)}setVertex2d(t,e,i){let n=this._rect.slice(),r=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))],s=[];if(0===t?(s[0]=r[0],s[1]=n[1],s[2]=n[2],s[3]=r[1]):1===t?(s[0]=r[0],s[1]=r[1],s[2]=n[2],s[3]=n[3]):2===t?(s[0]=n[0],s[1]=r[1],s[2]=r[0],s[3]=n[3]):3===t&&(s[0]=n[0],s[1]=n[1],s[2]=r[0],s[3]=r[1]),dd(i.cameraType)){let e=t<2&&r[0]>.75&&n[0]<.25||t>=2&&this._inverted&&r[0]>.75&&n[2]<.25,i=t<2&&this._inverted&&r[0]<.25&&n[0]>.75||t>=2&&r[0]<.25&&n[2]>.75;e||i?this._inverted=!this._inverted:(s[0]-n[0]<-.25&&(s[0]=n[0]),s[2]-n[2]>.25&&(s[2]=n[2])),(!this._inverted&&s[0]>s[2]||this._inverted&&s[0]<s[2])&&(s[0]=n[0],s[2]=n[2])}else s[0]>s[2]&&(s[0]=n[0],s[2]=n[2]);s[1]>s[3]&&(s[1]=n[1],s[3]=n[3]),this._rect[0]=s[0],this._rect[1]=s[1],this._rect[2]=s[2],this._rect[3]=s[3],this._notifyChanged$.next(this)}setCentroid2d(t,e){let i=this._rect.slice(),n=i[0],r=this._inverted?i[2]+1:i[2],s=i[1],o=i[3],a=n+(r-n)/2,c=s+(o-s)/2,h=0;if(dd(e.cameraType))h=this._inverted?t[0]+1-a:t[0]-a;else{let e=-n,i=1-r;h=Math.max(e,Math.min(i,t[0]-a))}let l=-s,u=1-o,d=Math.max(l,Math.min(u,t[1]-c));this._rect[0]=i[0]+h,this._rect[1]=i[1]+d,this._rect[2]=i[2]+h,this._rect[3]=i[3]+d,this._rect[0]<0?(this._rect[0]+=1,this._inverted=!this._inverted):this._rect[0]>1&&(this._rect[0]-=1,this._inverted=!this._inverted),this._rect[2]<0?(this._rect[2]+=1,this._inverted=!this._inverted):this._rect[2]>1&&(this._rect[2]-=1,this._inverted=!this._inverted),this._notifyChanged$.next(this)}getPoints3d(t){return this._getPoints2d().map((e=>t.unprojectBasic(e,200)))}getVertex2d(t){return this._rectToVertices2d(this._rect)[t]}getNonAdjustedVertex2d(t){return this._rectToNonAdjustedVertices2d(this._rect)[t]}getVertex3d(t,e){return e.unprojectBasic(this._rectToVertices2d(this._rect)[t],200)}getVertices2d(){return this._rectToVertices2d(this._rect)}getVertices3d(t){return this._rectToVertices2d(this._rect).map((e=>t.unprojectBasic(e,200)))}getCentroid2d(){const t=this._rect;return[(t[0]+(this._inverted?t[2]+1:t[2]))/2,(t[1]+t[3])/2]}getCentroid3d(t){const e=this.getCentroid2d();return t.unprojectBasic(e,200)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect))}getPoleOfInaccessibility3d(t){let e=this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));return t.unprojectBasic(e,200)}getTriangles3d(t){return dd(t.cameraType)?[]:this._triangulate(this._project(this._getPoints2d(),t),this.getPoints3d(t))}validate(t){let e=this._rect;return!(!this._inverted&&t[0]<e[0]||t[0]-e[2]>.25||t[1]<e[1])}_getPoints2d(){let t=this._rectToVertices2d(this._rect),e=t.length-1,i=[];for(let n=0;n<e;++n){let e=t[n][0],r=t[n][1],s=(t[n+1][0]-e)/9,o=(t[n+1][1]-r)/9;for(let t=0;t<10;++t){let n=[e+t*s,r+t*o];i.push(n)}}return i}_rectToVertices2d(t){return[[t[0],t[3]],[t[0],t[1]],[this._inverted?t[2]+1:t[2],t[1]],[this._inverted?t[2]+1:t[2],t[3]],[t[0],t[3]]]}_rectToNonAdjustedVertices2d(t){return[[t[0],t[3]],[t[0],t[1]],[t[2],t[1]],[t[2],t[3]],[t[0],t[3]]]}}class W_ extends Mg{constructor(t,e,i,n){super(t,i,n),this._options={color:null==e.color?16777215:e.color,indicateCompleter:null==e.indicateCompleter||e.indicateCompleter},this._rectGeometry=new q_(this._geometry.getRect2d(i)),this._createGlObjects()}create(){this._geometry.points.length<3||(this._geometry.removePoint2d(this._geometry.points.length-1),this._created$.next(this))}dispose(){super.dispose(),this._disposeObjects()}getDOMObjects(t,e){const i={offsetHeight:e.height,offsetWidth:e.width},n=[],r=this._geometry.getPoints2d(),s=r.length;for(let e=0;e<s-1;e++){const o=e,[a,c]=r[e],h=this._viewportCoords.basicToCanvasSafe(a,c,i,this._transform,t);if(!h)continue;const l=t=>{t.stopPropagation(),this._aborted$.next(this)},u=t=>{t.stopPropagation(),this._geometry.removePoint2d(o)},d=this._canvasToTransform(h),p={onclick:0===e&&s<3?l:u,style:{transform:d}};n.push(jf.h("div.mapillary-tag-interactor",p,[]));const f={style:{background:this._colorToBackground(this._options.color),transform:d}};n.push(jf.h("div.mapillary-tag-vertex",f,[]))}if(s>2&&!0===this._options.indicateCompleter){const[e,r]=this._geometry.getCentroid2d(this._transform),s=this._viewportCoords.basicToCanvasSafe(e,r,i,this._transform,t);if(s){const t=t=>{t.stopPropagation(),this._geometry.removePoint2d(this._geometry.points.length-1),this._created$.next(this)},e=this._canvasToTransform(s),i={onclick:t,style:{transform:e}};n.push(jf.h("div.mapillary-tag-completer.mapillary-tag-larger",i,[]));const r={style:{background:this._colorToBackground(this._options.color),transform:e}};n.push(jf.h("div.mapillary-tag-vertex.mapillary-tag-larger",r,[]));const o={style:{transform:e}};n.push(jf.h("div.mapillary-tag-dot",o,[]))}}return n}_onGeometryChanged(){this._disposeObjects(),this._rectGeometry=new q_(this._geometry.getRect2d(this._transform)),this._createGlObjects()}_createGlObjects(){this._glObjects=[];const t=this._rectGeometry.getPoints3d(this._transform);this._outline=this._createOutine(t,this._options.color),this._glObjects.push(this._outline)}_disposeObjects(){this._disposeLine(this._outline),this._outline=null,this._glObjects=null}}class X_ extends G_{constructor(t,e){super();let i=t.length;if(i<3)throw new wg("A polygon must have three or more positions.");if(t[0][0]!==t[i-1][0]||t[0][1]!==t[i-1][1])throw new wg("First and last positions must be equivalent.");this._polygon=[];for(let e of t){if(e[0]<0||e[0]>1||e[1]<0||e[1]>1)throw new wg("Basic coordinates of polygon must be on the interval [0, 1].");this._polygon.push(e.slice())}if(this._holes=[],null!=e)for(let t=0;t<e.length;t++){let i=e[t],n=i.length;if(n<3)throw new wg("A polygon hole must have three or more positions.");if(i[0][0]!==i[n-1][0]||i[0][1]!==i[n-1][1])throw new wg("First and last positions of hole must be equivalent.");this._holes.push([]);for(let e of i){if(e[0]<0||e[0]>1||e[1]<0||e[1]>1)throw new wg("Basic coordinates of hole must be on the interval [0, 1].");this._holes[t].push(e.slice())}}}get polygon(){return this._polygon}get holes(){return this._holes}addVertex2d(t){let e=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];this._polygon.splice(this._polygon.length-1,0,e),this._notifyChanged$.next(this)}getVertex2d(t){return this._polygon[t].slice()}removeVertex2d(t){if(t<0||t>=this._polygon.length||this._polygon.length<4)throw new wg("Index for removed vertex must be valid.");if(t>0&&t<this._polygon.length-1)this._polygon.splice(t,1);else{this._polygon.splice(0,1),this._polygon.pop();let t=this._polygon[0].slice();this._polygon.push(t)}this._notifyChanged$.next(this)}setVertex2d(t,e,i){let n=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];0===t||t===this._polygon.length-1?(this._polygon[0]=n.slice(),this._polygon[this._polygon.length-1]=n.slice()):this._polygon[t]=n.slice(),this._notifyChanged$.next(this)}setCentroid2d(t,e){let i=this._polygon.map((t=>t[0])),n=this._polygon.map((t=>t[1])),r=Math.min.apply(Math,i),s=Math.max.apply(Math,i),o=Math.min.apply(Math,n),a=Math.max.apply(Math,n),c=this.getCentroid2d(),h=-r,l=1-s,u=-o,d=1-a,p=Math.max(h,Math.min(l,t[0]-c[0])),f=Math.max(u,Math.min(d,t[1]-c[1]));for(let t of this._polygon)t[0]+=p,t[1]+=f;this._notifyChanged$.next(this)}getPoints3d(t){return this._getPoints3d(this._subsample(this._polygon),t)}getVertex3d(t,e){return e.unprojectBasic(this._polygon[t],200)}getVertices2d(){return this._polygon.slice()}getVertices3d(t){return this._getPoints3d(this._polygon,t)}getHolePoints3d(t){return this._holes.map((e=>this._getPoints3d(this._subsample(e),t)))}getHoleVertices3d(t){return this._holes.map((e=>this._getPoints3d(e,t)))}getCentroid2d(){let t=this._polygon,e=0,i=0,n=0;for(let r=0;r<t.length-1;r++){let s=t[r][0],o=t[r][1],a=t[r+1][0],c=t[r+1][1],h=s*c-a*o;e+=h,i+=(s+a)*h,n+=(o+c)*h}return e/=2,i/=6*e,n/=6*e,[i,n]}getCentroid3d(t){let e=this.getCentroid2d();return t.unprojectBasic(e,200)}get3dDomainTriangles3d(t){return this._triangulate(this._project(this._polygon,t),this.getVertices3d(t),this._holes.map((e=>this._project(e,t))),this.getHoleVertices3d(t))}getTriangles3d(t){if(dd(t.cameraType))return this._triangulateSpherical(this._polygon.slice(),this.holes.slice(),t);const e=this._project(this._subsample(this._polygon),t),i=this.getPoints3d(t),n=this._holes.map((e=>this._project(this._subsample(e),t))),r=this.getHolePoints3d(t);return this._triangulate(e,i,n,r)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._polygon.slice())}getPoleOfInaccessibility3d(t){let e=this._getPoleOfInaccessibility2d(this._polygon.slice());return t.unprojectBasic(e,200)}_getPoints3d(t,e){return t.map((t=>e.unprojectBasic(t,200)))}}class Y_ extends Mg{constructor(t,e,i,n){super(t,i,n),this._options={color:null==e.color?16777215:e.color},this._createGlObjects()}create(){if(this._geometry instanceof q_)this._created$.next(this);else if(this._geometry instanceof X_){const t=this._geometry;t.removeVertex2d(t.polygon.length-2),this._created$.next(this)}}dispose(){super.dispose(),this._disposeLine(this._outline),this._disposeObjects()}getDOMObjects(t,e){const i=[],n={offsetHeight:e.height,offsetWidth:e.width},r=t=>{t.stopPropagation(),this._aborted$.next(this)};if(this._geometry instanceof q_){const e=this._geometry.anchorIndex,s=void 0===e?1:e,[o,a]=this._geometry.getVertex2d(s),c=this._viewportCoords.basicToCanvasSafe(o,a,n,this._transform,t);if(null!=c){const t=this._colorToBackground(this._options.color),e=this._canvasToTransform(c),n={style:{background:t,transform:e}},s={onclick:r,style:{transform:e}};i.push(jf.h("div.mapillary-tag-interactor",s,[])),i.push(jf.h("div.mapillary-tag-vertex",n,[]))}}else if(this._geometry instanceof X_){const e=this._geometry,[s,o]=e.getVertex2d(0),a=this._viewportCoords.basicToCanvasSafe(s,o,n,this._transform,t);if(null!=a){const t={onclick:e.polygon.length>4?t=>{t.stopPropagation(),e.removeVertex2d(e.polygon.length-2),this._created$.next(this)}:r,style:{transform:this._canvasToTransform(a)}},n=e.polygon.length>4?"mapillary-tag-completer":"mapillary-tag-interactor";i.push(jf.h("div."+n,t,[]))}if(e.polygon.length>3){const[r,s]=e.getVertex2d(e.polygon.length-3),o=this._viewportCoords.basicToCanvasSafe(r,s,n,this._transform,t);if(null!=o){const t={onclick:t=>{t.stopPropagation(),e.removeVertex2d(e.polygon.length-3)},style:{transform:this._canvasToTransform(o)}};i.push(jf.h("div.mapillary-tag-interactor",t,[]))}}const c=e.polygon.slice();c.splice(-2,2);for(const e of c){const r=this._viewportCoords.basicToCanvasSafe(e[0],e[1],n,this._transform,t);if(null!=r){const t={style:{background:this._colorToBackground(this._options.color),transform:this._canvasToTransform(r)}};i.push(jf.h("div.mapillary-tag-vertex",t,[]))}}}return i}addPoint(t){if(this._geometry instanceof q_){if(!this._geometry.validate(t))return;this._created$.next(this)}else if(this._geometry instanceof X_){this._geometry.addVertex2d(t)}}_onGeometryChanged(){this._disposeLine(this._outline),this._disposeObjects(),this._createGlObjects()}_disposeObjects(){this._outline=null,this._glObjects=[]}_createGlObjects(){const t=this._geometry instanceof q_?this._geometry.getPoints3d(this._transform):this._geometry.getVertices3d(this._transform);this._outline=this._createOutine(t,this._options.color),this._glObjects=[this._outline]}}class Z_{constructor(t,e){this._component=t,this._navigator=e,this._tagOperation$=new T,this._createPoints$=new T,this._createPolygon$=new T,this._createRect$=new T,this._delete$=new T,this._tag$=this._tagOperation$.pipe(Le(((t,e)=>e(t)),null),Ze()),this._replayedTag$=this._tag$.pipe(Ue(1),E()),this._replayedTag$.subscribe(),this._createPoints$.pipe(bi(this._component.configuration$,this._navigator.stateService.currentTransform$),rt((([t,e,i])=>()=>{const n=new Sg([[t[0],t[1]],[t[0],t[1]]]);return new W_(n,{color:e.createColor,indicateCompleter:e.indicatePointsCompleter},i)}))).subscribe(this._tagOperation$),this._createRect$.pipe(bi(this._component.configuration$,this._navigator.stateService.currentTransform$),rt((([t,e,i])=>()=>{const n=new q_([t[0],t[1],t[0],t[1]]);return new Y_(n,{color:e.createColor},i)}))).subscribe(this._tagOperation$),this._createPolygon$.pipe(bi(this._component.configuration$,this._navigator.stateService.currentTransform$),rt((([t,e,i])=>()=>{const n=new X_([[t[0],t[1]],[t[0],t[1]],[t[0],t[1]]]);return new Y_(n,{color:e.createColor},i)}))).subscribe(this._tagOperation$),this._delete$.pipe(rt((()=>()=>null))).subscribe(this._tagOperation$)}get createRect$(){return this._createRect$}get createPolygon$(){return this._createPolygon$}get createPoints$(){return this._createPoints$}get delete$(){return this._delete$}get tag$(){return this._tag$}get replayedTag$(){return this._replayedTag$}}class J_{render(t,e,i,n,r){let s=[];for(const e of t)s=s.concat(e.getDOMObjects(i,n,r));return null!=e&&(s=s.concat(e.getDOMObjects(n,r))),jf.h("div.mapillary-tag-container",{},s)}clear(){return jf.h("div",{},[])}}class K_{constructor(t,e){this._createTag=null,this._needsRender=!1,this._raycaster=e||new Bu,this._scene=t||new Qa,this._objectTags={},this._retrievableObjects=[],this._tags={}}get needsRender(){return this._needsRender}add(t){for(let e of t)e.tag.id in this._tags&&this._remove(e.tag.id),this._add(e);this._needsRender=!0}addCreateTag(t){for(const e of t.glObjects)this._scene.add(e);this._createTag={tag:t,objects:t.glObjects},this._needsRender=!0}clear(){for(const t of Object.keys(this._tags))this._remove(t);this._needsRender=!1}get(t){return this.has(t)?this._tags[t].tag:void 0}has(t){return t in this._tags}hasCreateTag(){return null!=this._createTag}intersectObjects([t,e],i){this._raycaster.setFromCamera(new rn(t,e),i);const n=this._raycaster.intersectObjects(this._retrievableObjects),r=[];for(const t of n)t.object.uuid in this._objectTags&&r.push(this._objectTags[t.object.uuid]);return r}remove(t){for(const e of t)this._remove(e);this._needsRender=!0}removeAll(){for(const t of Object.keys(this._tags))this._remove(t);this._needsRender=!0}removeCreateTag(){if(null!=this._createTag){for(const t of this._createTag.objects)this._scene.remove(t);this._createTag.tag.dispose(),this._createTag=null,this._needsRender=!0}}render(t,e){e.render(this._scene,t),this._needsRender=!1}update(){this._needsRender=!0}updateCreateTagObjects(t){if(this._createTag.tag!==t)throw new Error("Create tags do not have the same reference.");for(let t of this._createTag.objects)this._scene.remove(t);for(const e of t.glObjects)this._scene.add(e);this._createTag.objects=t.glObjects,this._needsRender=!0}updateObjects(t){const e=t.tag.id;if(this._tags[e].tag!==t)throw new Error("Tags do not have the same reference.");const i=this._tags[e];this._removeObjects(i),delete this._tags[e],this._add(t),this._needsRender=!0}_add(t){const e=t.tag.id,i={tag:t,objects:[],retrievableObjects:[]};this._tags[e]=i;for(const e of t.getGLObjects())i.objects.push(e),this._scene.add(e);for(const e of t.getRetrievableObjects())i.retrievableObjects.push(e),this._retrievableObjects.push(e),this._objectTags[e.uuid]=t.tag.id}_remove(t){const e=this._tags[t];this._removeObjects(e),e.tag.dispose(),delete this._tags[t]}_removeObjects(t){for(const e of t.objects)this._scene.remove(e);for(const e of t.retrievableObjects){const t=this._retrievableObjects.indexOf(e);-1!==t&&this._retrievableObjects.splice(t,1)}}}var Q_,tv,ev,iv;t.TagMode=void 0,(Q_=t.TagMode||(t.TagMode={}))[Q_.Default=0]="Default",Q_[Q_.CreatePoint=1]="CreatePoint",Q_[Q_.CreatePoints=2]="CreatePoints",Q_[Q_.CreatePolygon=3]="CreatePolygon",Q_[Q_.CreateRect=4]="CreateRect",Q_[Q_.CreateRectDrag=5]="CreateRectDrag",function(t){t[t.None=0]="None",t[t.Centroid=1]="Centroid",t[t.Vertex=2]="Vertex"}(tv||(tv={}));class nv{constructor(t,e,i){this._tag=t,this._transform=e,this._viewportCoords=i||new Wf,this._glObjectsChanged$=new T,this._interact$=new T}get glObjectsChanged$(){return this._glObjectsChanged$}get interact$(){return this._interact$}get tag(){return this._tag}}class rv extends nv{constructor(t,e){super(t,e),this._geometryChangedSubscription=this._tag.geometry.changed$.subscribe((()=>{this._onGeometryChanged()})),this._changedSubscription=this._tag.changed$.subscribe((()=>{this._onTagChanged()&&this._glObjectsChanged$.next(this)}))}dispose(){this._changedSubscription.unsubscribe(),this._geometryChangedSubscription.unsubscribe()}_colorToCss(t){return"#"+("000000"+t.toString(16)).substr(-6)}_createFill(){let t=this._getTriangles(),e=new Float32Array(t),i=new hs;i.setAttribute("position",new Hr(e,3)),i.computeBoundingSphere();let n=new Fr({side:2,transparent:!0});return this._updateFillMaterial(n),new Es(i,n)}_createLine(t){let e=this._getLinePositions(t),i=new hs;i.setAttribute("position",new Hr(e,3)),i.computeBoundingSphere();let n=new kc;this._updateLineBasicMaterial(n);const r=new Uc(i,n);return r.renderOrder=1,r}_createOutline(){return this._createLine(this._getPoints3d())}_disposeFill(){null!=this._fill&&(this._fill.geometry.dispose(),this._fill.material.dispose(),this._fill=null)}_disposeOutline(){null!=this._outline&&(this._outline.geometry.dispose(),this._outline.material.dispose(),this._outline=null)}_getLinePositions(t){let e=t.length,i=new Float32Array(3*e);for(let n=0;n<e;++n){let e=3*n,r=t[n];i[e+0]=r[0],i[e+1]=r[1],i[e+2]=r[2]}return i}_interact(t,e,i){return n=>{let r=n.offsetX-n.target.offsetWidth/2,s=n.offsetY-n.target.offsetHeight/2;this._interact$.next({cursor:e,offsetX:r,offsetY:s,operation:t,tag:this._tag,vertexIndex:i})}}_updateFillGeometry(){let t=this._getTriangles(),e=new Float32Array(t),i=this._fill.geometry,n=i.getAttribute("position");n.array.length===e.length?(n.set(e),n.needsUpdate=!0):(i.deleteAttribute("position"),i.setAttribute("position",new Hr(e,3))),i.computeBoundingSphere()}_updateLine(t,e){let i=this._getLinePositions(e),n=t.geometry,r=n.getAttribute("position");r.set(i),r.needsUpdate=!0,n.computeBoundingSphere()}_updateOulineGeometry(){this._updateLine(this._outline,this._getPoints3d())}}class sv extends rv{constructor(t,e){super(t,e),this._rectGeometry=new q_(this._tag.geometry.getRect2d(e)),this._fill=dd(e.cameraType)?null:this._createFill(),this._outline=this._tag.lineWidth>=1?this._createOutline():null}dispose(){super.dispose(),this._disposeFill(),this._disposeOutline()}getDOMObjects(t,e,i){const n=[],r={offsetHeight:i.height,offsetWidth:i.width};if(!this._tag.editable)return n;const s=this._colorToCss(this._tag.lineColor),o=this._tag.geometry.getPoints2d();for(let t=0;t<o.length;t++){const[i,a]=o[t],c=this._viewportCoords.basicToCanvasSafe(i,a,r,this._transform,e);if(null==c)continue;const h="crosshair",l=this._interact(tv.Vertex,h,t),u=`translate(-50%, -50%) translate(${Math.round(c[0])}px,${Math.round(c[1])}px)`,d={onpointerdown:l,style:{background:s,transform:u,cursor:h}};if(n.push(jf.h("div.mapillary-tag-resizer",d,[])),!this._tag.indicateVertices)continue;const p={style:{background:s,transform:u}};n.push(jf.h("div.mapillary-tag-vertex",p,[]))}return n}getGLObjects(){const t=[];return null!=this._fill&&t.push(this._fill),null!=this._outline&&t.push(this._outline),t}getRetrievableObjects(){return null!=this._fill?[this._fill]:[]}_onGeometryChanged(){this._rectGeometry=new q_(this._tag.geometry.getRect2d(this._transform)),null!=this._fill&&this._updateFillGeometry(),null!=this._outline&&this._updateOulineGeometry()}_onTagChanged(){let t=!1;return null!=this._fill&&this._updateFillMaterial(this._fill.material),null==this._outline?this._tag.lineWidth>=1&&(this._outline=this._createOutline(),t=!0):this._updateOutlineMaterial(),t}_getPoints3d(){return this._rectGeometry.getPoints3d(this._transform)}_getTriangles(){return this._rectGeometry.getTriangles3d(this._transform)}_updateFillMaterial(t){t.color=new Dr(this._tag.fillColor),t.opacity=this._tag.fillOpacity,t.needsUpdate=!0}_updateLineBasicMaterial(t){t.color=new Dr(this._tag.lineColor),t.linewidth=Math.max(this._tag.lineWidth,1),t.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,t.opacity=this._tag.lineOpacity,t.transparent=this._tag.lineOpacity<1,t.needsUpdate=!0}_updateOutlineMaterial(){let t=this._outline.material;this._updateLineBasicMaterial(t)}}class ov extends Hf{constructor(t,e){super(),this._id=t,this._geometry=e,this._notifyChanged$=new T,this._notifyChanged$.subscribe((t=>{const e={target:this,type:"tag"};this.fire("tag",e)})),this._geometry.changed$.subscribe((t=>{const e="geometry",i={target:this,type:e};this.fire(e,i)}))}get id(){return this._id}get geometry(){return this._geometry}get changed$(){return this._notifyChanged$}get geometryChanged$(){return this._geometry.changed$.pipe(rt((()=>this)),Ze())}fire(t,e){super.fire(t,e)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}}class av extends ov{constructor(t,e,i){super(t,e),i=i||{},this._editable=null!=i.editable&&i.editable,this._fillColor=null==i.fillColor?16777215:i.fillColor,this._fillOpacity=null==i.fillOpacity?0:i.fillOpacity,this._indicateVertices=null==i.indicateVertices||i.indicateVertices,this._lineColor=null==i.lineColor?16777215:i.lineColor,this._lineOpacity=null==i.lineOpacity?1:i.lineOpacity,this._lineWidth=null==i.lineWidth?1:i.lineWidth}get editable(){return this._editable}set editable(t){this._editable=t,this._notifyChanged$.next(this)}get fillColor(){return this._fillColor}set fillColor(t){this._fillColor=t,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(t){this._fillOpacity=t,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get indicateVertices(){return this._indicateVertices}set indicateVertices(t){this._indicateVertices=t,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(t){this._lineColor=t,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(t){this._lineOpacity=t,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this._notifyChanged$.next(this)}setOptions(t){this._editable=null==t.editable?this._editable:t.editable,this._indicateVertices=null==t.indicateVertices?this._indicateVertices:t.indicateVertices,this._lineColor=null==t.lineColor?this._lineColor:t.lineColor,this._lineWidth=null==t.lineWidth?this._lineWidth:t.lineWidth,this._fillColor=null==t.fillColor?this._fillColor:t.fillColor,this._fillOpacity=null==t.fillOpacity?this._fillOpacity:t.fillOpacity,this._notifyChanged$.next(this)}}t.TagDomain=void 0,(ev=t.TagDomain||(t.TagDomain={}))[ev.TwoDimensional=0]="TwoDimensional",ev[ev.ThreeDimensional=1]="ThreeDimensional";class cv extends rv{constructor(e,i){super(e,i),this._fill=dd(i.cameraType)?e.domain===t.TagDomain.TwoDimensional&&e.geometry instanceof X_?this._createFill():null:this._createFill(),this._holes=this._tag.lineWidth>=1?this._createHoles():[],this._outline=this._tag.lineWidth>=1?this._createOutline():null}dispose(){super.dispose(),this._disposeFill(),this._disposeHoles(),this._disposeOutline()}getDOMObjects(t,e,i){const n=[],r=this._tag.geometry instanceof q_,s=!dd(this._transform.cameraType),o={offsetHeight:i.height,offsetWidth:i.width};if(null!=this._tag.icon&&(r||s)){const[i,r]=this._tag.geometry instanceof q_?this._tag.geometry.getVertex2d(this._tag.iconIndex):this._tag.geometry.getPoleOfInaccessibility2d(),s=this._viewportCoords.basicToCanvasSafe(i,r,o,this._transform,e);if(null!=s){const e=()=>{this._interact$.next({offsetX:0,offsetY:0,operation:tv.None,tag:this._tag})};if(t.loaded){const i=t.getDOMSprite(this._tag.icon,this._tag.iconFloat),r={onclick:t=>{t.stopPropagation(),this._tag.click$.next(this._tag)},onpointerdown:e,style:{transform:`translate(${Math.round(s[0])}px,${Math.round(s[1])}px)`}};n.push(jf.h("div.mapillary-tag-symbol",r,[i]))}}}else if(null!=this._tag.text&&(r||s)){const[t,i]=this._tag.geometry instanceof q_?this._tag.geometry.getVertex2d(3):this._tag.geometry.getPoleOfInaccessibility2d(),r=this._viewportCoords.basicToCanvasSafe(t,i,o,this._transform,e);if(null!=r){const t=Math.round(r[0]),e=Math.round(r[1]),i=this._tag.geometry instanceof q_?`translate(${t}px,${e}px)`:`translate(-50%, -50%) translate(${t}px,${e}px)`,s={onpointerdown:()=>{this._interact$.next({offsetX:0,offsetY:0,operation:tv.None,tag:this._tag})},style:{color:this._colorToCss(this._tag.textColor),transform:i},textContent:this._tag.text};n.push(jf.h("span.mapillary-tag-symbol",s,[]))}}if(!this._tag.editable)return n;const a=this._colorToCss(this._tag.lineColor);if(this._tag.geometry instanceof q_){const[t,i]=this._tag.geometry.getCentroid2d(),r=this._viewportCoords.basicToCanvasSafe(t,i,o,this._transform,e);if(null!=r){const t={onpointerdown:this._interact(tv.Centroid,"move"),style:{background:a,transform:`translate(-50%, -50%) translate(${Math.round(r[0])}px,${Math.round(r[1])}px)`}};n.push(jf.h("div.mapillary-tag-mover",t,[]))}}const c=this._tag.geometry.getVertices2d();for(let t=0;t<c.length-1;t++){if(r&&(null!=this._tag.icon&&t===this._tag.iconIndex||null==this._tag.icon&&null!=this._tag.text&&3===t))continue;const[i,s]=c[t],h=this._viewportCoords.basicToCanvasSafe(i,s,o,this._transform,e);if(null==h)continue;const l=r?t%2==0?"nesw-resize":"nwse-resize":"crosshair",u=this._interact(tv.Vertex,l,t),d=`translate(-50%, -50%) translate(${Math.round(h[0])}px,${Math.round(h[1])}px)`,p={onpointerdown:u,style:{background:a,transform:d,cursor:l}};if(n.push(jf.h("div.mapillary-tag-resizer",p,[])),!this._tag.indicateVertices)continue;const f={style:{background:a,transform:d}};n.push(jf.h("div.mapillary-tag-vertex",f,[]))}return n}getGLObjects(){const t=[];null!=this._fill&&t.push(this._fill);for(const e of this._holes)t.push(e);return null!=this._outline&&t.push(this._outline),t}getRetrievableObjects(){return null!=this._fill?[this._fill]:[]}_onGeometryChanged(){null!=this._fill&&this._updateFillGeometry(),this._holes.length>0&&this._updateHoleGeometries(),null!=this._outline&&this._updateOulineGeometry()}_onTagChanged(){let t=!1;return null!=this._fill&&this._updateFillMaterial(this._fill.material),null==this._outline?this._tag.lineWidth>=1&&(this._holes=this._createHoles(),this._outline=this._createOutline(),t=!0):(this._updateHoleMaterials(),this._updateOutlineMaterial()),t}_getPoints3d(){return this._in3dDomain()?this._tag.geometry.getVertices3d(this._transform):this._tag.geometry.getPoints3d(this._transform)}_getTriangles(){return this._in3dDomain()?this._tag.geometry.get3dDomainTriangles3d(this._transform):this._tag.geometry.getTriangles3d(this._transform)}_updateFillMaterial(t){t.color=new Dr(this._tag.fillColor),t.opacity=this._tag.fillOpacity,t.needsUpdate=!0}_updateLineBasicMaterial(t){t.color=new Dr(this._tag.lineColor),t.linewidth=Math.max(this._tag.lineWidth,1),t.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,t.opacity=this._tag.lineOpacity,t.transparent=this._tag.lineOpacity<1,t.needsUpdate=!0}_createHoles(){let t=[];if(this._tag.geometry instanceof X_){let e=this._getHoles3d();for(let i of e){let e=this._createLine(i);t.push(e)}}return t}_disposeHoles(){for(let t of this._holes)t.geometry.dispose(),t.material.dispose();this._holes=[]}_getHoles3d(){const t=this._tag.geometry;return this._in3dDomain()?t.getHoleVertices3d(this._transform):t.getHolePoints3d(this._transform)}_in3dDomain(){return this._tag.geometry instanceof X_&&this._tag.domain===t.TagDomain.ThreeDimensional}_updateHoleGeometries(){let t=this._getHoles3d();if(t.length!==this._holes.length)throw new Error("Changing the number of holes is not supported.");for(let e=0;e<this._holes.length;e++){let i=t[e],n=this._holes[e];this._updateLine(n,i)}}_updateHoleMaterials(){for(const t of this._holes)this._updateLineBasicMaterial(t.material)}_updateOutlineMaterial(){this._updateLineBasicMaterial(this._outline.material)}}t.Alignment=void 0,(iv=t.Alignment||(t.Alignment={}))[iv.Bottom=0]="Bottom",iv[iv.BottomLeft=1]="BottomLeft",iv[iv.BottomRight=2]="BottomRight",iv[iv.Center=3]="Center",iv[iv.Left=4]="Left",iv[iv.Right=5]="Right",iv[iv.Top=6]="Top",iv[iv.TopLeft=7]="TopLeft",iv[iv.TopRight=8]="TopRight";class hv extends ov{constructor(e,i,n){super(e,i);const r=null!=(n=n||{}).domain&&i instanceof X_?n.domain:t.TagDomain.TwoDimensional,s=this._twoDimensionalPolygon(r,i);this._domain=r,this._editable=null!=n.editable&&!s&&n.editable,this._fillColor=null==n.fillColor?16777215:n.fillColor,this._fillOpacity=null==n.fillOpacity?0:n.fillOpacity,this._icon=void 0===n.icon?null:n.icon,this._iconFloat=null==n.iconFloat?t.Alignment.Center:n.iconFloat,this._iconIndex=null==n.iconIndex?3:n.iconIndex,this._indicateVertices=null==n.indicateVertices||n.indicateVertices,this._lineColor=null==n.lineColor?16777215:n.lineColor,this._lineOpacity=null==n.lineOpacity?1:n.lineOpacity,this._lineWidth=null==n.lineWidth?1:n.lineWidth,this._text=void 0===n.text?null:n.text,this._textColor=null==n.textColor?16777215:n.textColor,this._click$=new T,this._click$.subscribe((()=>{const t="click",e={target:this,type:t};this.fire(t,e)}))}get click$(){return this._click$}get domain(){return this._domain}get editable(){return this._editable}set editable(t){this._twoDimensionalPolygon(this._domain,this._geometry)||(this._editable=t,this._notifyChanged$.next(this))}get fillColor(){return this._fillColor}set fillColor(t){this._fillColor=t,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(t){this._fillOpacity=t,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get icon(){return this._icon}set icon(t){this._icon=t,this._notifyChanged$.next(this)}get iconFloat(){return this._iconFloat}set iconFloat(t){this._iconFloat=t,this._notifyChanged$.next(this)}get iconIndex(){return this._iconIndex}set iconIndex(t){this._iconIndex=t,this._notifyChanged$.next(this)}get indicateVertices(){return this._indicateVertices}set indicateVertices(t){this._indicateVertices=t,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(t){this._lineColor=t,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(t){this._lineOpacity=t,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this._notifyChanged$.next(this)}get text(){return this._text}set text(t){this._text=t,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(t){this._textColor=t,this._notifyChanged$.next(this)}fire(t,e){super.fire(t,e)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}setOptions(t){const e=this._twoDimensionalPolygon(this._domain,this._geometry);this._editable=e||null==t.editable?this._editable:t.editable,this._icon=void 0===t.icon?this._icon:t.icon,this._iconFloat=null==t.iconFloat?this._iconFloat:t.iconFloat,this._iconIndex=null==t.iconIndex?this._iconIndex:t.iconIndex,this._indicateVertices=null==t.indicateVertices?this._indicateVertices:t.indicateVertices,this._lineColor=null==t.lineColor?this._lineColor:t.lineColor,this._lineWidth=null==t.lineWidth?this._lineWidth:t.lineWidth,this._fillColor=null==t.fillColor?this._fillColor:t.fillColor,this._fillOpacity=null==t.fillOpacity?this._fillOpacity:t.fillOpacity,this._text=void 0===t.text?this._text:t.text,this._textColor=null==t.textColor?this._textColor:t.textColor,this._notifyChanged$.next(this)}_twoDimensionalPolygon(e,i){return e!==t.TagDomain.ThreeDimensional&&i instanceof X_}}class lv extends nv{dispose(){}getDOMObjects(e,i,n){const r=this._tag,s={offsetHeight:n.height,offsetWidth:n.width},o=[],[a,c]=r.geometry.getCentroid2d(),h=this._viewportCoords.basicToCanvasSafe(a,c,s,this._transform,i);if(null!=h){const i=t=>{this._interact$.next({offsetX:0,offsetY:0,operation:tv.None,tag:r})},n=Math.round(h[0]),s=Math.round(h[1]);if(null!=r.icon){if(e.loaded){const a=e.getDOMSprite(r.icon,t.Alignment.Bottom),c={onpointerdown:i,style:{pointerEvents:"all",transform:`translate(${n}px,${s+8}px)`}};o.push(jf.h("div",c,[a]))}}else if(null!=r.text){const t=`translate(-50%,0%) translate(${n}px,${s+8}px)`,e={onpointerdown:i,style:{color:this._colorToCss(r.textColor),transform:t},textContent:r.text};o.push(jf.h("span.mapillary-tag-symbol",e,[]))}const a=this._interact(tv.Centroid,r,"move"),c=this._colorToCss(r.color),l=`translate(-50%,-50%) translate(${n}px,${s}px)`;if(r.editable){let t={onpointerdown:a,style:{background:c,transform:l}};o.push(jf.h("div.mapillary-tag-spot-interactor",t,[]))}const u={style:{background:c,transform:l}};o.push(jf.h("div.mapillary-tag-vertex",u,[]))}return o}getGLObjects(){return[]}getRetrievableObjects(){return[]}_colorToCss(t){return"#"+("000000"+t.toString(16)).substr(-6)}_interact(t,e,i,n){return r=>{const s=r.offsetX-r.target.offsetWidth/2,o=r.offsetY-r.target.offsetHeight/2;this._interact$.next({cursor:i,offsetX:s,offsetY:o,operation:t,tag:e,vertexIndex:n})}}}class uv extends ov{constructor(t,e,i){super(t,e),i=i||{},this._color=null==i.color?16777215:i.color,this._editable=null!=i.editable&&i.editable,this._icon=void 0===i.icon?null:i.icon,this._text=void 0===i.text?null:i.text,this._textColor=null==i.textColor?16777215:i.textColor}get color(){return this._color}set color(t){this._color=t,this._notifyChanged$.next(this)}get editable(){return this._editable}set editable(t){this._editable=t,this._notifyChanged$.next(this)}get icon(){return this._icon}set icon(t){this._icon=t,this._notifyChanged$.next(this)}get text(){return this._text}set text(t){this._text=t,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(t){this._textColor=t,this._notifyChanged$.next(this)}setOptions(t){this._color=null==t.color?this._color:t.color,this._editable=null==t.editable?this._editable:t.editable,this._icon=void 0===t.icon?this._icon:t.icon,this._text=void 0===t.text?this._text:t.text,this._textColor=null==t.textColor?this._textColor:t.textColor,this._notifyChanged$.next(this)}}class dv{constructor(){this._active=!1,this._hash={},this._hashDeactivated={},this._notifyChanged$=new T}get active(){return this._active}get changed$(){return this._notifyChanged$}activate(t){if(!this._active){for(const e in this._hashDeactivated){if(!this._hashDeactivated.hasOwnProperty(e))continue;const i=this._hashDeactivated[e];this._add(i,t)}this._hashDeactivated={},this._active=!0,this._notifyChanged$.next(this)}}deactivate(){if(this._active){for(const t in this._hash)this._hash.hasOwnProperty(t)&&(this._hashDeactivated[t]=this._hash[t].tag);this._hash={},this._active=!1}}add(t,e){this._assertActivationState(!0);for(const i of t)this._add(i,e);this._notifyChanged$.next(this)}addDeactivated(t){this._assertActivationState(!1);for(const e of t){if(!(e instanceof hv||e instanceof uv||e instanceof av))throw new Error("Tag type not supported");this._hashDeactivated[e.id]=e}}get(t){return this.has(t)?this._hash[t]:void 0}getAll(){const t=this._hash;return Object.keys(t).map((e=>t[e]))}getAllDeactivated(){const t=this._hashDeactivated;return Object.keys(t).map((e=>t[e]))}getDeactivated(t){return this.hasDeactivated(t)?this._hashDeactivated[t]:void 0}has(t){return t in this._hash}hasDeactivated(t){return t in this._hashDeactivated}remove(t){this._assertActivationState(!0);const e=this._hash;for(const i of t)i in e&&delete e[i];this._notifyChanged$.next(this)}removeAll(){this._assertActivationState(!0),this._hash={},this._notifyChanged$.next(this)}removeAllDeactivated(){this._assertActivationState(!1),this._hashDeactivated={}}removeDeactivated(t){this._assertActivationState(!1);const e=this._hashDeactivated;for(const i of t)i in e&&delete e[i]}_add(t,e){if(t instanceof hv)this._hash[t.id]=new cv(t,e);else if(t instanceof uv)this._hash[t.id]=new lv(t,e);else{if(!(t instanceof av))throw new Error("Tag type not supported");this._hash[t.id]=new sv(t,e)}}_assertActivationState(t){if(t!==this._active)throw new Error("Tag set not in correct state for operation.")}}class pv extends xg{constructor(t){super();let e=t[0],i=t[1];if(e<0||e>1||i<0||i>1)throw new wg("Basic coordinates must be on the interval [0, 1].");this._point=t.slice()}get point(){return this._point}getCentroid2d(){return this._point.slice()}getCentroid3d(t){return t.unprojectBasic(this._point,200)}setCentroid2d(t,e){let i=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];this._point[0]=i[0],this._point[1]=i[1],this._notifyChanged$.next(this)}}class fv extends Tm{constructor(t,e,i,n){super(t,e,i),this._name=`${this._component.name}-${this._getNameExtension()}`,this._viewportCoords=n}_getConfiguration(t){return{}}_mouseEventToBasic(t,e,i,n,r,s){r=null!=r?r:0,s=null!=s?s:0;const[o,a]=this._viewportCoords.canvasPosition(t,e);return this._viewportCoords.canvasToBasic(o-r,a-s,e,n,i.perspective)}}class mv extends fv{constructor(t,e,i,n,r){super(t,e,i,n),this._tagCreator=r,this._geometryCreated$=new T}get geometryCreated$(){return this._geometryCreated$}_enable(){this._enableCreate(),this._container.container.classList.add("component-tag-create")}_disable(){this._container.container.classList.remove("component-tag-create"),this._disableCreate()}_validateBasic(t){const e=t[0],i=t[1];return 0<=e&&e<=1&&0<=i&&i<=1}_mouseEventToBasic$(t){return t.pipe(bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),rt((([t,e,i])=>this._mouseEventToBasic(t,this._container.container,e,i))))}}class gv extends mv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4),this._geometryCreatedSubscription=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(Nt(this._validateBasic),rt((t=>new pv(t)))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.undeferPixels(this._name),this._geometryCreatedSubscription.unsubscribe()}_getNameExtension(){return"create-point"}}class _v extends mv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4);const t=this._navigator.stateService.currentTransform$.pipe(rt((()=>{})),Ue(1),E());this._deleteSubscription=t.pipe(Je(1)).subscribe(this._tagCreator.delete$);const e=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(Ze());this._createSubscription=t.pipe(ri((()=>e.pipe(Nt(this._validateBasic),ve(1))))).subscribe(this._create$),this._setVertexSubscription=this._tagCreator.tag$.pipe(ri((t=>t?gt(G(t),Ot(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$),this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$):B()))).subscribe((([t,e,i,n])=>{const r=this._mouseEventToBasic(e,this._container.container,i,n);this._setVertex2d(t,r,n)})),this._addPointSubscription=this._tagCreator.tag$.pipe(ri((t=>t?gt(G(t),e):B()))).subscribe((([t,e])=>{this._addPoint(t,e)})),this._geometryCreateSubscription=this._tagCreator.tag$.pipe(ri((t=>t?t.created$.pipe(rt((t=>t.geometry))):B()))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.undeferPixels(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreateSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()}}class vv extends _v{get _create$(){return this._tagCreator.createPoints$}_addPoint(t,e){t.geometry.addPoint2d(e)}_getNameExtension(){return"create-points"}_setVertex2d(t,e,i){t.geometry.setPoint2d(t.geometry.points.length-1,e,i)}}class yv extends _v{get _create$(){return this._tagCreator.createPolygon$}_addPoint(t,e){t.addPoint(e)}_getNameExtension(){return"create-polygon"}_setVertex2d(t,e,i){t.geometry.setVertex2d(t.geometry.polygon.length-2,e,i)}}class bv extends _v{get _create$(){return this._tagCreator.createRect$}_addPoint(t,e){const i=t.geometry;i.validate(e)||(e=i.getNonAdjustedVertex2d(3)),t.addPoint(e)}_enable(){super._enable(),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(Nt((t=>!!t))).subscribe((t=>{t.geometry.initializeAnchorIndexing()}))}_disable(){super._disable(),this._initializeAnchorIndexingSubscription.unsubscribe()}_getNameExtension(){return"create-rect"}_setVertex2d(t,e,i){t.geometry.setOppositeVertex2d(e,i)}}class xv extends mv{_enableCreate(){this._container.mouseService.claimMouse(this._name,2),this._deleteSubscription=this._navigator.stateService.currentTransform$.pipe(rt((t=>null)),Je(1)).subscribe(this._tagCreator.delete$),this._createSubscription=this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$)).pipe(Nt(this._validateBasic)).subscribe(this._tagCreator.createRect$),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(Nt((t=>!!t))).subscribe((t=>{t.geometry.initializeAnchorIndexing()}));const t=gt(Ot(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseMove$),this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseMove$)),this._container.renderService.renderCamera$).pipe(bi(this._navigator.stateService.currentTransform$),rt((([[t,e],i])=>this._mouseEventToBasic(t,this._container.container,e,i))));this._setVertexSubscription=this._tagCreator.tag$.pipe(ri((e=>e?gt(G(e),t,this._navigator.stateService.currentTransform$):B()))).subscribe((([t,e,i])=>{t.geometry.setOppositeVertex2d(e,i)}));const e=this._container.mouseService.mouseDragEnd$.pipe(bi(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$)).pipe(Nt(this._validateBasic)),((t,e)=>e)),Ze());this._addPointSubscription=this._tagCreator.tag$.pipe(ri((t=>t?gt(G(t),e):B()))).subscribe((([t,e])=>{const i=t.geometry;i.validate(e)||(e=i.getNonAdjustedVertex2d(3)),t.addPoint(e)})),this._geometryCreatedSubscription=this._tagCreator.tag$.pipe(ri((t=>t?t.created$.pipe(rt((t=>t.geometry))):B()))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.unclaimMouse(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreatedSubscription.unsubscribe(),this._initializeAnchorIndexingSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()}_getNameExtension(){return"create-rect-drag"}}class wv extends fv{constructor(t,e,i,n,r){super(t,e,i,n),this._tagSet=r}_enable(){const t=this._tagSet.changed$.pipe(rt((t=>t.getAll())),ri((t=>bt(t).pipe(Mt((t=>t.interact$))))),ri((t=>At(G(t),this._container.mouseService.documentMouseUp$.pipe(rt((()=>({offsetX:0,offsetY:0,operation:tv.None,tag:null}))),Ee())))),Ze());Ot(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$).pipe(Ze()),this._claimMouseSubscription=t.pipe(ri((t=>t.tag?this._container.mouseService.domMouseDragStart$:B()))).subscribe((()=>{this._container.mouseService.claimMouse(this._name,3)})),this._cursorSubscription=t.pipe(rt((t=>t.cursor)),ue()).subscribe((t=>{const e=["crosshair","move","nesw-resize","nwse-resize"];for(const t of e)this._container.container.classList.remove(`component-tag-edit-${t}`);t&&this._container.container.classList.add(`component-tag-edit-${t}`)})),this._unclaimMouseSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDragEnd$).subscribe((t=>{this._container.mouseService.unclaimMouse(this._name)})),this._preventDefaultSubscription=t.pipe(ri((t=>t.tag?this._container.mouseService.documentMouseMove$:B()))).subscribe((t=>{t.preventDefault()})),this._updateGeometrySubscription=t.pipe(ri((t=>{if(t.operation===tv.None||!t.tag)return B();return gt(this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDrag$).pipe(Nt((t=>this._viewportCoords.insideElement(t,this._container.container)))),this._container.renderService.renderCamera$).pipe(bi(G(t),this._navigator.stateService.currentTransform$,(([t,e],i,n)=>[t,e,i,n])))}))).subscribe((([t,e,i,n])=>{const r=this._mouseEventToBasic(t,this._container.container,e,n,i.offsetX,i.offsetY),s=i.tag.geometry;i.operation===tv.Centroid?s.setCentroid2d(r,n):i.operation===tv.Vertex&&s.setVertex2d(i.vertexIndex,r,n)}))}_disable(){this._claimMouseSubscription.unsubscribe(),this._cursorSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._unclaimMouseSubscription.unsubscribe(),this._updateGeometrySubscription.unsubscribe()}_getNameExtension(){return"edit-vertex"}}class Sv extends Vf{constructor(t,e,i){super(t,e,i),this._tagDomRenderer=new J_,this._tagScene=new K_,this._tagSet=new dv,this._tagCreator=new Z_(this,i),this._viewportCoords=new Wf,this._createHandlers={CreatePoint:new gv(this,e,i,this._viewportCoords,this._tagCreator),CreatePoints:new vv(this,e,i,this._viewportCoords,this._tagCreator),CreatePolygon:new yv(this,e,i,this._viewportCoords,this._tagCreator),CreateRect:new bv(this,e,i,this._viewportCoords,this._tagCreator),CreateRectDrag:new xv(this,e,i,this._viewportCoords,this._tagCreator),Default:void 0},this._editVertexHandler=new wv(this,e,i,this._viewportCoords,this._tagSet),this._renderTags$=this._tagSet.changed$.pipe(rt((t=>{const e=t.getAll();return e.sort(((t,e)=>{const i=t.tag.id,n=e.tag.id;return i<n?-1:i>n?1:0})),e})),Ze()),this._tagChanged$=this._renderTags$.pipe(ri((t=>bt(t).pipe(Mt((t=>Ot(t.tag.changed$,t.tag.geometryChanged$)))))),Ze()),this._renderTagGLChanged$=this._renderTags$.pipe(ri((t=>bt(t).pipe(Mt((t=>t.glObjectsChanged$))))),Ze()),this._createGeometryChanged$=this._tagCreator.tag$.pipe(ri((t=>null!=t?t.geometryChanged$:B())),Ze()),this._createGLObjectsChanged$=this._tagCreator.tag$.pipe(ri((t=>null!=t?t.glObjectsChanged$:B())),Ze()),this._creatingConfiguration$=this._configuration$.pipe(ue(((t,e)=>t.mode===e.mode),(t=>({createColor:t.createColor,mode:t.mode}))),Ue(1),E()),this._creatingConfiguration$.subscribe((t=>{const e="tagmode",i={mode:t.mode,target:this,type:e};this.fire(e,i)}))}add(t){this._activated?this._navigator.stateService.currentTransform$.pipe(Ee()).subscribe((e=>{this._tagSet.add(t,e);const i=t.map((t=>this._tagSet.get(t.id)));this._tagScene.add(i)})):this._tagSet.addDeactivated(t)}calculateRect(t){return new Promise(((e,i)=>{this._navigator.stateService.currentTransform$.pipe(Ee(),rt((e=>t.getRect2d(e)))).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}create(){this._tagCreator.replayedTag$.pipe(Ee(),Nt((t=>!!t))).subscribe((t=>{t.create()}))}changeMode(t){this.configure({mode:t})}fire(t,e){super.fire(t,e)}get(t){if(this._activated){const e=this._tagSet.get(t);return void 0!==e?e.tag:void 0}return this._tagSet.getDeactivated(t)}getAll(){return this.activated?this._tagSet.getAll().map((t=>t.tag)):this._tagSet.getAllDeactivated()}getTagIdsAt(t){return new Promise(((e,i)=>{this._container.renderService.renderCamera$.pipe(Ee(),rt((e=>{const i=this._viewportCoords.canvasToViewport(t[0],t[1],this._container.container);return this._tagScene.intersectObjects(i,e.perspective)}))).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}has(t){return this._activated?this._tagSet.has(t):this._tagSet.hasDeactivated(t)}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}remove(t){this._activated?(this._tagSet.remove(t),this._tagScene.remove(t)):this._tagSet.removeDeactivated(t)}removeAll(){this._activated?(this._tagSet.removeAll(),this._tagScene.removeAll()):this._tagSet.removeAllDeactivated()}_activate(){this._editVertexHandler.enable();const e=bt(Object.keys(this._createHandlers)).pipe(rt((t=>this._createHandlers[t])),Nt((t=>!!t)),Mt((t=>t.geometryCreated$)),Ze()),i=this._subscriptions;i.push(e.subscribe((t=>{const e="geometrycreate",i={geometry:t,target:this,type:e};this.fire(e,i)}))),i.push(this._tagCreator.tag$.pipe(ti((t=>null==t)),ue()).subscribe((t=>{const e=null!=t?"tagcreatestart":"tagcreateend",i={target:this,type:e};this.fire(e,i)}))),i.push(e.subscribe((()=>{this.changeMode(t.TagMode.Default)}))),i.push(this._creatingConfiguration$.subscribe((e=>{this._disableCreateHandlers();const i=t.TagMode[e.mode],n=this._createHandlers[i];n&&n.enable()}))),i.push(this._renderTags$.subscribe((()=>{const t="tags",e={target:this,type:t};this.fire(t,e)}))),i.push(this._tagCreator.tag$.pipe(ri((t=>null!=t?t.aborted$.pipe(rt((()=>null))):B()))).subscribe((()=>{this.changeMode(t.TagMode.Default)}))),i.push(this._tagCreator.tag$.subscribe((t=>{this._tagScene.hasCreateTag()&&this._tagScene.removeCreateTag(),null!=t&&this._tagScene.addCreateTag(t)}))),i.push(this._createGLObjectsChanged$.subscribe((t=>{this._tagScene.updateCreateTagObjects(t)}))),i.push(this._renderTagGLChanged$.subscribe((t=>{this._tagScene.updateObjects(t)}))),i.push(this._tagChanged$.subscribe((()=>{this._tagScene.update()}))),i.push(gt(this._renderTags$.pipe(ni([]),pi((()=>{this._container.domRenderer.render$.next({name:this._name,vNode:this._tagDomRenderer.clear()})}))),this._container.renderService.renderCamera$,this._container.spriteService.spriteAtlas$,this._container.renderService.size$,this._tagChanged$.pipe(ni(null)),Ot(this._tagCreator.tag$,this._createGeometryChanged$).pipe(ni(null))).pipe(rt((([t,e,i,n,,r])=>({name:this._name,vNode:this._tagDomRenderer.render(t,r,i,e.perspective,n)})))).subscribe(this._container.domRenderer.render$)),i.push(this._navigator.stateService.currentState$.pipe(rt((t=>{const e=this._tagScene;return{name:this._name,renderer:{frameId:t.id,needsRender:e.needsRender,render:e.render.bind(e),pass:rm.Opaque}}}))).subscribe(this._container.glRenderer.render$)),this._navigator.stateService.currentTransform$.pipe(Ee()).subscribe((t=>{this._tagSet.activate(t),this._tagScene.add(this._tagSet.getAll())}))}_deactivate(){this._editVertexHandler.disable(),this._disableCreateHandlers(),this._tagScene.clear(),this._tagSet.deactivate(),this._tagCreator.delete$.next(null),this._subscriptions.unsubscribe(),this._container.container.classList.remove("component-tag-create")}_getDefaultConfiguration(){return{createColor:16777215,indicatePointsCompleter:!0,mode:t.TagMode.Default}}_disableCreateHandlers(){const t=this._createHandlers;for(const e in t){if(!t.hasOwnProperty(e))continue;const i=t[e];i&&i.disable()}}}Sv.componentName="tag";class Mv extends Vf{constructor(t,e,i){super(t,e,i),this._viewportCoords=new Wf,this._zoomDelta$=new T}_activate(){const e=this._subscriptions;e.push(gt(this._navigator.stateService.currentState$,this._navigator.stateService.state$,this._configuration$,this._container.renderService.size$).pipe(rt((([e,i,n,r])=>{const s=e.state.zoom,o=jf.h("div.mapillary-zoom-in-icon",[]),a=s>=3||i===vm.Waiting?jf.h("div.mapillary-zoom-in-button-inactive",[o]):jf.h("div.mapillary-zoom-in-button",{onclick:()=>{this._zoomDelta$.next(1)}},[o]),c=jf.h("div.mapillary-zoom-out-icon",[]),h=s<=0||i===vm.Waiting?jf.h("div.mapillary-zoom-out-button-inactive",[c]):jf.h("div.mapillary-zoom-out-button",{onclick:()=>{this._zoomDelta$.next(-1)}},[c]),l=n.size===t.ComponentSize.Small||n.size===t.ComponentSize.Automatic&&r.width<640?".mapillary-zoom-compact":"";return{name:this._name,vNode:jf.h("div.mapillary-zoom-container"+l,{oncontextmenu:t=>{t.preventDefault()}},[a,h])}}))).subscribe(this._container.domRenderer.render$)),e.push(this._zoomDelta$.pipe(bi(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([t,e,i])=>{const n=this._viewportCoords.unprojectFromViewport(0,0,e.perspective),r=i.projectBasic(n.toArray());this._navigator.stateService.zoomIn(t,r)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:t.ComponentSize.Automatic}}}Mv.componentName="zoom";class Tv extends Vf{constructor(t,e,i,n){super(t,e,i),this._canvasId=`${e.id}-${this._name}`,this._dom=n||new Xm}_activate(){const t=this._container.domRenderer.element$.pipe(rt((()=>this._dom.document.getElementById(this._canvasId))),Nt((t=>!!t)),rt((t=>{const e=t.parentElement,i=e.offsetWidth;return[t,{height:e.offsetHeight,width:i}]})),ue(((t,e)=>t.height===e.height&&t.width===e.width),(([,t])=>t)));this._subscriptions.push(gt(t,this._navigator.stateService.currentImage$).subscribe((([[t,e],i])=>{t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(i.image,0,0,e.width,e.height)}))),this._container.domRenderer.renderAdaptive$.next({name:this._name,vNode:jf.h(`canvas#${this._canvasId}`,[])})}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Tv.componentName="imagefallback";class Cv extends Vf{constructor(e,i,n){super(e,i,n),this._seqNames={},this._seqNames[t.NavigationDirection[t.NavigationDirection.Prev]]="-prev",this._seqNames[t.NavigationDirection[t.NavigationDirection.Next]]="-next",this._spaTopNames={},this._spaTopNames[t.NavigationDirection[t.NavigationDirection.TurnLeft]]="-turn-left",this._spaTopNames[t.NavigationDirection[t.NavigationDirection.StepLeft]]="-left",this._spaTopNames[t.NavigationDirection[t.NavigationDirection.StepForward]]="-forward",this._spaTopNames[t.NavigationDirection[t.NavigationDirection.StepRight]]="-right",this._spaTopNames[t.NavigationDirection[t.NavigationDirection.TurnRight]]="-turn-right",this._spaBottomNames={},this._spaBottomNames[t.NavigationDirection[t.NavigationDirection.TurnU]]="-turn-around",this._spaBottomNames[t.NavigationDirection[t.NavigationDirection.StepBackward]]="-backward"}_activate(){this._subscriptions.push(gt(this._navigator.stateService.currentImage$,this._configuration$).pipe(ri((([t,e])=>gt(e.sequence?t.sequenceEdges$.pipe(rt((t=>t.edges.map((t=>t.data.direction))))):G([]),!dd(t.cameraType)&&e.spatial?t.spatialEdges$.pipe(rt((t=>t.edges.map((t=>t.data.direction))))):G([])).pipe(rt((([t,e])=>t.concat(e)))))),rt((t=>{const e=this._createArrowRow(this._seqNames,t),i=this._createArrowRow(this._spaTopNames,t),n=this._createArrowRow(this._spaBottomNames,t),r=jf.h("div.mapillary-navigation-sequence",e),s=jf.h("div.NavigationSpatialTop",i),o=jf.h("div.mapillary-navigation-spatial-bottom",n),a=jf.h("div.mapillary-navigation-spatial",[s,o]);return{name:this._name,vNode:jf.h("div.NavigationContainer",[r,a])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{sequence:!0,spatial:!0}}_createArrowRow(e,i){const n=[];for(const r in e){if(!e.hasOwnProperty(r))continue;const s=t.NavigationDirection[r];-1!==i.indexOf(s)?n.push(this._createVNode(s,e[r],"visible")):n.push(this._createVNode(s,e[r],"hidden"))}return n}_createVNode(t,e,i){return jf.h(`span.mapillary-navigation-button.mapillary-navigation${e}`,{onclick:()=>{this._navigator.moveDir$(t).subscribe(void 0,(t=>{t instanceof Zf||console.error(t)}))},style:{visibility:i}},[])}}Cv.componentName="navigationfallback";function Ev(t){let e=t.length;for(;--e>=0;)t[e]=0}const Iv=256,Av=286,Pv=30,Rv=15,Lv=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),Ov=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),Nv=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),Dv=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),$v=new Array(576);Ev($v);const kv=new Array(60);Ev(kv);const zv=new Array(512);Ev(zv);const Fv=new Array(256);Ev(Fv);const Bv=new Array(29);Ev(Bv);const jv=new Array(Pv);function Hv(t,e,i,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=n,this.max_length=r,this.has_stree=t&&t.length}let Uv,Vv,Gv;function qv(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}Ev(jv);const Wv=t=>t<256?zv[t]:zv[256+(t>>>7)],Xv=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Yv=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<<t.bi_valid&65535,Xv(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=i)},Zv=(t,e,i)=>{Yv(t,i[2*e],i[2*e+1])},Jv=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Kv=(t,e,i)=>{const n=new Array(16);let r,s,o=0;for(r=1;r<=Rv;r++)n[r]=o=o+i[r-1]<<1;for(s=0;s<=e;s++){let e=t[2*s+1];0!==e&&(t[2*s]=Jv(n[e]++,e))}},Qv=t=>{let e;for(e=0;e<Av;e++)t.dyn_ltree[2*e]=0;for(e=0;e<Pv;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},ty=t=>{t.bi_valid>8?Xv(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},ey=(t,e,i,n)=>{const r=2*e,s=2*i;return t[r]<t[s]||t[r]===t[s]&&n[e]<=n[i]},iy=(t,e,i)=>{const n=t.heap[i];let r=i<<1;for(;r<=t.heap_len&&(r<t.heap_len&&ey(e,t.heap[r+1],t.heap[r],t.depth)&&r++,!ey(e,n,t.heap[r],t.depth));)t.heap[i]=t.heap[r],i=r,r<<=1;t.heap[i]=n},ny=(t,e,i)=>{let n,r,s,o,a=0;if(0!==t.last_lit)do{n=t.pending_buf[t.d_buf+2*a]<<8|t.pending_buf[t.d_buf+2*a+1],r=t.pending_buf[t.l_buf+a],a++,0===n?Zv(t,r,e):(s=Fv[r],Zv(t,s+Iv+1,e),o=Lv[s],0!==o&&(r-=Bv[s],Yv(t,r,o)),n--,s=Wv(n),Zv(t,s,i),o=Ov[s],0!==o&&(n-=jv[s],Yv(t,n,o)))}while(a<t.last_lit);Zv(t,256,e)},ry=(t,e)=>{const i=e.dyn_tree,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,s=e.stat_desc.elems;let o,a,c,h=-1;for(t.heap_len=0,t.heap_max=573,o=0;o<s;o++)0!==i[2*o]?(t.heap[++t.heap_len]=h=o,t.depth[o]=0):i[2*o+1]=0;for(;t.heap_len<2;)c=t.heap[++t.heap_len]=h<2?++h:0,i[2*c]=1,t.depth[c]=0,t.opt_len--,r&&(t.static_len-=n[2*c+1]);for(e.max_code=h,o=t.heap_len>>1;o>=1;o--)iy(t,i,o);c=s;do{o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],iy(t,i,1),a=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=a,i[2*c]=i[2*o]+i[2*a],t.depth[c]=(t.depth[o]>=t.depth[a]?t.depth[o]:t.depth[a])+1,i[2*o+1]=i[2*a+1]=c,t.heap[1]=c++,iy(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,n=e.max_code,r=e.stat_desc.static_tree,s=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,a=e.stat_desc.extra_base,c=e.stat_desc.max_length;let h,l,u,d,p,f,m=0;for(d=0;d<=Rv;d++)t.bl_count[d]=0;for(i[2*t.heap[t.heap_max]+1]=0,h=t.heap_max+1;h<573;h++)l=t.heap[h],d=i[2*i[2*l+1]+1]+1,d>c&&(d=c,m++),i[2*l+1]=d,l>n||(t.bl_count[d]++,p=0,l>=a&&(p=o[l-a]),f=i[2*l],t.opt_len+=f*(d+p),s&&(t.static_len+=f*(r[2*l+1]+p)));if(0!==m){do{for(d=c-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[c]--,m-=2}while(m>0);for(d=c;0!==d;d--)for(l=t.bl_count[d];0!==l;)u=t.heap[--h],u>n||(i[2*u+1]!==d&&(t.opt_len+=(d-i[2*u+1])*i[2*u],i[2*u+1]=d),l--)}})(t,e),Kv(i,h,t.bl_count)},sy=(t,e,i)=>{let n,r,s=-1,o=e[1],a=0,c=7,h=4;for(0===o&&(c=138,h=3),e[2*(i+1)+1]=65535,n=0;n<=i;n++)r=o,o=e[2*(n+1)+1],++a<c&&r===o||(a<h?t.bl_tree[2*r]+=a:0!==r?(r!==s&&t.bl_tree[2*r]++,t.bl_tree[32]++):a<=10?t.bl_tree[34]++:t.bl_tree[36]++,a=0,s=r,0===o?(c=138,h=3):r===o?(c=6,h=3):(c=7,h=4))},oy=(t,e,i)=>{let n,r,s=-1,o=e[1],a=0,c=7,h=4;for(0===o&&(c=138,h=3),n=0;n<=i;n++)if(r=o,o=e[2*(n+1)+1],!(++a<c&&r===o)){if(a<h)do{Zv(t,r,t.bl_tree)}while(0!=--a);else 0!==r?(r!==s&&(Zv(t,r,t.bl_tree),a--),Zv(t,16,t.bl_tree),Yv(t,a-3,2)):a<=10?(Zv(t,17,t.bl_tree),Yv(t,a-3,3)):(Zv(t,18,t.bl_tree),Yv(t,a-11,7));a=0,s=r,0===o?(c=138,h=3):r===o?(c=6,h=3):(c=7,h=4)}};let ay=!1;const cy=(t,e,i,n)=>{Yv(t,0+(n?1:0),3),((t,e,i,n)=>{ty(t),n&&(Xv(t,i),Xv(t,~i)),t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i})(t,e,i,!0)};var hy={_tr_init:t=>{ay||((()=>{let t,e,i,n,r;const s=new Array(16);for(i=0,n=0;n<28;n++)for(Bv[n]=i,t=0;t<1<<Lv[n];t++)Fv[i++]=n;for(Fv[i-1]=n,r=0,n=0;n<16;n++)for(jv[n]=r,t=0;t<1<<Ov[n];t++)zv[r++]=n;for(r>>=7;n<Pv;n++)for(jv[n]=r<<7,t=0;t<1<<Ov[n]-7;t++)zv[256+r++]=n;for(e=0;e<=Rv;e++)s[e]=0;for(t=0;t<=143;)$v[2*t+1]=8,t++,s[8]++;for(;t<=255;)$v[2*t+1]=9,t++,s[9]++;for(;t<=279;)$v[2*t+1]=7,t++,s[7]++;for(;t<=287;)$v[2*t+1]=8,t++,s[8]++;for(Kv($v,287,s),t=0;t<Pv;t++)kv[2*t+1]=5,kv[2*t]=Jv(t,5);Uv=new Hv($v,Lv,257,Av,Rv),Vv=new Hv(kv,Ov,0,Pv,Rv),Gv=new Hv(new Array(0),Nv,0,19,7)})(),ay=!0),t.l_desc=new qv(t.dyn_ltree,Uv),t.d_desc=new qv(t.dyn_dtree,Vv),t.bl_desc=new qv(t.bl_tree,Gv),t.bi_buf=0,t.bi_valid=0,Qv(t)},_tr_stored_block:cy,_tr_flush_block:(t,e,i,n)=>{let r,s,o=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<Iv;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),ry(t,t.l_desc),ry(t,t.d_desc),o=(t=>{let e;for(sy(t,t.dyn_ltree,t.l_desc.max_code),sy(t,t.dyn_dtree,t.d_desc.max_code),ry(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*Dv[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,s=t.static_len+3+7>>>3,s<=r&&(r=s)):r=s=i+5,i+4<=r&&-1!==e?cy(t,e,i,n):4===t.strategy||s===r?(Yv(t,2+(n?1:0),3),ny(t,$v,kv)):(Yv(t,4+(n?1:0),3),((t,e,i,n)=>{let r;for(Yv(t,e-257,5),Yv(t,i-1,5),Yv(t,n-4,4),r=0;r<n;r++)Yv(t,t.bl_tree[2*Dv[r]+1],3);oy(t,t.dyn_ltree,e-1),oy(t,t.dyn_dtree,i-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,o+1),ny(t,t.dyn_ltree,t.dyn_dtree)),Qv(t),n&&ty(t)},_tr_tally:(t,e,i)=>(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&i,t.last_lit++,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(Fv[i]+Iv+1)]++,t.dyn_dtree[2*Wv(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{Yv(t,2,3),Zv(t,256,$v),(t=>{16===t.bi_valid?(Xv(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var ly=(t,e,i,n)=>{let r=65535&t|0,s=t>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{r=r+e[n++]|0,s=s+r|0}while(--o);r%=65521,s%=65521}return r|s<<16|0};const uy=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var dy=(t,e,i,n)=>{const r=uy,s=n+i;t^=-1;for(let i=n;i<s;i++)t=t>>>8^r[255&(t^e[i])];return-1^t},py={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},fy={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:my,_tr_stored_block:gy,_tr_flush_block:_y,_tr_tally:vy,_tr_align:yy}=hy,{Z_NO_FLUSH:by,Z_PARTIAL_FLUSH:xy,Z_FULL_FLUSH:wy,Z_FINISH:Sy,Z_BLOCK:My,Z_OK:Ty,Z_STREAM_END:Cy,Z_STREAM_ERROR:Ey,Z_DATA_ERROR:Iy,Z_BUF_ERROR:Ay,Z_DEFAULT_COMPRESSION:Py,Z_FILTERED:Ry,Z_HUFFMAN_ONLY:Ly,Z_RLE:Oy,Z_FIXED:Ny,Z_DEFAULT_STRATEGY:Dy,Z_UNKNOWN:$y,Z_DEFLATED:ky}=fy,zy=258,Fy=262,By=103,jy=113,Hy=666,Uy=(t,e)=>(t.msg=py[e],e),Vy=t=>(t<<1)-(t>4?9:0),Gy=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let qy=(t,e,i)=>(e<<t.hash_shift^i)&t.hash_mask;const Wy=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},Xy=(t,e)=>{_y(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Wy(t.strm)},Yy=(t,e)=>{t.pending_buf[t.pending++]=e},Zy=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Jy=(t,e,i,n)=>{let r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),i),1===t.state.wrap?t.adler=ly(t.adler,e,r,i):2===t.state.wrap&&(t.adler=dy(t.adler,e,r,i)),t.next_in+=r,t.total_in+=r,r)},Ky=(t,e)=>{let i,n,r=t.max_chain_length,s=t.strstart,o=t.prev_length,a=t.nice_match;const c=t.strstart>t.w_size-Fy?t.strstart-(t.w_size-Fy):0,h=t.window,l=t.w_mask,u=t.prev,d=t.strstart+zy;let p=h[s+o-1],f=h[s+o];t.prev_length>=t.good_match&&(r>>=2),a>t.lookahead&&(a=t.lookahead);do{if(i=e,h[i+o]===f&&h[i+o-1]===p&&h[i]===h[s]&&h[++i]===h[s+1]){s+=2,i++;do{}while(h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&h[++s]===h[++i]&&s<d);if(n=zy-(d-s),s=d-zy,n>o){if(t.match_start=e,o=n,n>=a)break;p=h[s+o-1],f=h[s+o]}}}while((e=u[e&l])>c&&0!=--r);return o<=t.lookahead?o:t.lookahead},Qy=t=>{const e=t.w_size;let i,n,r,s,o;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Fy)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,n=t.hash_size,i=n;do{r=t.head[--i],t.head[i]=r>=e?r-e:0}while(--n);n=e,i=n;do{r=t.prev[--i],t.prev[i]=r>=e?r-e:0}while(--n);s+=e}if(0===t.strm.avail_in)break;if(n=Jy(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=n,t.lookahead+t.insert>=3)for(o=t.strstart-t.insert,t.ins_h=t.window[o],t.ins_h=qy(t,t.ins_h,t.window[o+1]);t.insert&&(t.ins_h=qy(t,t.ins_h,t.window[o+3-1]),t.prev[o&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=o,o++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Fy&&0!==t.strm.avail_in)},tb=(t,e)=>{let i,n;for(;;){if(t.lookahead<Fy){if(Qy(t),t.lookahead<Fy&&e===by)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=qy(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==i&&t.strstart-i<=t.w_size-Fy&&(t.match_length=Ky(t,i)),t.match_length>=3)if(n=vy(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=qy(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=qy(t,t.ins_h,t.window[t.strstart+1]);else n=vy(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(Xy(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===Sy?(Xy(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Xy(t,!1),0===t.strm.avail_out)?1:2},eb=(t,e)=>{let i,n,r;for(;;){if(t.lookahead<Fy){if(Qy(t),t.lookahead<Fy&&e===by)return 1;if(0===t.lookahead)break}if(i=0,t.lookahead>=3&&(t.ins_h=qy(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length<t.max_lazy_match&&t.strstart-i<=t.w_size-Fy&&(t.match_length=Ky(t,i),t.match_length<=5&&(t.strategy===Ry||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,n=vy(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=qy(t,t.ins_h,t.window[t.strstart+3-1]),i=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(Xy(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(n=vy(t,0,t.window[t.strstart-1]),n&&Xy(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=vy(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===Sy?(Xy(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Xy(t,!1),0===t.strm.avail_out)?1:2};function ib(t,e,i,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=n,this.func=r}const nb=[new ib(0,0,0,0,((t,e)=>{let i=65535;for(i>t.pending_buf_size-5&&(i=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Qy(t),0===t.lookahead&&e===by)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const n=t.block_start+i;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,Xy(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-Fy&&(Xy(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===Sy?(Xy(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(Xy(t,!1),t.strm.avail_out),1)})),new ib(4,4,8,4,tb),new ib(4,5,16,8,tb),new ib(4,6,32,32,tb),new ib(4,4,16,16,eb),new ib(8,16,32,32,eb),new ib(8,16,128,128,eb),new ib(8,32,128,256,eb),new ib(32,128,258,1024,eb),new ib(32,258,258,4096,eb)];function rb(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ky,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Gy(this.dyn_ltree),Gy(this.dyn_dtree),Gy(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Gy(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Gy(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const sb=t=>{if(!t||!t.state)return Uy(t,Ey);t.total_in=t.total_out=0,t.data_type=$y;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:jy,t.adler=2===e.wrap?0:1,e.last_flush=by,my(e),Ty},ob=t=>{const e=sb(t);var i;return e===Ty&&((i=t.state).window_size=2*i.w_size,Gy(i.head),i.max_lazy_match=nb[i.level].max_lazy,i.good_match=nb[i.level].good_length,i.nice_match=nb[i.level].nice_length,i.max_chain_length=nb[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},ab=(t,e,i,n,r,s)=>{if(!t)return Ey;let o=1;if(e===Py&&(e=6),n<0?(o=0,n=-n):n>15&&(o=2,n-=16),r<1||r>9||i!==ky||n<8||n>15||e<0||e>9||s<0||s>Ny)return Uy(t,Ey);8===n&&(n=9);const a=new rb;return t.state=a,a.strm=t,a.wrap=o,a.gzhead=null,a.w_bits=n,a.w_size=1<<a.w_bits,a.w_mask=a.w_size-1,a.hash_bits=r+7,a.hash_size=1<<a.hash_bits,a.hash_mask=a.hash_size-1,a.hash_shift=~~((a.hash_bits+3-1)/3),a.window=new Uint8Array(2*a.w_size),a.head=new Uint16Array(a.hash_size),a.prev=new Uint16Array(a.w_size),a.lit_bufsize=1<<r+6,a.pending_buf_size=4*a.lit_bufsize,a.pending_buf=new Uint8Array(a.pending_buf_size),a.d_buf=1*a.lit_bufsize,a.l_buf=3*a.lit_bufsize,a.level=e,a.strategy=s,a.method=i,ob(t)};var cb={deflateInit:(t,e)=>ab(t,e,ky,15,8,Dy),deflateInit2:ab,deflateReset:ob,deflateResetKeep:sb,deflateSetHeader:(t,e)=>t&&t.state?2!==t.state.wrap?Ey:(t.state.gzhead=e,Ty):Ey,deflate:(t,e)=>{let i,n;if(!t||!t.state||e>My||e<0)return t?Uy(t,Ey):Ey;const r=t.state;if(!t.output||!t.input&&0!==t.avail_in||r.status===Hy&&e!==Sy)return Uy(t,0===t.avail_out?Ay:Ey);r.strm=t;const s=r.last_flush;if(r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,Yy(r,31),Yy(r,139),Yy(r,8),r.gzhead?(Yy(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Yy(r,255&r.gzhead.time),Yy(r,r.gzhead.time>>8&255),Yy(r,r.gzhead.time>>16&255),Yy(r,r.gzhead.time>>24&255),Yy(r,9===r.level?2:r.strategy>=Ly||r.level<2?4:0),Yy(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Yy(r,255&r.gzhead.extra.length),Yy(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=dy(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(Yy(r,0),Yy(r,0),Yy(r,0),Yy(r,0),Yy(r,0),Yy(r,9===r.level?2:r.strategy>=Ly||r.level<2?4:0),Yy(r,3),r.status=jy);else{let e=ky+(r.w_bits-8<<4)<<8,i=-1;i=r.strategy>=Ly||r.level<2?0:r.level<6?1:6===r.level?2:3,e|=i<<6,0!==r.strstart&&(e|=32),e+=31-e%31,r.status=jy,Zy(r,e),0!==r.strstart&&(Zy(r,t.adler>>>16),Zy(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(i=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),Wy(t),i=r.pending,r.pending!==r.pending_buf_size));)Yy(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),Wy(t),i=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindex<r.gzhead.name.length?255&r.gzhead.name.charCodeAt(r.gzindex++):0,Yy(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),Wy(t),i=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindex<r.gzhead.comment.length?255&r.gzhead.comment.charCodeAt(r.gzindex++):0,Yy(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(t.adler=dy(t.adler,r.pending_buf,r.pending-i,i)),0===n&&(r.status=By)}else r.status=By;if(r.status===By&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Wy(t),r.pending+2<=r.pending_buf_size&&(Yy(r,255&t.adler),Yy(r,t.adler>>8&255),t.adler=0,r.status=jy)):r.status=jy),0!==r.pending){if(Wy(t),0===t.avail_out)return r.last_flush=-1,Ty}else if(0===t.avail_in&&Vy(e)<=Vy(s)&&e!==Sy)return Uy(t,Ay);if(r.status===Hy&&0!==t.avail_in)return Uy(t,Ay);if(0!==t.avail_in||0!==r.lookahead||e!==by&&r.status!==Hy){let i=r.strategy===Ly?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(Qy(t),0===t.lookahead)){if(e===by)return 1;break}if(t.match_length=0,i=vy(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(Xy(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===Sy?(Xy(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Xy(t,!1),0===t.strm.avail_out)?1:2})(r,e):r.strategy===Oy?((t,e)=>{let i,n,r,s;const o=t.window;for(;;){if(t.lookahead<=zy){if(Qy(t),t.lookahead<=zy&&e===by)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,n=o[r],n===o[++r]&&n===o[++r]&&n===o[++r])){s=t.strstart+zy;do{}while(n===o[++r]&&n===o[++r]&&n===o[++r]&&n===o[++r]&&n===o[++r]&&n===o[++r]&&n===o[++r]&&n===o[++r]&&r<s);t.match_length=zy-(s-r),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=vy(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=vy(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(Xy(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===Sy?(Xy(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Xy(t,!1),0===t.strm.avail_out)?1:2})(r,e):nb[r.level].func(r,e);if(3!==i&&4!==i||(r.status=Hy),1===i||3===i)return 0===t.avail_out&&(r.last_flush=-1),Ty;if(2===i&&(e===xy?yy(r):e!==My&&(gy(r,0,0,!1),e===wy&&(Gy(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Wy(t),0===t.avail_out))return r.last_flush=-1,Ty}return e!==Sy?Ty:r.wrap<=0?Cy:(2===r.wrap?(Yy(r,255&t.adler),Yy(r,t.adler>>8&255),Yy(r,t.adler>>16&255),Yy(r,t.adler>>24&255),Yy(r,255&t.total_in),Yy(r,t.total_in>>8&255),Yy(r,t.total_in>>16&255),Yy(r,t.total_in>>24&255)):(Zy(r,t.adler>>>16),Zy(r,65535&t.adler)),Wy(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?Ty:Cy)},deflateEnd:t=>{if(!t||!t.state)return Ey;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&e!==By&&e!==jy&&e!==Hy?Uy(t,Ey):(t.state=null,e===jy?Uy(t,Iy):Ty)},deflateSetDictionary:(t,e)=>{let i=e.length;if(!t||!t.state)return Ey;const n=t.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return Ey;if(1===r&&(t.adler=ly(t.adler,e,i,0)),n.wrap=0,i>=n.w_size){0===r&&(Gy(n.head),n.strstart=0,n.block_start=0,n.insert=0);let t=new Uint8Array(n.w_size);t.set(e.subarray(i-n.w_size,i),0),e=t,i=n.w_size}const s=t.avail_in,o=t.next_in,a=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,Qy(n);n.lookahead>=3;){let t=n.strstart,e=n.lookahead-2;do{n.ins_h=qy(n,n.ins_h,n.window[t+3-1]),n.prev[t&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=t,t++}while(--e);n.strstart=t,n.lookahead=2,Qy(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=o,t.input=a,t.avail_in=s,n.wrap=r,Ty},deflateInfo:"pako deflate (from Nodeca project)"};const hb=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var lb=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)hb(i,e)&&(t[e]=i[e])}}return t},ub=t=>{let e=0;for(let i=0,n=t.length;i<n;i++)e+=t[i].length;const i=new Uint8Array(e);for(let e=0,n=0,r=t.length;e<r;e++){let r=t[e];i.set(r,n),n+=r.length}return i};let db=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){db=!1}const pb=new Uint8Array(256);for(let t=0;t<256;t++)pb[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;pb[254]=pb[254]=1;var fb=t=>{let e,i,n,r,s,o=t.length,a=0;for(r=0;r<o;r++)i=t.charCodeAt(r),55296==(64512&i)&&r+1<o&&(n=t.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),a+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(a),s=0,r=0;s<a;r++)i=t.charCodeAt(r),55296==(64512&i)&&r+1<o&&(n=t.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),i<128?e[s++]=i:i<2048?(e[s++]=192|i>>>6,e[s++]=128|63&i):i<65536?(e[s++]=224|i>>>12,e[s++]=128|i>>>6&63,e[s++]=128|63&i):(e[s++]=240|i>>>18,e[s++]=128|i>>>12&63,e[s++]=128|i>>>6&63,e[s++]=128|63&i);return e},mb=(t,e)=>{let i,n;const r=e||t.length,s=new Array(2*r);for(n=0,i=0;i<r;){let e=t[i++];if(e<128){s[n++]=e;continue}let o=pb[e];if(o>4)s[n++]=65533,i+=o-1;else{for(e&=2===o?31:3===o?15:7;o>1&&i<r;)e=e<<6|63&t[i++],o--;o>1?s[n++]=65533:e<65536?s[n++]=e:(e-=65536,s[n++]=55296|e>>10&1023,s[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&db)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let i="";for(let n=0;n<e;n++)i+=String.fromCharCode(t[n]);return i})(s,n)},gb=(t,e)=>{(e=e||t.length)>t.length&&(e=t.length);let i=e-1;for(;i>=0&&128==(192&t[i]);)i--;return i<0||0===i?e:i+pb[t[i]]>e?i:e};var _b=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const vb=Object.prototype.toString,{Z_NO_FLUSH:yb,Z_SYNC_FLUSH:bb,Z_FULL_FLUSH:xb,Z_FINISH:wb,Z_OK:Sb,Z_STREAM_END:Mb,Z_DEFAULT_COMPRESSION:Tb,Z_DEFAULT_STRATEGY:Cb,Z_DEFLATED:Eb}=fy;function Ib(t){this.options=lb({level:Tb,method:Eb,chunkSize:16384,windowBits:15,memLevel:8,strategy:Cb},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new _b,this.strm.avail_out=0;let i=cb.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(i!==Sb)throw new Error(py[i]);if(e.header&&cb.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?fb(e.dictionary):"[object ArrayBuffer]"===vb.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=cb.deflateSetDictionary(this.strm,t),i!==Sb)throw new Error(py[i]);this._dict_set=!0}}Ib.prototype.push=function(t,e){const i=this.strm,n=this.options.chunkSize;let r,s;if(this.ended)return!1;for(s=e===~~e?e:!0===e?wb:yb,"string"==typeof t?i.input=fb(t):"[object ArrayBuffer]"===vb.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),(s===bb||s===xb)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(r=cb.deflate(i,s),r===Mb)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),r=cb.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===Sb;if(0!==i.avail_out){if(s>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},Ib.prototype.onData=function(t){this.chunks.push(t)},Ib.prototype.onEnd=function(t){t===Sb&&(this.result=ub(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Ab=function(t,e){let i,n,r,s,o,a,c,h,l,u,d,p,f,m,g,_,v,y,b,x,w,S,M,T;const C=t.state;i=t.next_in,M=t.input,n=i+(t.avail_in-5),r=t.next_out,T=t.output,s=r-(e-t.avail_out),o=r+(t.avail_out-257),a=C.dmax,c=C.wsize,h=C.whave,l=C.wnext,u=C.window,d=C.hold,p=C.bits,f=C.lencode,m=C.distcode,g=(1<<C.lenbits)-1,_=(1<<C.distbits)-1;t:do{p<15&&(d+=M[i++]<<p,p+=8,d+=M[i++]<<p,p+=8),v=f[d&g];e:for(;;){if(y=v>>>24,d>>>=y,p-=y,y=v>>>16&255,0===y)T[r++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=f[(65535&v)+(d&(1<<y)-1)];continue e}if(32&y){C.mode=12;break t}t.msg="invalid literal/length code",C.mode=30;break t}b=65535&v,y&=15,y&&(p<y&&(d+=M[i++]<<p,p+=8),b+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=M[i++]<<p,p+=8,d+=M[i++]<<p,p+=8),v=m[d&_];i:for(;;){if(y=v>>>24,d>>>=y,p-=y,y=v>>>16&255,!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue i}t.msg="invalid distance code",C.mode=30;break t}if(x=65535&v,y&=15,p<y&&(d+=M[i++]<<p,p+=8,p<y&&(d+=M[i++]<<p,p+=8)),x+=d&(1<<y)-1,x>a){t.msg="invalid distance too far back",C.mode=30;break t}if(d>>>=y,p-=y,y=r-s,x>y){if(y=x-y,y>h&&C.sane){t.msg="invalid distance too far back",C.mode=30;break t}if(w=0,S=u,0===l){if(w+=c-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,S=T}}else if(l<y){if(w+=c+l-y,y-=l,y<b){b-=y;do{T[r++]=u[w++]}while(--y);if(w=0,l<b){y=l,b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,S=T}}}else if(w+=l-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,S=T}for(;b>2;)T[r++]=S[w++],T[r++]=S[w++],T[r++]=S[w++],b-=3;b&&(T[r++]=S[w++],b>1&&(T[r++]=S[w++]))}else{w=r-x;do{T[r++]=T[w++],T[r++]=T[w++],T[r++]=T[w++],b-=3}while(b>2);b&&(T[r++]=T[w++],b>1&&(T[r++]=T[w++]))}break}}break}}while(i<n&&r<o);b=p>>3,i-=b,p-=b<<3,d&=(1<<p)-1,t.next_in=i,t.next_out=r,t.avail_in=i<n?n-i+5:5-(i-n),t.avail_out=r<o?o-r+257:257-(r-o),C.hold=d,C.bits=p};const Pb=15,Rb=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),Lb=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),Ob=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),Nb=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]);var Db=(t,e,i,n,r,s,o,a)=>{const c=a.bits;let h,l,u,d,p,f,m=0,g=0,_=0,v=0,y=0,b=0,x=0,w=0,S=0,M=0,T=null,C=0;const E=new Uint16Array(16),I=new Uint16Array(16);let A,P,R,L=null,O=0;for(m=0;m<=Pb;m++)E[m]=0;for(g=0;g<n;g++)E[e[i+g]]++;for(y=c,v=Pb;v>=1&&0===E[v];v--);if(y>v&&(y=v),0===v)return r[s++]=20971520,r[s++]=20971520,a.bits=1,0;for(_=1;_<v&&0===E[_];_++);for(y<_&&(y=_),w=1,m=1;m<=Pb;m++)if(w<<=1,w-=E[m],w<0)return-1;if(w>0&&(0===t||1!==v))return-1;for(I[1]=0,m=1;m<Pb;m++)I[m+1]=I[m]+E[m];for(g=0;g<n;g++)0!==e[i+g]&&(o[I[e[i+g]]++]=g);if(0===t?(T=L=o,f=19):1===t?(T=Rb,C-=257,L=Lb,O-=257,f=256):(T=Ob,L=Nb,f=-1),M=0,g=0,m=_,p=s,b=y,x=0,u=-1,S=1<<y,d=S-1,1===t&&S>852||2===t&&S>592)return 1;for(;;){A=m-x,o[g]<f?(P=0,R=o[g]):o[g]>f?(P=L[O+o[g]],R=T[C+o[g]]):(P=96,R=0),h=1<<m-x,l=1<<b,_=l;do{l-=h,r[p+(M>>x)+l]=A<<24|P<<16|R|0}while(0!==l);for(h=1<<m-1;M&h;)h>>=1;if(0!==h?(M&=h-1,M+=h):M=0,g++,0==--E[m]){if(m===v)break;m=e[i+o[g]]}if(m>y&&(M&d)!==u){for(0===x&&(x=y),p+=_,b=m-x,w=1<<b;b+x<v&&(w-=E[b+x],!(w<=0));)b++,w<<=1;if(S+=1<<b,1===t&&S>852||2===t&&S>592)return 1;u=M&d,r[u]=y<<24|b<<16|p-s|0}}return 0!==M&&(r[p+M]=m-x<<24|64<<16|0),a.bits=y,0};const{Z_FINISH:$b,Z_BLOCK:kb,Z_TREES:zb,Z_OK:Fb,Z_STREAM_END:Bb,Z_NEED_DICT:jb,Z_STREAM_ERROR:Hb,Z_DATA_ERROR:Ub,Z_MEM_ERROR:Vb,Z_BUF_ERROR:Gb,Z_DEFLATED:qb}=fy,Wb=12,Xb=30,Yb=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Zb(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Jb=t=>{if(!t||!t.state)return Hb;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,Fb},Kb=t=>{if(!t||!t.state)return Hb;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Jb(t)},Qb=(t,e)=>{let i;if(!t||!t.state)return Hb;const n=t.state;return e<0?(i=0,e=-e):(i=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?Hb:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=i,n.wbits=e,Kb(t))},tx=(t,e)=>{if(!t)return Hb;const i=new Zb;t.state=i,i.window=null;const n=Qb(t,e);return n!==Fb&&(t.state=null),n};let ex,ix,nx=!0;const rx=t=>{if(nx){ex=new Int32Array(512),ix=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Db(1,t.lens,0,288,ex,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Db(2,t.lens,0,32,ix,0,t.work,{bits:5}),nx=!1}t.lencode=ex,t.lenbits=9,t.distcode=ix,t.distbits=5},sx=(t,e,i,n)=>{let r;const s=t.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new Uint8Array(s.wsize)),n>=s.wsize?(s.window.set(e.subarray(i-s.wsize,i),0),s.wnext=0,s.whave=s.wsize):(r=s.wsize-s.wnext,r>n&&(r=n),s.window.set(e.subarray(i-n,i-n+r),s.wnext),(n-=r)?(s.window.set(e.subarray(i-n,i),0),s.wnext=n,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=r))),0};var ox={inflateReset:Kb,inflateReset2:Qb,inflateResetKeep:Jb,inflateInit:t=>tx(t,15),inflateInit2:tx,inflate:(t,e)=>{let i,n,r,s,o,a,c,h,l,u,d,p,f,m,g,_,v,y,b,x,w,S,M=0;const T=new Uint8Array(4);let C,E;const I=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return Hb;i=t.state,i.mode===Wb&&(i.mode=13),o=t.next_out,r=t.output,c=t.avail_out,s=t.next_in,n=t.input,a=t.avail_in,h=i.hold,l=i.bits,u=a,d=c,S=Fb;t:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;l<16;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(2&i.wrap&&35615===h){i.check=0,T[0]=255&h,T[1]=h>>>8&255,i.check=dy(i.check,T,2,0),h=0,l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",i.mode=Xb;break}if((15&h)!==qb){t.msg="unknown compression method",i.mode=Xb;break}if(h>>>=4,l-=4,w=8+(15&h),0===i.wbits)i.wbits=w;else if(w>i.wbits){t.msg="invalid window size",i.mode=Xb;break}i.dmax=1<<i.wbits,t.adler=i.check=1,i.mode=512&h?10:Wb,h=0,l=0;break;case 2:for(;l<16;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(i.flags=h,(255&i.flags)!==qb){t.msg="unknown compression method",i.mode=Xb;break}if(57344&i.flags){t.msg="unknown header flags set",i.mode=Xb;break}i.head&&(i.head.text=h>>8&1),512&i.flags&&(T[0]=255&h,T[1]=h>>>8&255,i.check=dy(i.check,T,2,0)),h=0,l=0,i.mode=3;case 3:for(;l<32;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.head&&(i.head.time=h),512&i.flags&&(T[0]=255&h,T[1]=h>>>8&255,T[2]=h>>>16&255,T[3]=h>>>24&255,i.check=dy(i.check,T,4,0)),h=0,l=0,i.mode=4;case 4:for(;l<16;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.head&&(i.head.xflags=255&h,i.head.os=h>>8),512&i.flags&&(T[0]=255&h,T[1]=h>>>8&255,i.check=dy(i.check,T,2,0)),h=0,l=0,i.mode=5;case 5:if(1024&i.flags){for(;l<16;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.length=h,i.head&&(i.head.extra_len=h),512&i.flags&&(T[0]=255&h,T[1]=h>>>8&255,i.check=dy(i.check,T,2,0)),h=0,l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(p=i.length,p>a&&(p=a),p&&(i.head&&(w=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(n.subarray(s,s+p),w)),512&i.flags&&(i.check=dy(i.check,n,p,s)),a-=p,s+=p,i.length-=p),i.length))break t;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===a)break t;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.name+=String.fromCharCode(w))}while(w&&p<a);if(512&i.flags&&(i.check=dy(i.check,n,p,s)),a-=p,s+=p,w)break t}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===a)break t;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.comment+=String.fromCharCode(w))}while(w&&p<a);if(512&i.flags&&(i.check=dy(i.check,n,p,s)),a-=p,s+=p,w)break t}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;l<16;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(h!==(65535&i.check)){t.msg="header crc mismatch",i.mode=Xb;break}h=0,l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),t.adler=i.check=0,i.mode=Wb;break;case 10:for(;l<32;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}t.adler=i.check=Yb(h),h=0,l=0,i.mode=11;case 11:if(0===i.havedict)return t.next_out=o,t.avail_out=c,t.next_in=s,t.avail_in=a,i.hold=h,i.bits=l,jb;t.adler=i.check=1,i.mode=Wb;case Wb:if(e===kb||e===zb)break t;case 13:if(i.last){h>>>=7&l,l-=7&l,i.mode=27;break}for(;l<3;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}switch(i.last=1&h,h>>>=1,l-=1,3&h){case 0:i.mode=14;break;case 1:if(rx(i),i.mode=20,e===zb){h>>>=2,l-=2;break t}break;case 2:i.mode=17;break;case 3:t.msg="invalid block type",i.mode=Xb}h>>>=2,l-=2;break;case 14:for(h>>>=7&l,l-=7&l;l<32;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if((65535&h)!=(h>>>16^65535)){t.msg="invalid stored block lengths",i.mode=Xb;break}if(i.length=65535&h,h=0,l=0,i.mode=15,e===zb)break t;case 15:i.mode=16;case 16:if(p=i.length,p){if(p>a&&(p=a),p>c&&(p=c),0===p)break t;r.set(n.subarray(s,s+p),o),a-=p,s+=p,c-=p,o+=p,i.length-=p;break}i.mode=Wb;break;case 17:for(;l<14;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(i.nlen=257+(31&h),h>>>=5,l-=5,i.ndist=1+(31&h),h>>>=5,l-=5,i.ncode=4+(15&h),h>>>=4,l-=4,i.nlen>286||i.ndist>30){t.msg="too many length or distance symbols",i.mode=Xb;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;l<3;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.lens[I[i.have++]]=7&h,h>>>=3,l-=3}for(;i.have<19;)i.lens[I[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,C={bits:i.lenbits},S=Db(0,i.lens,0,19,i.lencode,0,i.work,C),i.lenbits=C.bits,S){t.msg="invalid code lengths set",i.mode=Xb;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;M=i.lencode[h&(1<<i.lenbits)-1],g=M>>>24,_=M>>>16&255,v=65535&M,!(g<=l);){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(v<16)h>>>=g,l-=g,i.lens[i.have++]=v;else{if(16===v){for(E=g+2;l<E;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(h>>>=g,l-=g,0===i.have){t.msg="invalid bit length repeat",i.mode=Xb;break}w=i.lens[i.have-1],p=3+(3&h),h>>>=2,l-=2}else if(17===v){for(E=g+3;l<E;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}h>>>=g,l-=g,w=0,p=3+(7&h),h>>>=3,l-=3}else{for(E=g+7;l<E;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}h>>>=g,l-=g,w=0,p=11+(127&h),h>>>=7,l-=7}if(i.have+p>i.nlen+i.ndist){t.msg="invalid bit length repeat",i.mode=Xb;break}for(;p--;)i.lens[i.have++]=w}}if(i.mode===Xb)break;if(0===i.lens[256]){t.msg="invalid code -- missing end-of-block",i.mode=Xb;break}if(i.lenbits=9,C={bits:i.lenbits},S=Db(1,i.lens,0,i.nlen,i.lencode,0,i.work,C),i.lenbits=C.bits,S){t.msg="invalid literal/lengths set",i.mode=Xb;break}if(i.distbits=6,i.distcode=i.distdyn,C={bits:i.distbits},S=Db(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,C),i.distbits=C.bits,S){t.msg="invalid distances set",i.mode=Xb;break}if(i.mode=20,e===zb)break t;case 20:i.mode=21;case 21:if(a>=6&&c>=258){t.next_out=o,t.avail_out=c,t.next_in=s,t.avail_in=a,i.hold=h,i.bits=l,Ab(t,d),o=t.next_out,r=t.output,c=t.avail_out,s=t.next_in,n=t.input,a=t.avail_in,h=i.hold,l=i.bits,i.mode===Wb&&(i.back=-1);break}for(i.back=0;M=i.lencode[h&(1<<i.lenbits)-1],g=M>>>24,_=M>>>16&255,v=65535&M,!(g<=l);){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(_&&0==(240&_)){for(y=g,b=_,x=v;M=i.lencode[x+((h&(1<<y+b)-1)>>y)],g=M>>>24,_=M>>>16&255,v=65535&M,!(y+g<=l);){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}h>>>=y,l-=y,i.back+=y}if(h>>>=g,l-=g,i.back+=g,i.length=v,0===_){i.mode=26;break}if(32&_){i.back=-1,i.mode=Wb;break}if(64&_){t.msg="invalid literal/length code",i.mode=Xb;break}i.extra=15&_,i.mode=22;case 22:if(i.extra){for(E=i.extra;l<E;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.length+=h&(1<<i.extra)-1,h>>>=i.extra,l-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;M=i.distcode[h&(1<<i.distbits)-1],g=M>>>24,_=M>>>16&255,v=65535&M,!(g<=l);){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(0==(240&_)){for(y=g,b=_,x=v;M=i.distcode[x+((h&(1<<y+b)-1)>>y)],g=M>>>24,_=M>>>16&255,v=65535&M,!(y+g<=l);){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}h>>>=y,l-=y,i.back+=y}if(h>>>=g,l-=g,i.back+=g,64&_){t.msg="invalid distance code",i.mode=Xb;break}i.offset=v,i.extra=15&_,i.mode=24;case 24:if(i.extra){for(E=i.extra;l<E;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}i.offset+=h&(1<<i.extra)-1,h>>>=i.extra,l-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){t.msg="invalid distance too far back",i.mode=Xb;break}i.mode=25;case 25:if(0===c)break t;if(p=d-c,i.offset>p){if(p=i.offset-p,p>i.whave&&i.sane){t.msg="invalid distance too far back",i.mode=Xb;break}p>i.wnext?(p-=i.wnext,f=i.wsize-p):f=i.wnext-p,p>i.length&&(p=i.length),m=i.window}else m=r,f=o-i.offset,p=i.length;p>c&&(p=c),c-=p,i.length-=p;do{r[o++]=m[f++]}while(--p);0===i.length&&(i.mode=21);break;case 26:if(0===c)break t;r[o++]=i.length,c--,i.mode=21;break;case 27:if(i.wrap){for(;l<32;){if(0===a)break t;a--,h|=n[s++]<<l,l+=8}if(d-=c,t.total_out+=d,i.total+=d,d&&(t.adler=i.check=i.flags?dy(i.check,r,d,o-d):ly(i.check,r,d,o-d)),d=c,(i.flags?h:Yb(h))!==i.check){t.msg="incorrect data check",i.mode=Xb;break}h=0,l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;l<32;){if(0===a)break t;a--,h+=n[s++]<<l,l+=8}if(h!==(4294967295&i.total)){t.msg="incorrect length check",i.mode=Xb;break}h=0,l=0}i.mode=29;case 29:S=Bb;break t;case Xb:S=Ub;break t;case 31:return Vb;case 32:default:return Hb}return t.next_out=o,t.avail_out=c,t.next_in=s,t.avail_in=a,i.hold=h,i.bits=l,(i.wsize||d!==t.avail_out&&i.mode<Xb&&(i.mode<27||e!==$b))&&sx(t,t.output,t.next_out,d-t.avail_out),u-=t.avail_in,d-=t.avail_out,t.total_in+=u,t.total_out+=d,i.total+=d,i.wrap&&d&&(t.adler=i.check=i.flags?dy(i.check,r,d,t.next_out-d):ly(i.check,r,d,t.next_out-d)),t.data_type=i.bits+(i.last?64:0)+(i.mode===Wb?128:0)+(20===i.mode||15===i.mode?256:0),(0===u&&0===d||e===$b)&&S===Fb&&(S=Gb),S},inflateEnd:t=>{if(!t||!t.state)return Hb;let e=t.state;return e.window&&(e.window=null),t.state=null,Fb},inflateGetHeader:(t,e)=>{if(!t||!t.state)return Hb;const i=t.state;return 0==(2&i.wrap)?Hb:(i.head=e,e.done=!1,Fb)},inflateSetDictionary:(t,e)=>{const i=e.length;let n,r,s;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?Hb:11===n.mode&&(r=1,r=ly(r,e,i,0),r!==n.check)?Ub:(s=sx(t,e,i,i),s?(n.mode=31,Vb):(n.havedict=1,Fb))):Hb},inflateInfo:"pako inflate (from Nodeca project)"};var ax=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const cx=Object.prototype.toString,{Z_NO_FLUSH:hx,Z_FINISH:lx,Z_OK:ux,Z_STREAM_END:dx,Z_NEED_DICT:px,Z_STREAM_ERROR:fx,Z_DATA_ERROR:mx,Z_MEM_ERROR:gx}=fy;function _x(t){this.options=lb({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new _b,this.strm.avail_out=0;let i=ox.inflateInit2(this.strm,e.windowBits);if(i!==ux)throw new Error(py[i]);if(this.header=new ax,ox.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=fb(e.dictionary):"[object ArrayBuffer]"===cx.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(i=ox.inflateSetDictionary(this.strm,e.dictionary),i!==ux)))throw new Error(py[i])}function vx(t,e){const i=new _x(e);if(i.push(t),i.err)throw i.msg||py[i.err];return i.result}_x.prototype.push=function(t,e){const i=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let s,o,a;if(this.ended)return!1;for(o=e===~~e?e:!0===e?lx:hx,"[object ArrayBuffer]"===cx.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),s=ox.inflate(i,o),s===px&&r&&(s=ox.inflateSetDictionary(i,r),s===ux?s=ox.inflate(i,o):s===mx&&(s=px));i.avail_in>0&&s===dx&&i.state.wrap>0&&0!==t[i.next_in];)ox.inflateReset(i),s=ox.inflate(i,o);switch(s){case fx:case mx:case px:case gx:return this.onEnd(s),this.ended=!0,!1}if(a=i.avail_out,i.next_out&&(0===i.avail_out||s===dx))if("string"===this.options.to){let t=gb(i.output,i.next_out),e=i.next_out-t,r=mb(i.output,t);i.next_out=e,i.avail_out=n-e,e&&i.output.set(i.output.subarray(t,t+e),0),this.onData(r)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(s!==ux||0!==a){if(s===dx)return s=ox.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},_x.prototype.onData=function(t){this.chunks.push(t)},_x.prototype.onEnd=function(t){t===ux&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=ub(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var yx={Inflate:_x,inflate:vx,inflateRaw:function(t,e){return(e=e||{}).raw=!0,vx(t,e)},ungzip:vx,constants:fy};const{Inflate:bx,inflate:xx,inflateRaw:wx,ungzip:Sx}=yx;var Mx=xx,Tx=function(t,e,i,n,r){var s,o,a=8*r-n-1,c=(1<<a)-1,h=c>>1,l=-7,u=i?r-1:0,d=i?-1:1,p=t[e+u];for(u+=d,s=p&(1<<-l)-1,p>>=-l,l+=a;l>0;s=256*s+t[e+u],u+=d,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=n;l>0;o=256*o+t[e+u],u+=d,l-=8);if(0===s)s=1-h;else{if(s===c)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),s-=h}return(p?-1:1)*o*Math.pow(2,s-n)},Cx=function(t,e,i,n,r,s){var o,a,c,h=8*s-r-1,l=(1<<h)-1,u=l>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:s-1,f=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=l):(o=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-o))<1&&(o--,c*=2),(e+=o+u>=1?d/c:d*Math.pow(2,1-u))*c>=2&&(o++,c/=2),o+u>=l?(a=0,o=l):o+u>=1?(a=(e*c-1)*Math.pow(2,r),o+=u):(a=e*Math.pow(2,u-1)*Math.pow(2,r),o=0));r>=8;t[i+p]=255&a,p+=f,a/=256,r-=8);for(o=o<<r|a,h+=r;h>0;t[i+p]=255&o,p+=f,o/=256,h-=8);t[i+p-f]|=128*m},Ex=Ix;
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */function Ix(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}Ix.Varint=0,Ix.Fixed64=1,Ix.Bytes=2,Ix.Fixed32=5;var Ax=4294967296,Px=1/Ax,Rx="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function Lx(t){return t.type===Ix.Bytes?t.readVarint()+t.pos:t.pos+1}function Ox(t,e,i){return i?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Nx(t,e,i){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));i.realloc(n);for(var r=i.pos-1;r>=t;r--)i.buf[r+n]=i.buf[r]}function Dx(t,e){for(var i=0;i<t.length;i++)e.writeVarint(t[i])}function $x(t,e){for(var i=0;i<t.length;i++)e.writeSVarint(t[i])}function kx(t,e){for(var i=0;i<t.length;i++)e.writeFloat(t[i])}function zx(t,e){for(var i=0;i<t.length;i++)e.writeDouble(t[i])}function Fx(t,e){for(var i=0;i<t.length;i++)e.writeBoolean(t[i])}function Bx(t,e){for(var i=0;i<t.length;i++)e.writeFixed32(t[i])}function jx(t,e){for(var i=0;i<t.length;i++)e.writeSFixed32(t[i])}function Hx(t,e){for(var i=0;i<t.length;i++)e.writeFixed64(t[i])}function Ux(t,e){for(var i=0;i<t.length;i++)e.writeSFixed64(t[i])}function Vx(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+16777216*t[e+3]}function Gx(t,e,i){t[i]=e,t[i+1]=e>>>8,t[i+2]=e>>>16,t[i+3]=e>>>24}function qx(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}function Wx(t){const e=Mx(t,{to:"string"});return JSON.parse(e)}function Xx(t,e){return Yx(t,"GET","arraybuffer",[],null,e)}function Yx(t,e,i,n,r,s){const o=new XMLHttpRequest,a=new Promise(((s,a)=>{o.open(e,t,!0);for(const t of n)o.setRequestHeader(t.name,t.value);o.responseType=i,o.timeout=15e3,o.onload=()=>{var e;if(200!==o.status){const i=null!==(e=o.response)&&void 0!==e?e:new cd(`Response status error: ${t}`);a(i)}o.response||a(new cd(`Response empty: ${t}`)),s(o.response)},o.onerror=()=>{a(new cd(`Request error: ${t}`))},o.ontimeout=()=>{a(new cd(`Request timeout: ${t}`))},o.onabort=()=>{a(new cd(`Request aborted: ${t}`))},o.send("POST"===e?r:null)}));return s&&s.catch((()=>{o.abort()})),a}function Zx(t){return new Ex(t).readFields(Jx,{faces:[],vertices:[]})}function Jx(t,e,i){1===t?e.vertices.push(i.readFloat()):2===t?e.faces.push(i.readVarint()):console.warn(`Unsupported pbf tag (${t})`)}Ix.prototype={destroy:function(){this.buf=null},readFields:function(t,e,i){for(i=i||this.length;this.pos<i;){var n=this.readVarint(),r=n>>3,s=this.pos;this.type=7&n,t(r,e,this),this.pos===s&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Vx(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=qx(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Vx(this.buf,this.pos)+Vx(this.buf,this.pos+4)*Ax;return this.pos+=8,t},readSFixed64:function(){var t=Vx(this.buf,this.pos)+qx(this.buf,this.pos+4)*Ax;return this.pos+=8,t},readFloat:function(){var t=Tx(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=Tx(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,i,n=this.buf;return e=127&(i=n[this.pos++]),i<128?e:(e|=(127&(i=n[this.pos++]))<<7,i<128?e:(e|=(127&(i=n[this.pos++]))<<14,i<128?e:(e|=(127&(i=n[this.pos++]))<<21,i<128?e:function(t,e,i){var n,r,s=i.buf;if(r=s[i.pos++],n=(112&r)>>4,r<128)return Ox(t,n,e);if(r=s[i.pos++],n|=(127&r)<<3,r<128)return Ox(t,n,e);if(r=s[i.pos++],n|=(127&r)<<10,r<128)return Ox(t,n,e);if(r=s[i.pos++],n|=(127&r)<<17,r<128)return Ox(t,n,e);if(r=s[i.pos++],n|=(127&r)<<24,r<128)return Ox(t,n,e);if(r=s[i.pos++],n|=(1&r)<<31,r<128)return Ox(t,n,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(i=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Rx?function(t,e,i){return Rx.decode(t.subarray(e,i))}(this.buf,e,t):function(t,e,i){var n="",r=e;for(;r<i;){var s,o,a,c=t[r],h=null,l=c>239?4:c>223?3:c>191?2:1;if(r+l>i)break;1===l?c<128&&(h=c):2===l?128==(192&(s=t[r+1]))&&(h=(31&c)<<6|63&s)<=127&&(h=null):3===l?(s=t[r+1],o=t[r+2],128==(192&s)&&128==(192&o)&&((h=(15&c)<<12|(63&s)<<6|63&o)<=2047||h>=55296&&h<=57343)&&(h=null)):4===l&&(s=t[r+1],o=t[r+2],a=t[r+3],128==(192&s)&&128==(192&o)&&128==(192&a)&&((h=(15&c)<<18|(63&s)<<12|(63&o)<<6|63&a)<=65535||h>=1114112)&&(h=null)),null===h?(h=65533,l=1):h>65535&&(h-=65536,n+=String.fromCharCode(h>>>10&1023|55296),h=56320|1023&h),n+=String.fromCharCode(h),r+=l}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==Ix.Bytes)return t.push(this.readVarint(e));var i=Lx(this);for(t=t||[];this.pos<i;)t.push(this.readVarint(e));return t},readPackedSVarint:function(t){if(this.type!==Ix.Bytes)return t.push(this.readSVarint());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readSVarint());return t},readPackedBoolean:function(t){if(this.type!==Ix.Bytes)return t.push(this.readBoolean());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readBoolean());return t},readPackedFloat:function(t){if(this.type!==Ix.Bytes)return t.push(this.readFloat());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readFloat());return t},readPackedDouble:function(t){if(this.type!==Ix.Bytes)return t.push(this.readDouble());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readDouble());return t},readPackedFixed32:function(t){if(this.type!==Ix.Bytes)return t.push(this.readFixed32());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readFixed32());return t},readPackedSFixed32:function(t){if(this.type!==Ix.Bytes)return t.push(this.readSFixed32());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed32());return t},readPackedFixed64:function(t){if(this.type!==Ix.Bytes)return t.push(this.readFixed64());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readFixed64());return t},readPackedSFixed64:function(t){if(this.type!==Ix.Bytes)return t.push(this.readSFixed64());var e=Lx(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed64());return t},skip:function(t){var e=7&t;if(e===Ix.Varint)for(;this.buf[this.pos++]>127;);else if(e===Ix.Bytes)this.pos=this.readVarint()+this.pos;else if(e===Ix.Fixed32)this.pos+=4;else{if(e!==Ix.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var i=new Uint8Array(e);i.set(this.buf),this.buf=i,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(t){this.realloc(4),Gx(this.buf,t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),Gx(this.buf,t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),Gx(this.buf,-1&t,this.pos),Gx(this.buf,Math.floor(t*Px),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),Gx(this.buf,-1&t,this.pos),Gx(this.buf,Math.floor(t*Px),this.pos+4),this.pos+=8},writeVarint:function(t){(t=+t||0)>268435455||t<0?function(t,e){var i,n;t>=0?(i=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(i=~(-t%4294967296))?i=i+1|0:(i=0,n=n+1|0));if(t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,i){i.buf[i.pos++]=127&t|128,t>>>=7,i.buf[i.pos++]=127&t|128,t>>>=7,i.buf[i.pos++]=127&t|128,t>>>=7,i.buf[i.pos++]=127&t|128,t>>>=7,i.buf[i.pos]=127&t}(i,0,e),function(t,e){var i=(7&t)<<4;if(e.buf[e.pos++]|=i|((t>>>=3)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;e.buf[e.pos++]=127&t}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,i){for(var n,r,s=0;s<e.length;s++){if((n=e.charCodeAt(s))>55295&&n<57344){if(!r){n>56319||s+1===e.length?(t[i++]=239,t[i++]=191,t[i++]=189):r=n;continue}if(n<56320){t[i++]=239,t[i++]=191,t[i++]=189,r=n;continue}n=r-55296<<10|n-56320|65536,r=null}else r&&(t[i++]=239,t[i++]=191,t[i++]=189,r=null);n<128?t[i++]=n:(n<2048?t[i++]=n>>6|192:(n<65536?t[i++]=n>>12|224:(t[i++]=n>>18|240,t[i++]=n>>12&63|128),t[i++]=n>>6&63|128),t[i++]=63&n|128)}return i}(this.buf,t,this.pos);var i=this.pos-e;i>=128&&Nx(e,i,this),this.pos=e-1,this.writeVarint(i),this.pos+=i},writeFloat:function(t){this.realloc(4),Cx(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),Cx(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var i=0;i<e;i++)this.buf[this.pos++]=t[i]},writeRawMessage:function(t,e){this.pos++;var i=this.pos;t(e,this);var n=this.pos-i;n>=128&&Nx(i,n,this),this.pos=i-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,i){this.writeTag(t,Ix.Bytes),this.writeRawMessage(e,i)},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,Dx,e)},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,$x,e)},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,Fx,e)},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,kx,e)},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,zx,e)},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,Bx,e)},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,jx,e)},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Hx,e)},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Ux,e)},writeBytesField:function(t,e){this.writeTag(t,Ix.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,Ix.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,Ix.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,Ix.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,Ix.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,Ix.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,Ix.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,Ix.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,Ix.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,Ix.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};class Kx{constructor(){}bboxToCellIds(t,e){throw new cd("Not implemented")}getAdjacent(t){throw new cd("Not implemented")}getVertices(t){throw new cd("Not implemented")}lngLatToCellId(t){throw new cd("Not implemented")}_approxBboxToCellIds(t,e){if(e.lat<=t.lat||e.lng<=t.lng)throw new cd("North east needs to be top right of south west");const i=(t.lat+e.lat)/2,n=(t.lng+e.lng)/2,r=Ju(e.lng,e.lat,0,n,i,0),s=Math.max(r[0],r[1]);return this._lngLatToCellIds({lat:i,lng:n},s)}_enuToGeodetic(t,e){const[i,n]=Ku(t[0],t[1],t[2],e.lng,e.lat,0);return{lat:n,lng:i}}_getLngLatBoundingBoxCorners(t,e){return[[-e,e,0],[e,e,0],[e,-e,0],[-e,-e,0]].map((e=>this._enuToGeodetic(e,t)))}_lngLatToCellIds(t,e){const i=this.lngLatToCellId(t),n=this._getLngLatBoundingBoxCorners(t,e);for(const t of n){if(this.lngLatToCellId(t)!==i)return[i,...this.getAdjacent(i)]}return[i]}}class Qx extends Hf{constructor(t){if(super(),this._geometry=t,!(this._geometry instanceof Kx))throw new cd("The data provider requires a geometry provider base instance.")}get geometry(){return this._geometry}fire(t,e){super.fire(t,e)}getCoreImages(t){return Promise.reject(new cd("Not implemented"))}getCluster(t,e){return Promise.reject(new cd("Not implemented"))}getSpatialImages(t){return Promise.reject(new cd("Not implemented"))}getImages(t){return Promise.reject(new cd("Not implemented"))}getImageBuffer(t,e){return Promise.reject(new cd("Not implemented"))}getImageTiles(t){return Promise.reject(new cd("Not implemented"))}getMesh(t,e){return Promise.reject(new cd("Not implemented"))}getSequence(t){return Promise.reject(new cd("Not implemented"))}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}setAccessToken(t){throw new cd("Not implemented")}}var tw=wp((function(t){
 /**
- * @class Viewer
- *
- * @classdesc The Viewer object represents the navigable image viewer.
- * Create a Viewer by specifying a container, client ID, image key and
- * other options. The viewer exposes methods and events for programmatic
- * interaction.
- *
- * In the case of asynchronous methods, MapillaryJS returns promises to
- * the results. Notifications are always emitted through JavaScript events.
- *
- * The viewer works with a few different coordinate systems.
- *
- * Container pixel coordinates
- *
- * Pixel coordinates are coordinates on the viewer container. The origin is
- * in the top left corner of the container. The axes are
- * directed according to the following for a viewer container with a width
- * of 640 pixels and height of 480 pixels.
- *
- * ```
- * (0,0)                          (640, 0)
- *      +------------------------>
- *      |
- *      |
- *      |
- *      v                        +
- * (0, 480)                       (640, 480)
- * ```
- *
- * Basic image coordinates
- *
- * Basic image coordinates represents points in the original image adjusted for
- * orientation. They range from 0 to 1 on both axes. The origin is in the top left
- * corner of the image and the axes are directed
- * according to the following for all image types.
- *
- * ```
- * (0,0)                          (1, 0)
- *      +------------------------>
- *      |
- *      |
- *      |
- *      v                        +
- * (0, 1)                         (1, 1)
- * ```
- *
- * For every camera viewing direction it is possible to convert between these
- * two coordinate systems for the current node. The image can be panned and
- * zoomed independently of the size of the viewer container resulting in
- * different conversion results for different viewing directions.
- */
-var Viewer = /** @class */ (function (_super) {
-    __extends(Viewer, _super);
-    /**
-     * Create a new viewer instance.
-     *
-     * @description It is possible to initialize the viewer with or
-     * without a key.
-     *
-     * When you want to show a specific image in the viewer from
-     * the start you should initialize it with a key.
-     *
-     * When you do not know the first image key at implementation
-     * time, e.g. in a map-viewer application you should initialize
-     * the viewer without a key and call `moveToKey` instead.
-     *
-     * When initializing with a key the viewer is bound to that key
-     * until the node for that key has been successfully loaded.
-     * Also, a cover with the image of the key will be shown.
-     * If the data for that key can not be loaded because the key is
-     * faulty or other errors occur it is not possible to navigate
-     * to another key because the viewer is not navigable. The viewer
-     * becomes navigable when the data for the key has been loaded and
-     * the image is shown in the viewer. This way of initializing
-     * the viewer is mostly for embedding in blog posts and similar
-     * where one wants to show a specific image initially.
-     *
-     * If the viewer is initialized without a key (with null or
-     * undefined) it is not bound to any particular key and it is
-     * possible to move to any key with `viewer.moveToKey("<my-image-key>")`.
-     * If the first move to a key fails it is possible to move to another
-     * key. The viewer will show a black background until a move
-     * succeeds. This way of intitializing is suited for a map-viewer
-     * application when the initial key is not known at implementation
-     * time.
-     *
-     * @param {string | HTMLElement} container - The HTML element in which
-     * MapillaryJS will render the viewer, or the element's string `id`. The
-     * specified element must have no children.
-     * @param {string} clientId - Required `Mapillary API ClientID`. Can
-     * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} key - Optional `image-key` to start from. The key
-     * can be any Mapillary image. If a key is provided the viewer is
-     * bound to that key until it has been fully loaded. If null is provided
-     * no image is loaded at viewer initialization and the viewer is not
-     * bound to any particular key. Any image can then be navigated to
-     * with e.g. `viewer.moveToKey("<my-image-key>")`.
-     * @param {IViewerOptions} options - Optional configuration object
-     * specifing Viewer's and the components' initial setup.
-     * @param {string} token - Optional bearer token for API requests of
-     * protected resources.
-     *
-     * @example
-     * ```
-     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<image-key>");
-     * ```
-     */
-    function Viewer(container, clientId, key, options, token) {
-        var _this = _super.call(this) || this;
-        options = options != null ? options : {};
-        Utils_1.Settings.setOptions(options);
-        Utils_1.Urls.setOptions(options.url);
-        _this._navigator = new Viewer_1.Navigator(clientId, options, token);
-        _this._container = new Viewer_1.Container(container, _this._navigator.stateService, options);
-        _this._observer = new Viewer_1.Observer(_this, _this._navigator, _this._container);
-        _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, _this._observer, key, options.component);
-        return _this;
-    }
-    Object.defineProperty(Viewer.prototype, "isNavigable", {
-        /**
-         * Return a boolean indicating if the viewer is in a navigable state.
-         *
-         * @description The navigable state indicates if the viewer supports
-         * moving, i.e. calling the {@link moveToKey}, {@link moveDir}
-         * and {@link moveCloseTo} methods or changing the authentication state,
-         * i.e. calling {@link setAuthToken}. The viewer will not be in a navigable
-         * state if the cover is activated and the viewer has been supplied a key.
-         * When the cover is deactivated or the viewer is activated without being
-         * supplied a key it will be navigable.
-         *
-         * @returns {boolean} Boolean indicating whether the viewer is navigable.
-         */
-        get: function () {
-            return this._componentController.navigable;
-        },
-        enumerable: false,
-        configurable: true
-    });
-    /**
-     * Activate the combined panning functionality.
-     *
-     * @description The combined panning functionality is active by default.
-     */
-    Viewer.prototype.activateCombinedPanning = function () {
-        this._navigator.panService.enable();
-    };
-    /**
-     * Activate a component.
-     *
-     * @param {string} name - Name of the component which will become active.
-     *
-     * @example
-     * ```
-     * viewer.activateComponent("marker");
-     * ```
-     */
-    Viewer.prototype.activateComponent = function (name) {
-        this._componentController.activate(name);
-    };
-    /**
-     * Activate the cover (deactivates all other components).
-     */
-    Viewer.prototype.activateCover = function () {
-        this._componentController.activateCover();
-    };
-    /**
-     * Deactivate the combined panning functionality.
-     *
-     * @description Deactivating the combined panning functionality
-     * could be needed in scenarios involving sequence only navigation.
-     */
-    Viewer.prototype.deactivateCombinedPanning = function () {
-        this._navigator.panService.disable();
-    };
-    /**
-     * Deactivate a component.
-     *
-     * @param {string} name - Name of component which become inactive.
-     *
-     * @example
-     * ```
-     * viewer.deactivateComponent("mouse");
-     * ```
-     */
-    Viewer.prototype.deactivateComponent = function (name) {
-        this._componentController.deactivate(name);
-    };
-    /**
-     * Deactivate the cover (activates all components marked as active).
-     */
-    Viewer.prototype.deactivateCover = function () {
-        this._componentController.deactivateCover();
-    };
-    /**
-     * Get the bearing of the current viewer camera.
-     *
-     * @description The bearing depends on how the camera
-     * is currently rotated and does not correspond
-     * to the compass angle of the current node if the view
-     * has been panned.
-     *
-     * Bearing is measured in degrees clockwise with respect to
-     * north.
-     *
-     * @returns {Promise<number>} Promise to the bearing
-     * of the current viewer camera.
-     *
-     * @example
-     * ```
-     * viewer.getBearing().then((b) => { console.log(b); });
-     * ```
-     */
-    Viewer.prototype.getBearing = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.bearing$.pipe(operators_1.first())
-                .subscribe(function (bearing) {
-                resolve(bearing);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Returns the HTML element containing the viewer's <canvas> element.
-     *
-     * @description This is the element to which event bindings for viewer
-     * interactivity (such as panning and zooming) are attached.
-     *
-     * @returns {HTMLElement} The container viewer's <canvas> element.
-     */
-    Viewer.prototype.getCanvasContainer = function () {
-        return this._container.canvasContainer;
-    };
-    /**
-     * Get the basic coordinates of the current image that is
-     * at the center of the viewport.
-     *
-     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
-     * and have the origin point, (0, 0), at the top left corner and the
-     * maximum value, (1, 1), at the bottom right corner of the original
-     * image.
-     *
-     * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current image at the center for the viewport.
-     *
-     * @example
-     * ```
-     * viewer.getCenter().then((c) => { console.log(c); });
-     * ```
-     */
-    Viewer.prototype.getCenter = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getCenter()
-                .subscribe(function (center) {
-                resolve(center);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get a component.
-     *
-     * @param {string} name - Name of component.
-     * @returns {Component} The requested component.
-     *
-     * @example
-     * ```
-     * var mouseComponent = viewer.getComponent("mouse");
-     * ```
-     */
-    Viewer.prototype.getComponent = function (name) {
-        return this._componentController.get(name);
-    };
-    /**
-     * Returns the viewer's containing HTML element.
-     *
-     * @returns {HTMLElement} The viewer's container.
-     */
-    Viewer.prototype.getContainer = function () {
-        return this._container.element;
-    };
-    /**
-     * Get the viewer's current vertical field of view.
-     *
-     * @description The vertical field of view rendered on the viewer canvas
-     * measured in degrees.
-     *
-     * @returns {Promise<number>} Promise to the current field of view
-     * of the viewer camera.
-     *
-     * @example
-     * ```
-     * viewer.getFieldOfView().then((fov) => { console.log(fov); });
-     * ```
-     */
-    Viewer.prototype.getFieldOfView = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$.pipe(operators_1.first())
-                .subscribe(function (rc) {
-                resolve(rc.perspective.fov);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get the viewer's current point of view.
-     *
-     * @returns {Promise<IPointOfView>} Promise to the current point of view
-     * of the viewer camera.
-     *
-     * @example
-     * ```
-     * viewer.getPointOfView().then((pov) => { console.log(pov); });
-     * ```
-     */
-    Viewer.prototype.getPointOfView = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._container.renderService.bearing$).pipe(operators_1.first())
-                .subscribe(function (_a) {
-                var rc = _a[0], bearing = _a[1];
-                resolve({
-                    bearing: bearing,
-                    tilt: rc.getTilt(),
-                });
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get the viewer's current position
-     *
-     * @returns {Promise<ILatLon>} Promise to the viewers's current
-     * position.
-     *
-     * @example
-     * ```
-     * viewer.getPosition().then((pos) => { console.log(pos); });
-     * ```
-     */
-    Viewer.prototype.getPosition = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.reference$).pipe(operators_1.first())
-                .subscribe(function (_a) {
-                var render = _a[0], reference = _a[1];
-                resolve(_this._observer.projection.cameraToLatLon(render, reference));
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get the image's current zoom level.
-     *
-     * @returns {Promise<number>} Promise to the viewers's current
-     * zoom level.
-     *
-     * @example
-     * ```
-     * viewer.getZoom().then((z) => { console.log(z); });
-     * ```
-     */
-    Viewer.prototype.getZoom = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getZoom()
-                .subscribe(function (zoom) {
-                resolve(zoom);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Move close to given latitude and longitude.
-     *
-     * @description Because the method propagates IO errors, these potential errors
-     * need to be handled by the method caller (see example).
-     *
-     * @param {Number} lat - Latitude, in degrees.
-     * @param {Number} lon - Longitude, in degrees.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} If no nodes exist close to provided latitude
-     * longitude.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move close to call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveCloseTo(0, 0).then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveCloseTo = function (lat, lon) {
-        var moveCloseTo$ = this.isNavigable ?
-            this._navigator.moveCloseTo$(lat, lon) :
-            rxjs_1.throwError(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveCloseTo$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Navigate in a given direction.
-     *
-     * @description This method has to be called through EdgeDirection enumeration as in the example.
-     *
-     * @param {EdgeDirection} dir - Direction in which which to move.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} If the current node does not have the edge direction
-     * or the edges has not yet been cached.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move dir call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveDir(Mapillary.EdgeDirection.Next).then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveDir = function (dir) {
-        var moveDir$ = this.isNavigable ?
-            this._navigator.moveDir$(dir) :
-            rxjs_1.throwError(new Error("Calling moveDir is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveDir$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Navigate to a given image key.
-     *
-     * @param {string} key - A valid Mapillary image key.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move to key call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveToKey("<my key>").then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveToKey = function (key) {
-        var moveToKey$ = this.isNavigable ?
-            this._navigator.moveToKey$(key) :
-            rxjs_1.throwError(new Error("Calling moveToKey is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveToKey$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Project an ILatLon representing geographicalcoordinates to
-     * canvas pixel coordinates.
-     *
-     * @description The geographical coordinates may not always correspond to pixel
-     * coordinates, e.g. if the geographical coordinates have a position behind the
-     * viewer camera. In the case of no correspondence the returned value will
-     * be `null`.
-     *
-     * If the distance from the viewer camera position to the provided lat-lon
-     * is more than 1000 meters `null` will be returned.
-     *
-     * The projection is performed from the ground plane, i.e.
-     * the altitude with respect to the ground plane for the geographical
-     * point is zero.
-     *
-     * Note that whenever the camera moves, the result of the method will be
-     * different.
-     *
-     * @param {ILatLon} latLon - Geographical coordinates to project.
-     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
-     * to the latLon.
-     *
-     * @example
-     * ```
-     * viewer.project({ lat: 0, lon: 0 })
-     *     .then((pixelPoint) => {
-     *          if (!pixelPoint) {
-     *              console.log("no correspondence");
-     *          }
-     *
-     *          console.log(pixelPoint);
-     *     });
-     * ```
+     * @license long.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
+     * Released under the Apache License, Version 2.0
+     * see: https://github.com/dcodeIO/long.js for details
      */
-    Viewer.prototype.project = function (latLon) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.project$(latLon)
-                .subscribe(function (pixelPoint) {
-                resolve(pixelPoint);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Project basic image coordinates for the current node to canvas pixel
-     * coordinates.
-     *
-     * @description The basic image coordinates may not always correspond to a
-     * pixel point that lies in the visible area of the viewer container. In the
-     * case of no correspondence the returned value can be `null`.
-     *
-     *
-     * @param {Array<number>} basicPoint - Basic images coordinates to project.
-     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
-     * to the basic image point.
-     *
-     * @example
-     * ```
-     * viewer.projectFromBasic([0.3, 0.7])
-     *     .then((pixelPoint) => { console.log(pixelPoint); });
-     * ```
-     */
-    Viewer.prototype.projectFromBasic = function (basicPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.projectBasic$(basicPoint)
-                .subscribe(function (pixelPoint) {
-                resolve(pixelPoint);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Detect the viewer's new width and height and resize it.
-     *
-     * @description The components will also detect the viewer's
-     * new size and resize their rendered elements if needed.
-     *
-     * @example
-     * ```
-     * viewer.resize();
-     * ```
-     */
-    Viewer.prototype.resize = function () {
-        this._container.renderService.resize$.next(null);
-    };
-    /**
-     * Set a bearer token for authenticated API requests of
-     * protected resources.
-     *
-     * @description When the supplied token is null or undefined,
-     * any previously set bearer token will be cleared and the
-     * viewer will make unauthenticated requests.
-     *
-     * Calling setAuthToken aborts all outstanding move requests.
-     * The promises of those move requests will be rejected with a
-     * {@link AbortMapillaryError} the rejections need to be caught.
-     *
-     * Calling setAuthToken also resets the complete viewer cache
-     * so it should not be called repeatedly.
-     *
-     * @param {string} [token] token - Bearer token.
-     * @returns {Promise<void>} Promise that resolves after token
-     * is set.
-     *
-     * @throws {Error} When viewer is not navigable.
-     *
-     * @example
-     * ```
-     * viewer.setAuthToken("<my token>")
-     *     .then(() => { console.log("token set"); });
-     * ```
-     */
-    Viewer.prototype.setAuthToken = function (token) {
-        var setToken$ = this.isNavigable ?
-            this._navigator.setToken$(token) :
-            rxjs_1.throwError(new Error("Calling setAuthToken is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            setToken$
-                .subscribe(function () {
-                resolve(undefined);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Set the basic coordinates of the current image to be in the
-     * center of the viewport.
-     *
-     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
-     * and has the origin point, (0, 0), at the top left corner and the
-     * maximum value, (1, 1), at the bottom right corner of the original
-     * image.
-     *
-     * @param {number[]} The basic coordinates of the current
-     * image to be at the center for the viewport.
-     *
-     * @example
-     * ```
-     * viewer.setCenter([0.5, 0.5]);
-     * ```
-     */
-    Viewer.prototype.setCenter = function (center) {
-        this._navigator.stateService.setCenter(center);
-    };
-    /**
-     * Set the filter selecting nodes to use when calculating
-     * the spatial edges.
-     *
-     * @description The following filter types are supported:
-     *
-     * Comparison
-     *
-     * `["==", key, value]` equality: `node[key] = value`
-     *
-     * `["!=", key, value]` inequality: `node[key] â‰  value`
-     *
-     * `["<", key, value]` less than: `node[key] < value`
-     *
-     * `["<=", key, value]` less than or equal: `node[key] â‰¤ value`
-     *
-     * `[">", key, value]` greater than: `node[key] > value`
-     *
-     * `[">=", key, value]` greater than or equal: `node[key] â‰¥ value`
-     *
-     * Set membership
-     *
-     * `["in", key, v0, ..., vn]` set inclusion: `node[key] âˆˆ {v0, ..., vn}`
-     *
-     * `["!in", key, v0, ..., vn]` set exclusion: `node[key] âˆ‰ {v0, ..., vn}`
-     *
-     * Combining
-     *
-     * `["all", f0, ..., fn]` logical `AND`: `f0 âˆ§ ... âˆ§ fn`
-     *
-     * A key must be a string that identifies a property name of a
-     * simple {@link Node} property. A value must be a string, number, or
-     * boolean. Strictly-typed comparisons are used. The values
-     * `f0, ..., fn` of the combining filter must be filter expressions.
-     *
-     * Clear the filter by setting it to null or empty array.
-     *
-     * Commonly used filter properties (see the {@link Node} class
-     * documentation for a full list of properties that can be used
-     * in a filter) and common use cases:
-     *
-     * ```
-     * fullPano        // Show only full 360 panoramas or not
-     * organizationKey // Show images from one or several organizations
-     * sequenceKey     // Show images from one or several sequences
-     * userKey         // Show images from one or several users
-     * capturedAt      // Show images from a certain time interval
-     * ```
-     *
-     * @param {FilterExpression} filter - The filter expression.
-     * @returns {Promise<void>} Promise that resolves after filter is applied.
-     *
-     * @example
-     * ```
-     * viewer.setFilter(["==", "sequenceKey", "<my sequence key>"]);
-     *
-     * // Other examples
-     * // viewer.setFilter(["==", "organizationKey", "<my organization key>"]);
-     * // viewer.setFilter(["in", "userKey", "<my user key #1>", "<my user key #2>"]);
-     * // viewer.setFilter(["==", "fullPano", true]);
-     * // viewer.setFilter([">=", "capturedAt", <my time stamp>]);
-     * ```
-     */
-    Viewer.prototype.setFilter = function (filter) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.setFilter$(filter)
-                .subscribe(function () {
-                resolve(undefined);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Set the viewer's current vertical field of view.
-     *
-     * @description Sets the vertical field of view rendered
-     * on the viewer canvas measured in degrees. The value
-     * will be clamped to be able to set a valid zoom level
-     * based on the projection model of the current image and
-     * the viewer's current render mode.
-     *
-     * @param {number} fov - Vertical field of view in degrees.
-     *
-     * @example
-     * ```
-     * viewer.setFieldOfView(45);
-     * ```
-     */
-    Viewer.prototype.setFieldOfView = function (fov) {
-        var _this = this;
-        this._container.renderService.renderCamera$.pipe(operators_1.first())
-            .subscribe(function (rc) {
-            var zoom = rc.fovToZoom(fov);
-            _this._navigator.stateService.setZoom(zoom);
-        });
-    };
-    /**
-     * Set the viewer's render mode.
-     *
-     * @param {RenderMode} renderMode - Render mode.
-     *
-     * @example
-     * ```
-     * viewer.setRenderMode(Mapillary.RenderMode.Letterbox);
-     * ```
-     */
-    Viewer.prototype.setRenderMode = function (renderMode) {
-        this._container.renderService.renderMode$.next(renderMode);
-    };
-    /**
-     * Set the viewer's transition mode.
-     *
-     * @param {TransitionMode} transitionMode - Transition mode.
-     *
-     * @example
-     * ```
-     * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous);
-     * ```
-     */
-    Viewer.prototype.setTransitionMode = function (transitionMode) {
-        this._navigator.stateService.setTransitionMode(transitionMode);
-    };
-    /**
-     * Set the image's current zoom level.
-     *
-     * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the image to the view whereas three
-     * shows the highest level of detail.
-     *
-     * @param {number} The image's current zoom level.
-     *
-     * @example
-     * ```
-     * viewer.setZoom(2);
-     * ```
-     */
-    Viewer.prototype.setZoom = function (zoom) {
-        this._navigator.stateService.setZoom(zoom);
-    };
-    /**
-     * Unproject canvas pixel coordinates to an ILatLon representing geographical
-     * coordinates.
-     *
-     * @description The pixel point may not always correspond to geographical
-     * coordinates. In the case of no correspondence the returned value will
-     * be `null`.
-     *
-     * The unprojection to a latLon will be performed towards the ground plane, i.e.
-     * the altitude with respect to the ground plane for the returned latLon is zero.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
-     * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.
-     *
-     * @example
-     * ```
-     * viewer.unproject([100, 100])
-     *     .then((latLon) => { console.log(latLon); });
-     * ```
-     */
-    Viewer.prototype.unproject = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.unproject$(pixelPoint)
-                .subscribe(function (latLon) {
-                resolve(latLon);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Unproject canvas pixel coordinates to basic image coordinates for the
-     * current node.
-     *
-     * @description The pixel point may not always correspond to basic image
-     * coordinates. In the case of no correspondence the returned value will
-     * be `null`.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
-     * @returns {Promise<ILatLon>} Promise to the basic coordinates corresponding
-     * to the pixel point.
-     *
-     * @example
-     * ```
-     * viewer.unprojectToBasic([100, 100])
-     *     .then((basicPoint) => { console.log(basicPoint); });
-     * ```
-     */
-    Viewer.prototype.unprojectToBasic = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.unprojectBasic$(pixelPoint)
-                .subscribe(function (basicPoint) {
-                resolve(basicPoint);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Fired when the viewing direction of the camera changes.
-     *
-     * @description Related to the computed compass angle
-     * ({@link Node.computedCA}) from SfM, not the original EXIF compass
-     * angle.
-     *
-     * @event
-     * @type {number} bearing - Value indicating the current bearing
-     * measured in degrees clockwise with respect to north.
-     */
-    Viewer.bearingchanged = "bearingchanged";
-    /**
-     * Fired when a pointing device (usually a mouse) is pressed and released at
-     * the same point in the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.click = "click";
-    /**
-     * Fired when the right button of the mouse is clicked within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.contextmenu = "contextmenu";
-    /**
-     * Fired when a pointing device (usually a mouse) is clicked twice at
-     * the same point in the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.dblclick = "dblclick";
-    /**
-     * Fired when the viewer's vertical field of view changes.
-     *
-     * @event
-     * @type  {@link IViewerEvent} event - The event object.
-     */
-    Viewer.fovchanged = "fovchanged";
-    /**
-     * Fired when the viewer is loading more data.
-     * @event
-     * @type {boolean} loading - Boolean indicating whether the viewer is loading.
-     */
-    Viewer.loadingchanged = "loadingchanged";
-    /**
-     * Fired when a pointing device (usually a mouse) is pressed within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mousedown = "mousedown";
-    /**
-     * Fired when a pointing device (usually a mouse) is moved within the viewer.
-     * @description Will not fire when the mouse is actively used, e.g. for drag pan.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mousemove = "mousemove";
-    /**
-     * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseout = "mouseout";
-    /**
-     * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseover = "mouseover";
-    /**
-     * Fired when a pointing device (usually a mouse) is released within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseup = "mouseup";
-    /**
-     * Fired when the viewer motion stops and it is in a fixed
-     * position with a fixed point of view.
-     * @event
-     */
-    Viewer.moveend = "moveend";
-    /**
-     * Fired when the motion from one view to another start,
-     * either by changing the position (e.g. when changing node) or
-     * when changing point of view (e.g. by interaction such as pan and zoom).
-     * @event
-     */
-    Viewer.movestart = "movestart";
-    /**
-     * Fired when the navigable state of the viewer changes.
-     *
-     * @description The navigable state indicates if the viewer supports
-     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`
-     * methods. The viewer will not be in a navigable state if the cover
-     * is activated and the viewer has been supplied a key. When the cover
-     * is deactivated or activated without being supplied a key it will
-     * be navigable.
-     *
-     * @event
-     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.
-     */
-    Viewer.navigablechanged = "navigablechanged";
-    /**
-     * Fired every time the viewer navigates to a new node.
-     *
-     * @event
-     * @type  {@link Node} node - Current node.
-     */
-    Viewer.nodechanged = "nodechanged";
-    /**
-     * Fired when the viewer's position changes.
-     *
-     * @description The viewer's position changes when transitioning
-     * between nodes.
-     *
-     * @event
-     * @type  {@link IViewerEvent} event - The event object.
-     */
-    Viewer.positionchanged = "positionchanged";
-    /**
-     * Fired when the viewer's point of view changes. The point of view changes
-     * when the bearing, or tilt changes.
-     *
-     * @event
-     * @type  {@link IViewerEvent} event - The event object.
-     */
-    Viewer.povchanged = "povchanged";
-    /**
-     * Fired every time the sequence edges of the current node changes.
-     * @event
-     * @type  {@link IEdgeStatus} status - The edge status object.
-     */
-    Viewer.sequenceedgeschanged = "sequenceedgeschanged";
-    /**
-     * Fired every time the spatial edges of the current node changes.
-     * @event
-     * @type  {@link IEdgeStatus} status - The edge status object.
-     */
-    Viewer.spatialedgeschanged = "spatialedgeschanged";
-    return Viewer;
-}(Utils_1.EventEmitter));
-exports.Viewer = Viewer;
-
-},{"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"when":288}],486:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-},{}]},{},[296])(296)
-});
+!function(e,i){t&&t.exports?t.exports=i():(e.dcodeIO=e.dcodeIO||{}).Long=i()}(bp,(function(){function t(t,e,i){this.low=0|t,this.high=0|e,this.unsigned=!!i}function e(t){return!0===(t&&t.__isLong__)}t.prototype.__isLong__,Object.defineProperty(t.prototype,"__isLong__",{value:!0,enumerable:!1,configurable:!1}),t.isLong=e;var i={},n={};function r(t,e){var r,s,a;return e?(a=0<=(t>>>=0)&&t<256)&&(s=n[t])?s:(r=o(t,(0|t)<0?-1:0,!0),a&&(n[t]=r),r):(a=-128<=(t|=0)&&t<128)&&(s=i[t])?s:(r=o(t,t<0?-1:0,!1),a&&(i[t]=r),r)}function s(t,e){if(isNaN(t)||!isFinite(t))return e?m:f;if(e){if(t<0)return m;if(t>=u)return b}else{if(t<=-d)return x;if(t+1>=d)return y}return t<0?s(-t,e).neg():o(t%l|0,t/l|0,e)}function o(e,i,n){return new t(e,i,n)}t.fromInt=r,t.fromNumber=s,t.fromBits=o;var a=Math.pow;function c(t,e,i){if(0===t.length)throw Error("empty string");if("NaN"===t||"Infinity"===t||"+Infinity"===t||"-Infinity"===t)return f;if("number"==typeof e?(i=e,e=!1):e=!!e,(i=i||10)<2||36<i)throw RangeError("radix");var n;if((n=t.indexOf("-"))>0)throw Error("interior hyphen");if(0===n)return c(t.substring(1),e,i).neg();for(var r=s(a(i,8)),o=f,h=0;h<t.length;h+=8){var l=Math.min(8,t.length-h),u=parseInt(t.substring(h,h+l),i);if(l<8){var d=s(a(i,l));o=o.mul(d).add(s(u))}else o=(o=o.mul(r)).add(s(u))}return o.unsigned=e,o}function h(e){return e instanceof t?e:"number"==typeof e?s(e):"string"==typeof e?c(e):o(e.low,e.high,e.unsigned)}t.fromString=c,t.fromValue=h;var l=4294967296,u=l*l,d=u/2,p=r(1<<24),f=r(0);t.ZERO=f;var m=r(0,!0);t.UZERO=m;var g=r(1);t.ONE=g;var _=r(1,!0);t.UONE=_;var v=r(-1);t.NEG_ONE=v;var y=o(-1,2147483647,!1);t.MAX_VALUE=y;var b=o(-1,-1,!0);t.MAX_UNSIGNED_VALUE=b;var x=o(0,-2147483648,!1);t.MIN_VALUE=x;var w=t.prototype;return w.toInt=function(){return this.unsigned?this.low>>>0:this.low},w.toNumber=function(){return this.unsigned?(this.high>>>0)*l+(this.low>>>0):this.high*l+(this.low>>>0)},w.toString=function(t){if((t=t||10)<2||36<t)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(x)){var e=s(t),i=this.div(e),n=i.mul(e).sub(this);return i.toString(t)+n.toInt().toString(t)}return"-"+this.neg().toString(t)}for(var r=s(a(t,6),this.unsigned),o=this,c="";;){var h=o.div(r),l=(o.sub(h.mul(r)).toInt()>>>0).toString(t);if((o=h).isZero())return l+c;for(;l.length<6;)l="0"+l;c=""+l+c}},w.getHighBits=function(){return this.high},w.getHighBitsUnsigned=function(){return this.high>>>0},w.getLowBits=function(){return this.low},w.getLowBitsUnsigned=function(){return this.low>>>0},w.getNumBitsAbs=function(){if(this.isNegative())return this.eq(x)?64:this.neg().getNumBitsAbs();for(var t=0!=this.high?this.high:this.low,e=31;e>0&&0==(t&1<<e);e--);return 0!=this.high?e+33:e+1},w.isZero=function(){return 0===this.high&&0===this.low},w.isNegative=function(){return!this.unsigned&&this.high<0},w.isPositive=function(){return this.unsigned||this.high>=0},w.isOdd=function(){return 1==(1&this.low)},w.isEven=function(){return 0==(1&this.low)},w.equals=function(t){return e(t)||(t=h(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)},w.eq=w.equals,w.notEquals=function(t){return!this.eq(t)},w.neq=w.notEquals,w.lessThan=function(t){return this.comp(t)<0},w.lt=w.lessThan,w.lessThanOrEqual=function(t){return this.comp(t)<=0},w.lte=w.lessThanOrEqual,w.greaterThan=function(t){return this.comp(t)>0},w.gt=w.greaterThan,w.greaterThanOrEqual=function(t){return this.comp(t)>=0},w.gte=w.greaterThanOrEqual,w.compare=function(t){if(e(t)||(t=h(t)),this.eq(t))return 0;var i=this.isNegative(),n=t.isNegative();return i&&!n?-1:!i&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1},w.comp=w.compare,w.negate=function(){return!this.unsigned&&this.eq(x)?x:this.not().add(g)},w.neg=w.negate,w.add=function(t){e(t)||(t=h(t));var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,s=65535&this.low,a=t.high>>>16,c=65535&t.high,l=t.low>>>16,u=0,d=0,p=0,f=0;return p+=(f+=s+(65535&t.low))>>>16,d+=(p+=r+l)>>>16,u+=(d+=n+c)>>>16,u+=i+a,o((p&=65535)<<16|(f&=65535),(u&=65535)<<16|(d&=65535),this.unsigned)},w.subtract=function(t){return e(t)||(t=h(t)),this.add(t.neg())},w.sub=w.subtract,w.multiply=function(t){if(this.isZero())return f;if(e(t)||(t=h(t)),t.isZero())return f;if(this.eq(x))return t.isOdd()?x:f;if(t.eq(x))return this.isOdd()?x:f;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(p)&&t.lt(p))return s(this.toNumber()*t.toNumber(),this.unsigned);var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,a=65535&this.low,c=t.high>>>16,l=65535&t.high,u=t.low>>>16,d=65535&t.low,m=0,g=0,_=0,v=0;return _+=(v+=a*d)>>>16,g+=(_+=r*d)>>>16,_&=65535,g+=(_+=a*u)>>>16,m+=(g+=n*d)>>>16,g&=65535,m+=(g+=r*u)>>>16,g&=65535,m+=(g+=a*l)>>>16,m+=i*d+n*u+r*l+a*c,o((_&=65535)<<16|(v&=65535),(m&=65535)<<16|(g&=65535),this.unsigned)},w.mul=w.multiply,w.divide=function(t){if(e(t)||(t=h(t)),t.isZero())throw Error("division by zero");if(this.isZero())return this.unsigned?m:f;var i,n,r;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return m;if(t.gt(this.shru(1)))return _;r=m}else{if(this.eq(x))return t.eq(g)||t.eq(v)?x:t.eq(x)?g:(i=this.shr(1).div(t).shl(1)).eq(f)?t.isNegative()?g:v:(n=this.sub(t.mul(i)),r=i.add(n.div(t)));if(t.eq(x))return this.unsigned?m:f;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();r=f}for(n=this;n.gte(t);){i=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));for(var o=Math.ceil(Math.log(i)/Math.LN2),c=o<=48?1:a(2,o-48),l=s(i),u=l.mul(t);u.isNegative()||u.gt(n);)u=(l=s(i-=c,this.unsigned)).mul(t);l.isZero()&&(l=g),r=r.add(l),n=n.sub(u)}return r},w.div=w.divide,w.modulo=function(t){return e(t)||(t=h(t)),this.sub(this.div(t).mul(t))},w.mod=w.modulo,w.not=function(){return o(~this.low,~this.high,this.unsigned)},w.and=function(t){return e(t)||(t=h(t)),o(this.low&t.low,this.high&t.high,this.unsigned)},w.or=function(t){return e(t)||(t=h(t)),o(this.low|t.low,this.high|t.high,this.unsigned)},w.xor=function(t){return e(t)||(t=h(t)),o(this.low^t.low,this.high^t.high,this.unsigned)},w.shiftLeft=function(t){return e(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?o(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):o(0,this.low<<t-32,this.unsigned)},w.shl=w.shiftLeft,w.shiftRight=function(t){return e(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?o(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):o(this.high>>t-32,this.high>=0?0:-1,this.unsigned)},w.shr=w.shiftRight,w.shiftRightUnsigned=function(t){if(e(t)&&(t=t.toInt()),0===(t&=63))return this;var i=this.high;return t<32?o(this.low>>>t|i<<32-t,i>>>t,this.unsigned):o(32===t?i:i>>>t-32,0,this.unsigned)},w.shru=w.shiftRightUnsigned,w.toSigned=function(){return this.unsigned?o(this.low,this.high,!1):this},w.toUnsigned=function(){return this.unsigned?this:o(this.low,this.high,!0)},w.toBytes=function(t){return t?this.toBytesLE():this.toBytesBE()},w.toBytesLE=function(){var t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24&255,255&t,t>>>8&255,t>>>16&255,t>>>24&255]},w.toBytesBE=function(){var t=this.high,e=this.low;return[t>>>24&255,t>>>16&255,t>>>8&255,255&t,e>>>24&255,e>>>16&255,e>>>8&255,255&e]},t}))})),ew=wp((function(t){!function(t){var e=t.S2={L:{}};e.L.LatLng=function(t,e,i){var n=parseFloat(t,10),r=parseFloat(e,10);if(isNaN(n)||isNaN(r))throw new Error("Invalid LatLng object: ("+t+", "+e+")");return!0!==i&&(n=Math.max(Math.min(n,90),-90),r=(r+180)%360+(r<-180||180===r?180:-180)),{lat:n,lng:r}},e.L.LatLng.DEG_TO_RAD=Math.PI/180,e.L.LatLng.RAD_TO_DEG=180/Math.PI,e.LatLngToXYZ=function(t){var i=e.L.LatLng.DEG_TO_RAD,n=t.lat*i,r=t.lng*i,s=Math.cos(n);return[Math.cos(r)*s,Math.sin(r)*s,Math.sin(n)]},e.XYZToLatLng=function(t){var i=e.L.LatLng.RAD_TO_DEG,n=Math.atan2(t[2],Math.sqrt(t[0]*t[0]+t[1]*t[1])),r=Math.atan2(t[1],t[0]);return e.L.LatLng(n*i,r*i)};e.XYZToFaceUV=function(t){var e=function(t){var e=[Math.abs(t[0]),Math.abs(t[1]),Math.abs(t[2])];return e[0]>e[1]?e[0]>e[2]?0:2:e[1]>e[2]?1:2}(t);return t[e]<0&&(e+=3),[e,function(t,e){var i,n;switch(t){case 0:i=e[1]/e[0],n=e[2]/e[0];break;case 1:i=-e[0]/e[1],n=e[2]/e[1];break;case 2:i=-e[0]/e[2],n=-e[1]/e[2];break;case 3:i=e[2]/e[0],n=e[1]/e[0];break;case 4:i=e[2]/e[1],n=-e[0]/e[1];break;case 5:i=-e[1]/e[2],n=-e[0]/e[2];break;default:throw{error:"Invalid face"}}return[i,n]}(e,t)]},e.FaceUVToXYZ=function(t,e){var i=e[0],n=e[1];switch(t){case 0:return[1,i,n];case 1:return[-i,1,n];case 2:return[-i,-n,1];case 3:return[-1,-n,-i];case 4:return[n,-1,-i];case 5:return[n,i,-1];default:throw{error:"Invalid face"}}};var i=function(t){return t>=.5?1/3*(4*t*t-1):1/3*(1-4*(1-t)*(1-t))};e.STToUV=function(t){return[i(t[0]),i(t[1])]};var n=function(t){return t>=0?.5*Math.sqrt(1+3*t):1-.5*Math.sqrt(1-3*t)};e.UVToST=function(t){return[n(t[0]),n(t[1])]},e.STToIJ=function(t,e){var i=1<<e,n=function(t){var e=Math.floor(t*i);return Math.max(0,Math.min(i-1,e))};return[n(t[0]),n(t[1])]},e.IJToST=function(t,e,i){var n=1<<e;return[(t[0]+i[0])/n,(t[1]+i[1])/n]};var r=function(t,e,i,n){if(0==n){1==i&&(e.x=t-1-e.x,e.y=t-1-e.y);var r=e.x;e.x=e.y,e.y=r}},s=function(t,e,i,n){var r={a:[[0,"d"],[1,"a"],[3,"b"],[2,"a"]],b:[[2,"b"],[1,"b"],[3,"a"],[0,"c"]],c:[[2,"c"],[3,"d"],[1,"c"],[0,"b"]],d:[[0,"a"],[3,"c"],[1,"d"],[2,"d"]]};"number"!=typeof n&&console.warn(new Error("called pointToHilbertQuadList without face value, defaulting to '0'").stack);for(var s=n%2?"d":"a",o=[],a=i-1;a>=0;a--){var c=1<<a,h=r[s][2*(t&c?1:0)+(e&c?1:0)];o.push(h[0]),s=h[1]}return o};e.S2Cell=function(){},e.S2Cell.FromHilbertQuadKey=function(t){var i,n,s,o,a,c,h=t.split("/"),l=parseInt(h[0]),u=h[1],d=u.length,p={x:0,y:0};for(i=d-1;i>=0;i--)n=d-i,o=0,a=0,"1"===(s=u[i])?a=1:"2"===s?(o=1,a=1):"3"===s&&(o=1),c=Math.pow(2,n-1),r(c,p,o,a),p.x+=c*o,p.y+=c*a;if(l%2==1){var f=p.x;p.x=p.y,p.y=f}return e.S2Cell.FromFaceIJ(parseInt(l),[p.x,p.y],n)},e.S2Cell.FromLatLng=function(t,i){if(!t.lat&&0!==t.lat||!t.lng&&0!==t.lng)throw new Error("Pass { lat: lat, lng: lng } to S2.S2Cell.FromLatLng");var n=e.LatLngToXYZ(t),r=e.XYZToFaceUV(n),s=e.UVToST(r[1]),o=e.STToIJ(s,i);return e.S2Cell.FromFaceIJ(r[0],o,i)},e.S2Cell.FromFaceIJ=function(t,i,n){var r=new e.S2Cell;return r.face=t,r.ij=i,r.level=n,r},e.S2Cell.prototype.toString=function(){return"F"+this.face+"ij["+this.ij[0]+","+this.ij[1]+"]@"+this.level},e.S2Cell.prototype.getLatLng=function(){var t=e.IJToST(this.ij,this.level,[.5,.5]),i=e.STToUV(t),n=e.FaceUVToXYZ(this.face,i);return e.XYZToLatLng(n)},e.S2Cell.prototype.getCornerLatLngs=function(){for(var t=[],i=[[0,0],[0,1],[1,1],[1,0]],n=0;n<4;n++){var r=e.IJToST(this.ij,this.level,i[n]),s=e.STToUV(r),o=e.FaceUVToXYZ(this.face,s);t.push(e.XYZToLatLng(o))}return t},e.S2Cell.prototype.getFaceAndQuads=function(){var t=s(this.ij[0],this.ij[1],this.level,this.face);return[this.face,t]},e.S2Cell.prototype.toHilbertQuadkey=function(){var t=s(this.ij[0],this.ij[1],this.level,this.face);return this.face.toString(10)+"/"+t.join("")},e.latLngToNeighborKeys=e.S2Cell.latLngToNeighborKeys=function(t,i,n){return e.S2Cell.FromLatLng({lat:t,lng:i},n).getNeighbors().map((function(t){return t.toHilbertQuadkey()}))},e.S2Cell.prototype.getNeighbors=function(){var t=function(t,i,n){var r=1<<n;if(i[0]>=0&&i[1]>=0&&i[0]<r&&i[1]<r)return e.S2Cell.FromFaceIJ(t,i,n);var s=e.IJToST(i,n,[.5,.5]),o=e.STToUV(s),a=e.FaceUVToXYZ(t,o),c=e.XYZToFaceUV(a);return t=c[0],o=c[1],s=e.UVToST(o),i=e.STToIJ(s,n),e.S2Cell.FromFaceIJ(t,i,n)},i=this.face,n=this.ij[0],r=this.ij[1],s=this.level;return[t(i,[n-1,r],s),t(i,[n,r-1],s),t(i,[n+1,r],s),t(i,[n,r+1],s)]},e.FACE_BITS=3,e.MAX_LEVEL=30,e.POS_BITS=2*e.MAX_LEVEL+1,e.facePosLevelToId=e.S2Cell.facePosLevelToId=e.fromFacePosLevel=function(i,n,r){var s,o,a,c=t.dcodeIO&&t.dcodeIO.Long||tw;for(r||(r=n.length),n.length>r&&(n=n.substr(0,r)),s=c.fromString(i.toString(10),!0,10).toString(2);s.length<e.FACE_BITS;)s="0"+s;for(o=c.fromString(n,!0,4).toString(2);o.length<2*r;)o="0"+o;for(a=s+o,a+="1";a.length<e.FACE_BITS+e.POS_BITS;)a+="0";return c.fromString(a,!0,2).toString(10)},e.keyToId=e.S2Cell.keyToId=e.toId=e.toCellId=e.fromKey=function(t){var i=t.split("/");return e.fromFacePosLevel(i[0],i[1],i[1].length)},e.idToKey=e.S2Cell.idToKey=e.S2Cell.toKey=e.toKey=e.fromId=e.fromCellId=e.S2Cell.toHilbertQuadkey=e.toHilbertQuadkey=function(i){for(var n=t.dcodeIO&&t.dcodeIO.Long||tw,r=n.fromString(i,!0,10).toString(2);r.length<e.FACE_BITS+e.POS_BITS;)r="0"+r;for(var s=r.lastIndexOf("1"),o=r.substring(0,3),a=r.substring(3,s),c=a.length/2,h=n.fromString(o,!0,2).toString(10),l=n.fromString(a,!0,2).toString(4);l.length<c;)l="0"+l;return h+"/"+l},e.keyToLatLng=e.S2Cell.keyToLatLng=function(t){return e.S2Cell.FromHilbertQuadKey(t).getLatLng()},e.idToLatLng=e.S2Cell.idToLatLng=function(t){var i=e.idToKey(t);return e.keyToLatLng(i)},e.S2Cell.latLngToKey=e.latLngToKey=e.latLngToQuadkey=function(t,i,n){if(isNaN(n)||n<1||n>30)throw new Error("'level' is not a number between 1 and 30 (but it should be)");return e.S2Cell.FromLatLng({lat:t,lng:i},n).toHilbertQuadkey()},e.stepKey=function(e,i){var n,r=t.dcodeIO&&t.dcodeIO.Long||tw,s=e.split("/"),o=s[0],a=s[1],c=s[1].length,h=r.fromString(a,!0,4);i>0?n=h.add(Math.abs(i)):i<0&&(n=h.subtract(Math.abs(i)));var l=n.toString(4);for("0"===l&&console.warning(new Error("face/position wrapping is not yet supported"));l.length<c;)l="0"+l;return o+"/"+l},e.S2Cell.prevKey=e.prevKey=function(t){return e.stepKey(t,-1)},e.S2Cell.nextKey=e.nextKey=function(t){return e.stepKey(t,1)}}(t.exports)}));class iw extends Kx{constructor(t=17){super(),this._level=t}bboxToCellIds(t,e){return this._approxBboxToCellIds(t,e)}getAdjacent(t){const e=ew.S2.idToKey(t),i=e.split("/")[1].length,[n,r,s,o]=this._getNeighbors(e,i),a=[e,n,r,s,o],c=Array.from(new Set([...this._getNeighbors(n,i),...this._getNeighbors(r,i),...this._getNeighbors(s,i),...this._getNeighbors(o,i)].filter((t=>!a.includes(t))))),h=[n,r,s,o];for(const t of c){let e=0;for(const n of this._getNeighbors(t,i))a.includes(n)&&e++;2===e&&h.push(t)}return h.map((t=>ew.S2.keyToId(t)))}getVertices(t){const e=ew.S2.idToKey(t);return ew.S2.S2Cell.FromHilbertQuadKey(e).getCornerLatLngs().map((t=>({lat:t.lat,lng:t.lng})))}lngLatToCellId(t){return this._lngLatToId(t,this._level)}_getNeighbors(t,e){const i=ew.S2.keyToLatLng(t);return ew.S2.latLngToNeighborKeys(i.lat,i.lng,e)}_lngLatToId(t,e){const i=ew.S2.latLngToKey(t.lat,t.lng,e);return ew.S2.keyToId(i)}}class nw{clusterReconstruction(t){const e=t.points,i=1/255;for(const t in e){if(!e.hasOwnProperty(t))continue;const n=e[t].color;n[0]*=i,n[1]*=i,n[2]*=i}const n=t.reference_lla;return{id:null,points:e,reference:{alt:n.altitude,lat:n.latitude,lng:n.longitude}}}coreImage(t){const e=this._geometry(t.geometry),i=this._geometry(t.computed_geometry),n={id:t.sequence};return{computed_geometry:i,geometry:e,id:t.id,sequence:n}}spatialImage(t){var e,i,n,r;t.camera_type=function(t){switch(t){case"equirectangular":case"spherical":return"spherical";case"fisheye":return"fisheye";default:return"perspective"}}(t.camera_type),t.merge_id=t.merge_cc?t.merge_cc.toString():null,t.private=null;const s="spherical"===t.camera_type?t.thumb_2048_url:t.thumb_1024_url;return t.thumb=null!==(e=t.thumb)&&void 0!==e?e:{id:null,url:s},t.cluster=null!==(i=t.sfm_cluster)&&void 0!==i?i:{id:null,url:null},t.creator={id:null,username:null},t.owner=null!==(n=t.owner)&&void 0!==n?n:{id:null},t.mesh=null!==(r=t.mesh)&&void 0!==r?r:{id:null,url:null},t}_geometry(t){const e=null==t?void 0:t.coordinates;return e?{lat:e[1],lng:e[0]}:null}}class rw{constructor(){this.imagesPath="images",this.sequencePath="image_ids",this._imageTilesPath="tiles",this.coreFields=["computed_geometry","geometry","sequence"],this.idFields=["id"],this.spatialFields=["altitude","atomic_scale","camera_parameters","camera_type","captured_at","compass_angle","computed_altitude","computed_compass_angle","computed_rotation","exif_orientation","height","merge_cc","mesh","quality_score","sfm_cluster","thumb_1024_url","thumb_2048_url","width"],this.imageTileFields=["url","z","x","y"]}images(t,e){return`image_ids=${t.join(",")}&fields=${e.join(",")}`}imagesS2(t,e){return`s2=${t}&fields=${e.join(",")}`}imageTiles(t,e){return`z=${t}&fields=${e.join(",")}`}imageTilesPath(t){return`${t}/${this._imageTilesPath}`}sequence(t){return`sequence_id=${t}`}}class sw extends Qx{constructor(t,e,i,n){var r;super(null!=e?e:new iw),this._convert=null!=i?i:new nw,this._query=null!=n?n:new rw,this._method="GET";const s=null!=t?t:{};this._endpoint=null!==(r=s.endpoint)&&void 0!==r?r:"https://graph.mapillary.com",this._accessToken=s.accessToken}getCluster(t,e){return Xx(t,e).then((t=>{const e=Wx(t);if(e.length<1)throw new Error("Cluster reconstruction empty");return this._convert.clusterReconstruction(e[0])}))}getCoreImages(t){const e=[...this._query.idFields,...this._query.coreFields],i=this._query.imagesS2(t,e),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>{const i={cell_id:t,images:[]},n=e.data;for(const t of n){const e=this._convert.coreImage(t);i.images.push(e)}return i}))}getImageBuffer(t,e){return Xx(t,e)}getImages(t){const e=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(t,e),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>{const e=[],i=t.data;for(const t of i){const i=this._convert.coreImage(t),n=this._convert.spatialImage(t),r={node:Object.assign({},n,i),node_id:t.id};e.push(r)}return e}))}getImageTiles(t){const e=[...this._query.imageTileFields],i=this._query.imageTiles(t.z,e),n=new URL(this._query.imageTilesPath(t.imageId),this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>({node:e.data,node_id:t.imageId})))}getMesh(t,e){return Xx(t,e).then((t=>Zx(t)))}getSequence(t){const e=this._query.sequence(t),i=new URL(this._query.sequencePath,this._endpoint).href;return this._fetchGraphContract(e,i).then((e=>({id:t,image_ids:e.data.map((t=>t.id))})))}getSpatialImages(t){const e=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(t,e),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>{const e=[],i=t.data;for(const t of i){const i={node:this._convert.spatialImage(t),node_id:t.id};e.push(i)}return e}))}setAccessToken(t){this._accessToken=t}_createHeaders(){const t=[{name:"Accept",value:"application/json"},{name:"Content-Type",value:"application/x-www-form-urlencoded"}];return this._accessToken&&t.push({name:"Authorization",value:`OAuth ${this._accessToken}`}),t}_fetchGraphContract(t,e){return Yx(`${e}?${t}`,this._method,"json",this._createHeaders(),null,null).catch((t=>{const e=this._makeErrorMessage(t);throw new cd(e)}))}_makeErrorMessage(t){const e=t.error;return e?`${e.code} (${e.type}, ${e.fbtrace_id}): ${e.message}`:"Failed to fetch data"}}class ow{constructor(t,e){this._id=t,this._lngLat=e}get id(){return this._id}get geometry(){return this._geometry}get lngLat(){return this._lngLat}createGeometry(t){this._geometry||(this._createGeometry(t),this._geometry.updateMatrixWorld(!0))}disposeGeometry(){this._geometry&&(this._disposeGeometry(),this._geometry=void 0)}getInteractiveObjects(){return this._geometry?this._getInteractiveObjects():[]}lerpAltitude(t,e){this._geometry&&(this._geometry.position.z=(1-e)*this._geometry.position.z+e*t)}updatePosition(t,e){e&&(this._lngLat.lat=e.lat,this._lngLat.lng=e.lng),this._geometry&&(this._geometry.position.fromArray(t),this._geometry.updateMatrixWorld(!0))}}let aw;function cw(){return void 0===aw&&(aw=function(){const t={alpha:!1,antialias:!1,depth:!0,failIfMajorPerformanceCaveat:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,stencil:!0},e=document.createElement("canvas");if(e.getContext("webgl2",t))return!0;const i=e.getContext("webgl",t)||e.getContext("experimental-webgl",t);if(!i)return!1;const n=["OES_standard_derivatives"],r=i.getSupportedExtensions();for(const t of n)if(-1===r.indexOf(t))return!1;return!0}()),aw}function hw(){return"undefined"!=typeof window&&"undefined"!=typeof document&&!!(Array.prototype&&Array.prototype.concat&&Array.prototype.filter&&Array.prototype.includes&&Array.prototype.indexOf&&Array.prototype.join&&Array.prototype.map&&Array.prototype.push&&Array.prototype.pop&&Array.prototype.reverse&&Array.prototype.shift&&Array.prototype.slice&&Array.prototype.splice&&Array.prototype.sort&&Array.prototype.unshift)&&"Blob"in window&&"URL"in window&&!!(Function.prototype&&Function.prototype.apply&&Function.prototype.bind)&&"JSON"in window&&"parse"in JSON&&"stringify"in JSON&&"Map"in window&&!!(Object.assign&&Object.keys&&Object.values)&&!!("Promise"in window&&Promise.resolve&&Promise.reject&&Promise.prototype&&Promise.prototype.catch&&Promise.prototype.then)&&"Set"in window}var lw,uw;t.CameraControls=void 0,(lw=t.CameraControls||(t.CameraControls={}))[lw.Custom=0]="Custom",lw[lw.Earth=1]="Earth",lw[lw.Street=2]="Street",t.RenderMode=void 0,(uw=t.RenderMode||(t.RenderMode={}))[uw.Letterbox=0]="Letterbox",uw[uw.Fill=1]="Fill",t.RenderPass=void 0,function(t){t[t.Opaque=0]="Opaque"}(t.RenderPass||(t.RenderPass={}));class dw{constructor(t,e,i,n,r,s){this._container=t,this._observer=i,this._navigator=e,this._options=null!=r?r:{},this._key=n,this._navigable=null==n,this._componentService=s||new Wd(this._container,this._navigator),this._coverComponent=this._componentService.getCover(),this._initializeComponents(),n?(this._initilizeCoverComponent(),this._subscribeCoverComponent()):this._navigator.movedToId$.pipe(Ee((t=>null!=t))).subscribe((t=>{this._key=t,this._componentService.deactivateCover(),this._coverComponent.configure({id:this._key,state:Ff.Hidden}),this._subscribeCoverComponent(),this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit()}))}get navigable(){return this._navigable}get(t){return this._componentService.get(t)}activate(t){this._componentService.activate(t)}activateCover(){this._coverComponent.configure({state:Ff.Visible})}deactivate(t){this._componentService.deactivate(t)}deactivateCover(){this._coverComponent.configure({state:Ff.Loading})}remove(){this._componentService.remove(),null!=this._configurationSubscription&&this._configurationSubscription.unsubscribe()}_initializeComponents(){var t,e;const i=this._options;this._uFalse(null===(t=i.fallback)||void 0===t?void 0:t.image,"imagefallback"),this._uFalse(null===(e=i.fallback)||void 0===e?void 0:e.navigation,"navigationfallback"),this._uFalse(i.marker,"marker"),this._uFalse(i.popup,"popup"),this._uFalse(i.slider,"slider"),this._uFalse(i.spatial,"spatial"),this._uFalse(i.tag,"tag"),this._uTrue(i.attribution,"attribution"),this._uTrue(i.bearing,"bearing"),this._uTrue(i.cache,"cache"),this._uTrue(i.direction,"direction"),this._uTrue(i.image,"image"),this._uTrue(i.keyboard,"keyboard"),this._uTrue(i.pointer,"pointer"),this._uTrue(i.sequence,"sequence"),this._uTrue(i.zoom,"zoom")}_initilizeCoverComponent(){let t=this._options;this._coverComponent.configure({id:this._key}),void 0===t.cover||t.cover?this.activateCover():this.deactivateCover()}_setNavigable(t){this._navigable!==t&&(this._navigable=t,this._observer.navigable$.next(t))}_subscribeCoverComponent(){this._configurationSubscription=this._coverComponent.configuration$.pipe(ue(void 0,(t=>t.state))).subscribe((t=>{t.state===Ff.Loading?this._navigator.stateService.currentId$.pipe(Ee(),ri((e=>{const i=null==e||e!==t.id;return i&&this._setNavigable(!1),i?this._navigator.moveTo$(t.id):this._navigator.stateService.currentImage$.pipe(Ee())}))).subscribe((()=>{this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit(),this._coverComponent.configure({state:Ff.Hidden}),this._componentService.deactivateCover(),this._setNavigable(!0)}),(t=>{console.error("Failed to deactivate cover.",t),this._coverComponent.configure({state:Ff.Visible})})):t.state===Ff.Visible&&(this._observer.stopEmit(),this._navigator.stateService.stop(),this._navigator.cacheService.stop(),this._navigator.playService.stop(),this._navigator.panService.stop(),this._componentService.activateCover(),this._setNavigable(null==t.id))}))}_uFalse(t,e){void 0!==t?"boolean"!=typeof t?(this._componentService.configure(e,t),this._componentService.activate(e)):t?this._componentService.activate(e):this._componentService.deactivate(e):this._componentService.deactivate(e)}_uTrue(t,e){void 0!==t?"boolean"!=typeof t?(this._componentService.configure(e,t),this._componentService.activate(e)):t?this._componentService.activate(e):this._componentService.deactivate(e):this._componentService.activate(e)}}class pw{constructor(e,i,n){this._adaptiveOperation$=new T,this._render$=new T,this._renderAdaptive$=new T,this._subscriptions=new Uf,this._renderService=i,this._currentFrame$=n;const r=this._subscriptions,s=jf.create(jf.h("div.mapillary-dom-renderer",[]));e.appendChild(s),this._offset$=this._adaptiveOperation$.pipe(Le(((t,e)=>e(t)),{elementHeight:e.offsetHeight,elementWidth:e.offsetWidth,imageAspect:0,renderMode:t.RenderMode.Fill}),Nt((t=>t.imageAspect>0&&t.elementWidth>0&&t.elementHeight>0)),rt((e=>{const i=e.elementWidth/e.elementHeight,n=e.imageAspect/i;let r=0,s=0;return e.renderMode===t.RenderMode.Letterbox?e.imageAspect>i?r=e.elementHeight*(1-1/n)/2:s=e.elementWidth*(1-n)/2:e.imageAspect>i?s=-e.elementWidth*(n-1)/2:r=-e.elementHeight*(1/n-1)/2,{bottom:r,left:s,right:s,top:r}})));const o=this._currentFrame$.pipe(Nt((t=>null!=t.state.currentImage)),ue(((t,e)=>t===e),(t=>t.state.currentImage.id)),rt((t=>t.state.currentTransform.basicAspect)),rt((t=>e=>(e.imageAspect=t,e)))).subscribe(this._adaptiveOperation$),a=gt(this._renderAdaptive$.pipe(Le(((t,e)=>(null==e.vNode?delete t[e.name]:t[e.name]=e.vNode,t)),{})),this._offset$).pipe(rt((t=>{const e=[],i=t[0];for(const t in i)i.hasOwnProperty(t)&&e.push(i[t]);const n=t[1],r={style:{bottom:n.bottom+"px",left:n.left+"px","pointer-events":"none",position:"absolute",right:n.right+"px",top:n.top+"px"}};return{name:"mapillary-dom-adaptive-renderer",vNode:jf.h("div.mapillary-dom-adaptive-renderer",r,e)}}))).subscribe(this._render$);this._vNode$=this._render$.pipe(Le(((t,e)=>(null==e.vNode?delete t[e.name]:t[e.name]=e.vNode,t)),{}),rt((t=>{const e=[];for(const i in t)t.hasOwnProperty(i)&&e.push(t[i]);return jf.h("div.mapillary-dom-renderer",e)}))),this._vPatch$=this._vNode$.pipe(Le(((t,e)=>(t.vpatch=jf.diff(t.vNode,e),t.vNode=e,t)),{vNode:jf.h("div.mapillary-dom-renderer",[]),vpatch:null}),function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var i=t.length;if(0===i)throw new Error("list of properties cannot be empty.");return function(e){return rt(je(t,i))(e)}}("vpatch")),this._element$=this._vPatch$.pipe(Le(((t,e)=>jf.patch(t,e)),s),Ue(1),E()),r.push(o),r.push(a),r.push(this._element$.subscribe((()=>{}))),r.push(this._renderService.size$.pipe(rt((t=>e=>(e.elementWidth=t.width,e.elementHeight=t.height,e)))).subscribe(this._adaptiveOperation$)),r.push(this._renderService.renderMode$.pipe(rt((t=>e=>(e.renderMode=t,e)))).subscribe(this._adaptiveOperation$))}get element$(){return this._element$}get render$(){return this._render$}get renderAdaptive$(){return this._renderAdaptive$}clear(t){this._renderAdaptive$.next({name:t,vNode:null}),this._render$.next({name:t,vNode:null})}remove(){this._subscriptions.unsubscribe()}}class fw{constructor(t,e,i){this._renderFrame$=new T,this._renderCameraOperation$=new T,this._render$=new T,this._clear$=new T,this._renderOperation$=new T,this._rendererOperation$=new T,this._eraserOperation$=new T,this._triggerOperation$=new T,this._subscriptions=new Uf,this._opaqueRender$=new T,this._renderService=i;const n=this._subscriptions;this._renderer$=this._rendererOperation$.pipe(Le(((t,e)=>e(t)),{needsRender:!1,renderer:null}),Nt((t=>!!t.renderer))),this._renderCollection$=this._renderOperation$.pipe(Le(((t,e)=>e(t)),{}),Ze()),this._renderCamera$=this._renderCameraOperation$.pipe(Le(((t,e)=>e(t)),{frameId:-1,needsRender:!1,perspective:null})),this._eraser$=this._eraserOperation$.pipe(ni((t=>t)),Le(((t,e)=>e(t)),{needsRender:!1}));const r=this._triggerOperation$.pipe(ni((t=>t)),Le(((t,e)=>e(t)),{needsRender:!1})),s=new Dr(986895),o=gt(this._renderer$,this._renderCollection$,this._renderCamera$,this._eraser$,r).pipe(rt((([t,e,i,n,r])=>({camera:i,eraser:n,trigger:r,renderer:t,renders:Object.keys(e).map((t=>e[t]))}))),Nt((t=>{let e=t.renderer.needsRender||t.camera.needsRender||t.eraser.needsRender||t.trigger.needsRender;const i=t.camera.frameId;for(const n of t.renders){if(n.frameId!==i)return!1;e=e||n.needsRender}return e})),ue(((t,e)=>t===e),(t=>t.eraser.needsRender||t.trigger.needsRender?-t.camera.frameId:t.camera.frameId))).subscribe((t=>{t.renderer.needsRender=!1,t.camera.needsRender=!1,t.eraser.needsRender=!1,t.trigger.needsRender=!1;const e=t.camera.perspective,i=[],n=[];for(const e of t.renders)e.pass===rm.Background?i.push(e.render):e.pass===rm.Opaque&&n.push(e.render);const r=t.renderer.renderer;r.resetState(),r.setClearColor(s,1),r.clear();for(const t of i)t(e,r);r.clearDepth();for(const t of n)t(e,r);r.resetState(),this._opaqueRender$.next()}));n.push(o),n.push(this._renderFrame$.pipe(rt((t=>e=>(e.frameId=t.frameId,e.perspective=t.perspective,!0===t.changed&&(e.needsRender=!0),e)))).subscribe(this._renderCameraOperation$)),this._renderFrameSubscribe();const a=this._render$.pipe(rt((t=>e=>(e[t.name]=t.renderer,e)))),c=this._clear$.pipe(rt((t=>e=>(delete e[t],e))));n.push(Ot(a,c).subscribe(this._renderOperation$)),this._webGLRenderer$=this._render$.pipe(Ee(),rt((()=>{e.appendChild(t);const n=i.element,r=new Ja({canvas:t});return r.setPixelRatio(window.devicePixelRatio),r.setSize(n.offsetWidth,n.offsetHeight),r.autoClear=!1,r})),Ue(1),E()),n.push(this._webGLRenderer$.subscribe((()=>{})));const h=this._webGLRenderer$.pipe(Ee(),rt((t=>e=>(e.needsRender=!0,e.renderer=t,e)))),l=this._renderService.size$.pipe(rt((t=>e=>(null==e.renderer||(e.renderer.setSize(t.width,t.height),e.needsRender=!0),e)))),u=this._clear$.pipe(rt((()=>t=>(null==t.renderer||(t.needsRender=!0),t))));n.push(Ot(h,l,u).subscribe(this._rendererOperation$));const d=this._renderCollection$.pipe(Nt((t=>0===Object.keys(t).length)),Ze());n.push(d.subscribe((()=>{null!=this._renderFrameSubscription&&(this._renderFrameSubscription.unsubscribe(),this._renderFrameSubscription=null,this._renderFrameSubscribe())}))),n.push(d.pipe(rt((()=>t=>(t.needsRender=!0,t)))).subscribe(this._eraserOperation$))}get render$(){return this._render$}get opaqueRender$(){return this._opaqueRender$}get webGLRenderer$(){return this._webGLRenderer$}clear(t){this._clear$.next(t)}remove(){this._rendererOperation$.next((t=>{if(null!=t.renderer){const e=t.renderer.getContext().getExtension("WEBGL_lose_context");e&&e.loseContext(),t.renderer=null}return t})),null!=this._renderFrameSubscription&&this._renderFrameSubscription.unsubscribe(),this._subscriptions.unsubscribe()}triggerRerender(){this._renderService.renderCameraFrame$.pipe(Je(1),Ee()).subscribe((()=>{this._triggerOperation$.next((t=>(t.needsRender=!0,t)))}))}_renderFrameSubscribe(){this._render$.pipe(Ee(),rt((()=>t=>(t.needsRender=!0,t)))).subscribe((t=>{this._renderCameraOperation$.next(t)})),this._renderFrameSubscription=this._render$.pipe(Ee(),Mt((()=>this._renderService.renderCameraFrame$))).subscribe(this._renderFrame$)}}class mw{constructor(t,e,i){this._spatial=new ld,this._viewportCoords=new Wf,this._size={width:t,height:e},this._initialFov=60,this._alpha=-1,this._renderMode=i,this._zoom=0,this._frameId=-1,this._changed=!1,this._changedForFrame=-1,this._currentImageId=null,this._previousImageId=null,this._currentSpherical=!1,this._previousSpherical=!1,this._state=null,this._currentProjectedPoints=[],this._previousProjectedPoints=[],this._currentFov=this._initialFov,this._previousFov=this._initialFov,this._camera=new jd,this._perspective=new Ds(this._initialFov,this._computeAspect(t,e),.16,1e4),this._perspective.position.copy(this._camera.position),this._perspective.up.copy(this._camera.up),this._perspective.lookAt(this._camera.lookat),this._perspective.updateMatrixWorld(!0),this._perspective.matrixAutoUpdate=!1,this._rotation={phi:0,theta:0}}get alpha(){return this._alpha}get camera(){return this._camera}get changed(){return this._frameId===this._changedForFrame}get frameId(){return this._frameId}get perspective(){return this._perspective}get renderMode(){return this._renderMode}get rotation(){return this._rotation}get zoom(){return this._zoom}get size(){return this._size}getTilt(){return 90-this._spatial.radToDeg(this._rotation.theta)}fovToZoom(t){t=Math.min(90,Math.max(0,t));const e=this._computeCurrentFov(0),i=1===this._alpha?e:this._interpolateFov(e,this._computePreviousFov(0),this._alpha),n=Math.tan(i/2*Math.PI/180),r=Math.tan(t/2*Math.PI/180);return Math.log(n/r)/Math.log(2)}setFrame(t){const e=t.state;e.state!==this._state&&(this._state=e.state,this._state!==vm.Custom&&(this.setRenderMode(this._renderMode),this.setSize(this._size)),this._changed=!0);const i=e.currentImage.id,n=e.previousImage?e.previousImage.id:null;i!==this._currentImageId&&(this._currentImageId=i,this._currentSpherical=dd(e.currentTransform.cameraType),this._currentProjectedPoints=this._computeProjectedPoints(e.currentTransform),this._changed=!0),n!==this._previousImageId&&(this._previousImageId=n,this._previousSpherical=dd(e.previousTransform.cameraType),this._previousProjectedPoints=this._computeProjectedPoints(e.previousTransform),this._changed=!0);const r=e.zoom;r!==this._zoom&&(this._zoom=r,this._changed=!0),this._changed&&(this._currentFov=this._computeCurrentFov(this.zoom),this._previousFov=this._computePreviousFov(this._zoom));const s=e.alpha;if(this._changed||s!==this._alpha){switch(this._alpha=s,this._state){case vm.Earth:this._perspective.fov=60,this._changed=!0;break;case vm.Custom:break;default:this._perspective.fov=this._interpolateFov(this._currentFov,this._previousFov,this._alpha),this._changed=!0}this._state!==vm.Custom&&this._perspective.updateProjectionMatrix()}const o=e.camera;this._camera.diff(o)>1e-9&&(this._camera.copy(o),this._rotation=this._computeRotation(o),this._perspective.up.copy(o.up),this._perspective.position.copy(o.position),this._perspective.matrixAutoUpdate=!0,this._perspective.lookAt(o.lookat),this._perspective.matrixAutoUpdate=!1,this._perspective.updateMatrix(),this._perspective.updateMatrixWorld(!1),this._changed=!0),this._setFrameId(t.id)}setProjectionMatrix(t){this._perspective.projectionMatrix.fromArray(t),this._perspective.projectionMatrixInverse.copy(this._perspective.projectionMatrix).invert(),this._changed=!0}setRenderMode(t){this._renderMode=t,this._state!==vm.Custom&&(this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}setSize(t){this._size=t,this._state!==vm.Custom&&(this._perspective.aspect=this._computeAspect(t.width,t.height),this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}_computeAspect(t,e){return 0===t?0:t/e}_computeCurrentFov(t){return 0===this._perspective.aspect?0:this._currentImageId?this._currentSpherical?this._yToFov(1,t):this._computeVerticalFov(this._currentProjectedPoints,this._renderMode,t,this.perspective.aspect):this._initialFov}_computeFov(){return this._currentFov=this._computeCurrentFov(this._zoom),this._previousFov=this._computePreviousFov(this._zoom),this._interpolateFov(this._currentFov,this._previousFov,this._alpha)}_computePreviousFov(t){return 0===this._perspective.aspect?0:this._currentImageId?this._previousImageId?this._previousSpherical?this._yToFov(1,t):this._computeVerticalFov(this._previousProjectedPoints,this._renderMode,t,this.perspective.aspect):this._currentFov:this._initialFov}_computeProjectedPoints(t){return md(t,[[.5,0],[1,0]],[[.5,0],[0,.5]],100,this._viewportCoords)}_computeRequiredVerticalFov(t,e,i){const n=Math.max(t[0]/i,t[1]);return this._yToFov(n,e)}_computeRotation(t){let e=t.lookat.clone().sub(t.position),i=t.up.clone();return{phi:this._spatial.azimuthal(e.toArray(),i.toArray()),theta:Math.PI/2-this._spatial.angleToPlane(e.toArray(),[0,0,1])}}_computeVerticalFov(e,i,n,r){const s=e.map((t=>this._computeRequiredVerticalFov(t,n,r)));return i===t.RenderMode.Fill?.995*Math.min(...s):Math.max(...s)}_yToFov(t,e){return 2*Math.atan(t/Math.pow(2,e))*180/Math.PI}_interpolateFov(t,e,i){return i*t+(1-i)*e}_setFrameId(t){this._frameId=t,this._changed&&(this._changed=!1,this._changedForFrame=t)}}class gw{constructor(e,i,n,r){this._subscriptions=new Uf,this._element=e,this._currentFrame$=i,this._spatial=new ld,n=null!=n?n:t.RenderMode.Fill,this._resize$=new T,this._projectionMatrix$=new T,this._renderCameraOperation$=new T,this._size$=new O({height:this._element.offsetHeight,width:this._element.offsetWidth});const s=this._subscriptions;s.push(this._resize$.pipe(rt((()=>({height:this._element.offsetHeight,width:this._element.offsetWidth})))).subscribe(this._size$)),this._renderMode$=new O(n),this._renderCameraHolder$=this._renderCameraOperation$.pipe(ni((t=>t)),Le(((t,e)=>e(t)),null!=r?r:new mw(this._element.offsetWidth,this._element.offsetHeight,n)),Ue(1),E()),this._renderCameraFrame$=this._currentFrame$.pipe(bi(this._renderCameraHolder$),pi((([t,e])=>{e.setFrame(t)})),rt((t=>t[1])),Ue(1),E()),this._renderCamera$=this._renderCameraFrame$.pipe(Nt((t=>t.changed)),Ue(1),E()),this._bearing$=this._renderCamera$.pipe(rt((t=>{let e=this._spatial.radToDeg(this._spatial.azimuthalToBearing(t.rotation.phi));return this._spatial.wrap(e,0,360)})),Ue(1),E()),s.push(this._size$.pipe(Je(1),rt((t=>e=>(e.setSize(t),e)))).subscribe(this._renderCameraOperation$)),s.push(this._renderMode$.pipe(Je(1),rt((t=>e=>(e.setRenderMode(t),e)))).subscribe(this._renderCameraOperation$)),s.push(this._projectionMatrix$.pipe(rt((t=>e=>(e.setProjectionMatrix(t),e)))).subscribe(this._renderCameraOperation$)),s.push(this._bearing$.subscribe((()=>{}))),s.push(this._renderCameraHolder$.subscribe((()=>{}))),s.push(this._size$.subscribe((()=>{}))),s.push(this._renderMode$.subscribe((()=>{}))),s.push(this._renderCamera$.subscribe((()=>{}))),s.push(this._renderCameraFrame$.subscribe((()=>{})))}get bearing$(){return this._bearing$}get element(){return this._element}get projectionMatrix$(){return this._projectionMatrix$}get renderCamera$(){return this._renderCamera$}get renderCameraFrame$(){return this._renderCameraFrame$}get renderMode$(){return this._renderMode$}get resize$(){return this._resize$}get size$(){return this._size$}dispose(){this._subscriptions.unsubscribe()}}class _w{constructor(t){this._keyDown$=Pt(t,"keydown"),this._keyUp$=Pt(t,"keyup")}get keyDown$(){return this._keyDown$}get keyUp$(){return this._keyUp$}}const vw={0:1,2:2};class yw{constructor(t,e,i,n){this._subscriptions=new Uf;const r=this._subscriptions;this._activeSubject$=new O(!1),this._active$=this._activeSubject$.pipe(ue(),Ue(1),E()),this._claimMouse$=new T,this._claimWheel$=new T,this._deferPixelClaims$=new T,this._deferPixels$=this._deferPixelClaims$.pipe(Le(((t,e)=>(null==e.deferPixels?delete t[e.name]:t[e.name]=e.deferPixels,t)),{}),rt((t=>{let e=-1;for(const i in t){if(!t.hasOwnProperty(i))continue;const n=t[i];n>e&&(e=n)}return e})),ni(-1),Ue(1),E()),r.push(this._deferPixels$.subscribe((()=>{}))),this._documentMouseMove$=Pt(n,"pointermove").pipe(Nt(this._isMousePen)),this._documentMouseUp$=Pt(n,"pointerup").pipe(Nt(this._isMousePen)),this._mouseDown$=Pt(e,"pointerdown").pipe(Nt(this._isMousePen)),this._mouseEnter$=Pt(e,"pointerenter").pipe(Nt(this._isMousePen)),this._mouseLeave$=Pt(e,"pointerleave").pipe(Nt(this._isMousePen)),this._mouseMove$=Pt(e,"pointermove").pipe(Nt(this._isMousePen)),this._mouseUp$=Pt(e,"pointerup").pipe(Nt(this._isMousePen)),this._mouseOut$=Pt(e,"pointerout").pipe(Nt(this._isMousePen)),this._mouseOver$=Pt(e,"pointerover").pipe(Nt(this._isMousePen)),this._domMouseDown$=Pt(i,"pointerdown").pipe(Nt(this._isMousePen)),this._domMouseMove$=Pt(i,"pointermove").pipe(Nt(this._isMousePen)),this._click$=Pt(e,"click"),this._contextMenu$=Pt(e,"contextmenu"),this._windowBlur$=Pt(window,"blur"),this._dblClick$=Ot(Pt(t,"click"),Pt(e,"dblclick")).pipe(Xt(3,1),Nt((t=>{const i=t[0],n=t[1],r=t[2];return"click"===i.type&&"click"===n.type&&"dblclick"===r.type&&i.target.parentNode===e&&n.target.parentNode===e})),rt((t=>t[2])),Ze()),r.push(Ot(this._domMouseDown$,this._domMouseMove$,this._dblClick$,this._contextMenu$).subscribe((t=>{t.preventDefault()}))),this._mouseWheel$=Ot(Pt(e,"wheel"),Pt(i,"wheel")).pipe(Ze()),this._consistentContextMenu$=Ot(this._mouseDown$,this._mouseMove$,this._mouseOut$,this._mouseUp$,this._contextMenu$).pipe(Xt(3,1),Nt((t=>"pointerdown"===t[0].type&&"contextmenu"===t[1].type&&"pointerup"===t[2].type)),rt((t=>t[1])),Ze());const s=Ot(this._windowBlur$,this._documentMouseMove$.pipe(Nt((t=>this._buttonReleased(t,0)))),this._documentMouseUp$.pipe(Nt((t=>0===this._mouseButton(t))))).pipe(Ze()),o=this._createMouseDragInitiate$(0,this._mouseDown$,s,!0).pipe(Ze());this._mouseDragStart$=this._createMouseDragStart$(o).pipe(Ze()),this._mouseDrag$=this._createMouseDrag$(o,s).pipe(Ze()),this._mouseDragEnd$=this._createMouseDragEnd$(this._mouseDragStart$,s).pipe(Ze());const a=this._createMouseDragInitiate$(0,this._domMouseDown$,s,!1).pipe(Ze());this._domMouseDragStart$=this._createMouseDragStart$(a).pipe(Ze()),this._domMouseDrag$=this._createMouseDrag$(a,s).pipe(Ze()),this._domMouseDragEnd$=this._createMouseDragEnd$(this._domMouseDragStart$,s).pipe(Ze());const c=Ot(this._windowBlur$,this._documentMouseMove$.pipe(Nt((t=>this._buttonReleased(t,2)))),this._documentMouseUp$.pipe(Nt((t=>2===this._mouseButton(t))))).pipe(Ze()),h=this._createMouseDragInitiate$(2,this._mouseDown$,c,!0).pipe(Ze());this._mouseRightDragStart$=this._createMouseDragStart$(h).pipe(Ze()),this._mouseRightDrag$=this._createMouseDrag$(h,c).pipe(Ze()),this._mouseRightDragEnd$=this._createMouseDragEnd$(this._mouseRightDragStart$,c).pipe(Ze()),this._proximateClick$=this._mouseDown$.pipe(ri((t=>this._click$.pipe(ai(this._createDeferredMouseMove$(t,this._documentMouseMove$)),ve(1)))),Ze()),this._staticClick$=this._mouseDown$.pipe(ri((()=>this._click$.pipe(ai(this._documentMouseMove$),ve(1)))),Ze()),r.push(this._mouseDragStart$.subscribe()),r.push(this._mouseDrag$.subscribe()),r.push(this._mouseDragEnd$.subscribe()),r.push(this._domMouseDragStart$.subscribe()),r.push(this._domMouseDrag$.subscribe()),r.push(this._domMouseDragEnd$.subscribe()),r.push(this._mouseRightDragStart$.subscribe()),r.push(this._mouseRightDrag$.subscribe()),r.push(this._mouseRightDragEnd$.subscribe()),r.push(this._staticClick$.subscribe()),this._mouseOwner$=this._createOwner$(this._claimMouse$).pipe(Ue(1),E()),this._wheelOwner$=this._createOwner$(this._claimWheel$).pipe(Ue(1),E()),r.push(this._mouseOwner$.subscribe((()=>{}))),r.push(this._wheelOwner$.subscribe((()=>{})))}get active$(){return this._active$}get activate$(){return this._activeSubject$}get documentMouseMove$(){return this._documentMouseMove$}get documentMouseUp$(){return this._documentMouseUp$}get domMouseDragStart$(){return this._domMouseDragStart$}get domMouseDrag$(){return this._domMouseDrag$}get domMouseDragEnd$(){return this._domMouseDragEnd$}get domMouseDown$(){return this._domMouseDown$}get domMouseMove$(){return this._domMouseMove$}get mouseOwner$(){return this._mouseOwner$}get mouseDown$(){return this._mouseDown$}get mouseEnter$(){return this._mouseEnter$}get mouseMove$(){return this._mouseMove$}get mouseLeave$(){return this._mouseLeave$}get mouseOut$(){return this._mouseOut$}get mouseOver$(){return this._mouseOver$}get mouseUp$(){return this._mouseUp$}get click$(){return this._click$}get dblClick$(){return this._dblClick$}get contextMenu$(){return this._consistentContextMenu$}get mouseWheel$(){return this._mouseWheel$}get mouseDragStart$(){return this._mouseDragStart$}get mouseDrag$(){return this._mouseDrag$}get mouseDragEnd$(){return this._mouseDragEnd$}get mouseRightDragStart$(){return this._mouseRightDragStart$}get mouseRightDrag$(){return this._mouseRightDrag$}get mouseRightDragEnd$(){return this._mouseRightDragEnd$}get proximateClick$(){return this._proximateClick$}get staticClick$(){return this._staticClick$}get windowBlur$(){return this._windowBlur$}dispose(){this._subscriptions.unsubscribe()}claimMouse(t,e){this._claimMouse$.next({name:t,zindex:e})}unclaimMouse(t){this._claimMouse$.next({name:t,zindex:null})}deferPixels(t,e){this._deferPixelClaims$.next({name:t,deferPixels:e})}undeferPixels(t){this._deferPixelClaims$.next({name:t,deferPixels:null})}claimWheel(t,e){this._claimWheel$.next({name:t,zindex:e})}unclaimWheel(t){this._claimWheel$.next({name:t,zindex:null})}filtered$(t,e){return this._filtered(t,e,this._mouseOwner$)}filteredWheel$(t,e){return this._filtered(t,e,this._wheelOwner$)}_createDeferredMouseMove$(t,e){return e.pipe(rt((e=>{const i=e.clientX-t.clientX,n=e.clientY-t.clientY;return[e,Math.sqrt(i*i+n*n)]})),bi(this._deferPixels$),Nt((([[,t],e])=>t>e)),rt((([[t]])=>t)))}_createMouseDrag$(t,e){return t.pipe(rt((([,t])=>t)),ri((t=>At(G(t),this._documentMouseMove$).pipe(ai(e)))))}_createMouseDragEnd$(t,e){return t.pipe(ri((()=>e.pipe(Ee()))))}_createMouseDragStart$(t){return t.pipe(rt((([t])=>t)))}_createMouseDragInitiate$(t,e,i,n){return e.pipe(Nt((e=>this._mouseButton(e)===t)),ri((t=>gt(G(t),n?this._createDeferredMouseMove$(t,this._documentMouseMove$):this._documentMouseMove$).pipe(ai(i),ve(1)))))}_createOwner$(t){return t.pipe(Le(((t,e)=>(null==e.zindex?delete t[e.name]:t[e.name]=e.zindex,t)),{}),rt((t=>{let e=null,i=-1;for(const n in t)t.hasOwnProperty(n)&&t[n]>i&&(i=t[n],e=n);return e})),ni(null))}_filtered(t,e,i){return e.pipe(bi(i),Nt((([,e])=>e===t)),rt((([t])=>t)))}_mouseButton(t){const e="pointerdown"===t.type||"pointerup"===t.type,i=window.InstallTrigger;return e&&void 0!==i&&2===t.button&&t.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0?0:t.button}_buttonReleased(t,e){const i=vw[e];return void 0===t.buttons||(t.buttons&i)!==i}_isMousePen(t){const e=t.pointerType;return"mouse"===e||"pen"===e}}class bw{set json(t){this._json=t}set image(t){this._image=t,this._texture=new hn(this._image),this._texture.minFilter=Ii}get loaded(){return!(!this._image||!this._json)}getGLSprite(t){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");let e=this._json[t];if(!e)return console.warn("Sprite with key"+t+"does not exist in sprite definition."),new pr;let i=this._texture.clone();i.needsUpdate=!0;let n=this._image.width,r=this._image.height;return i.offset.x=e.x/n,i.offset.y=(r-e.y-e.height)/r,i.repeat.x=e.width/n,i.repeat.y=e.height/r,new _c(new nc({map:i}))}getDOMSprite(e,i){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");null==i&&(i=t.Alignment.Center);let n=this._json[e];if(!n)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),jf.h("div",{},[]);let r=n.y,s=n.x+n.width,o=n.y+n.height,a=n.x,c=-n.x,h=-n.y,l=this._image.height,u=this._image.width;switch(i){case t.Alignment.Bottom:case t.Alignment.Center:case t.Alignment.Top:c-=n.width/2;break;case t.Alignment.BottomLeft:case t.Alignment.Left:case t.Alignment.TopLeft:c-=n.width;break;case t.Alignment.BottomRight:case t.Alignment.Right:case t.Alignment.TopRight:}switch(i){case t.Alignment.Center:case t.Alignment.Left:case t.Alignment.Right:h-=n.height/2;break;case t.Alignment.Top:case t.Alignment.TopLeft:case t.Alignment.TopRight:h-=n.height;break;case t.Alignment.Bottom:case t.Alignment.BottomLeft:case t.Alignment.BottomRight:}let d=1/n.pixelRatio;r*=d,s*=d,o*=d,a*=d,c*=d,h*=d,l*=d,u*=d;let p={src:this._image.src,style:{clip:`rect(${r}px, ${s}px, ${o}px, ${a}px)`,height:`${l}px`,left:`${c}px`,position:"absolute",top:`${h}px`,width:`${u}px`}};return jf.h("img",p,[])}}class xw{constructor(t){if(this._retina=window.devicePixelRatio>1,this._spriteAtlasOperation$=new T,this._spriteAtlas$=this._spriteAtlasOperation$.pipe(ni((t=>t)),Le(((t,e)=>e(t)),new bw),Ue(1),E()),this._atlasSubscription=this._spriteAtlas$.subscribe((()=>{})),null==t)return;let e=this._retina?"@2x":"",i=new XMLHttpRequest;i.open("GET",t+e+".png",!0),i.responseType="arraybuffer",i.onload=()=>{let t=new Image;t.onload=()=>{this._spriteAtlasOperation$.next((e=>(e.image=t,e)))};let e=new Blob([i.response]);t.src=window.URL.createObjectURL(e)},i.onerror=i=>{console.error(new Error(`Failed to fetch sprite sheet (${t}${e}.png)`))},i.send();let n=new XMLHttpRequest;n.open("GET",t+e+".json",!0),n.responseType="text",n.onload=()=>{let t=JSON.parse(n.response);this._spriteAtlasOperation$.next((e=>(e.json=t,e)))},n.onerror=i=>{console.error(new Error(`Failed to fetch sheet (${t}${e}.json)`))},n.send()}get spriteAtlas$(){return this._spriteAtlas$}dispose(){this._atlasSubscription.unsubscribe()}}class ww{constructor(t,e){this._subscriptions=new Uf;const i=this._subscriptions;this._activeSubject$=new O(!1),this._active$=this._activeSubject$.pipe(ue(),Ue(1),E()),i.push(Pt(e,"touchmove").subscribe((t=>{t.preventDefault()}))),this._touchStart$=Pt(t,"touchstart"),this._touchMove$=Pt(t,"touchmove"),this._touchEnd$=Pt(t,"touchend"),this._touchCancel$=Pt(t,"touchcancel");const n=this._touchStart$.pipe(Nt((t=>1===t.touches.length&&1===t.targetTouches.length)),Ze());var r;this._doubleTap$=n.pipe((r=()=>n.pipe(Ee(),ri((()=>Ot(kt(300),n).pipe(ve(1))))),function(t){return t.lift(new Kt(r))}),Nt((t=>2===t.length)),rt((t=>t[t.length-1])),Ze()),i.push(this._doubleTap$.subscribe((t=>{t.preventDefault()}))),this._singleTouchMove$=this._touchMove$.pipe(Nt((t=>1===t.touches.length&&1===t.targetTouches.length)),Ze());let s=Ot(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(Nt((t=>1===t.touches.length&&1===t.targetTouches.length))),o=Ot(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(Nt((t=>t.touches.length>=1))),a=Ot(this._touchEnd$,this._touchCancel$).pipe(Nt((t=>0===t.touches.length)));this._singleTouchDragStart$=s.pipe(Mt((()=>this._singleTouchMove$.pipe(ai(Ot(a,o)),ve(1))))),this._singleTouchDragEnd$=s.pipe(Mt((()=>Ot(a,o).pipe(Ee())))),this._singleTouchDrag$=s.pipe(ri((()=>this._singleTouchMove$.pipe(Je(1),ai(Ot(o,a))))));let c=Ot(this._touchStart$,this._touchEnd$,this._touchCancel$);this._pinchStart$=c.pipe(Nt((t=>2===t.touches.length&&2===t.targetTouches.length))),this._pinchEnd$=c.pipe(Nt((t=>2!==t.touches.length||2!==t.targetTouches.length))),this._pinchOperation$=new T,this._pinch$=this._pinchOperation$.pipe(Le(((t,e)=>e(t)),{changeX:0,changeY:0,clientX:0,clientY:0,distance:0,distanceChange:0,distanceX:0,distanceY:0,originalEvent:null,pageX:0,pageY:0,screenX:0,screenY:0,touch1:null,touch2:null}));const h=this._touchMove$.pipe(Nt((t=>2===t.touches.length&&2===t.targetTouches.length)),rt((t=>e=>{let i=t.touches[0],n=t.touches[1],r=Math.min(i.clientX,n.clientX),s=Math.max(i.clientX,n.clientX),o=Math.min(i.clientY,n.clientY),a=r+(s-r)/2,c=o+(Math.max(i.clientY,n.clientY)-o)/2,h=a+i.pageX-i.clientX,l=c+i.pageY-i.clientY,u=a+i.screenX-i.clientX,d=c+i.screenY-i.clientY,p=Math.abs(i.clientX-n.clientX),f=Math.abs(i.clientY-n.clientY),m=Math.sqrt(p*p+f*f),g=m-e.distance;return{changeX:p-e.distanceX,changeY:f-e.distanceY,clientX:a,clientY:c,distance:m,distanceChange:g,distanceX:p,distanceY:f,originalEvent:t,pageX:h,pageY:l,screenX:u,screenY:d,touch1:i,touch2:n}}))).subscribe(this._pinchOperation$);i.push(h),this._pinchChange$=this._pinchStart$.pipe(ri((()=>this._pinch$.pipe(Je(1),ai(this._pinchEnd$)))))}get active$(){return this._active$}get activate$(){return this._activeSubject$}get doubleTap$(){return this._doubleTap$}get touchStart$(){return this._touchStart$}get touchMove$(){return this._touchMove$}get touchEnd$(){return this._touchEnd$}get touchCancel$(){return this._touchCancel$}get singleTouchDragStart$(){return this._singleTouchDragStart$}get singleTouchDrag$(){return this._singleTouchDrag$}get singleTouchDragEnd$(){return this._singleTouchDragEnd$}get pinch$(){return this._pinchChange$}get pinchStart$(){return this._pinchStart$}get pinchEnd$(){return this._pinchEnd$}dispose(){this._subscriptions.unsubscribe()}}class Sw{constructor(t){var e,i,n,r;const s=null!==(i=null===(e=null==t?void 0:t.url)||void 0===e?void 0:e.exploreHost)&&void 0!==i?i:"www.mapillary.com",o=`${null!==(r=null===(n=null==t?void 0:t.url)||void 0===n?void 0:n.scheme)&&void 0!==r?r:"https"}://${s}`;this._exploreUrl$=G(o);const a=!1!==(null==t?void 0:t.imageTiling);this._imageTiling$=G(a)}get exploreUrl$(){return this._exploreUrl$}get imageTiling$(){return this._imageTiling$}}class Mw{constructor(t,e,i){var n;if(this._onWindowResize=()=>{this._trackResize&&this.renderService.resize$.next()},this._dom=null!=i?i:new Xm,"string"==typeof t.container){if(this._container=this._dom.document.getElementById(t.container),!this._container)throw new Error(`Container "${t.container}" not found.`)}else{if(!(t.container instanceof HTMLElement))throw new Error('Invalid type: "container" must be a String or HTMLElement.');this._container=t.container}this._trackResize=!1!==t.trackResize,this.id=null!==(n=this._container.id)&&void 0!==n?n:"mapillary-fallback-container-id",this._container.classList.add("mapillary-viewer"),this._canvasContainer=this._dom.createElement("div","mapillary-interactive",this._container),this._canvas=this._dom.createElement("canvas","mapillary-canvas"),this._canvas.style.position="absolute",this._canvas.setAttribute("tabindex","0"),this._domContainer=this._dom.createElement("div","mapillary-dom",this._container),this.configurationService=new Sw(t),this.renderService=new gw(this._container,e.currentState$,t.renderMode),this.glRenderer=new fw(this._canvas,this._canvasContainer,this.renderService),this.domRenderer=new pw(this._domContainer,this.renderService,e.currentState$),this.keyboardService=new _w(this._canvasContainer),this.mouseService=new yw(this._container,this._canvasContainer,this._domContainer,document),this.touchService=new ww(this._canvasContainer,this._domContainer),this.spriteService=new xw(t.sprite),window.addEventListener("resize",this._onWindowResize,!1)}get canvas(){return this._canvas.parentNode?this._canvas:null}get canvasContainer(){return this._canvasContainer}get container(){return this._container}get domContainer(){return this._domContainer}remove(){window.removeEventListener("resize",this._onWindowResize,!1),this.spriteService.dispose(),this.touchService.dispose(),this.mouseService.dispose(),this.glRenderer.remove(),this.domRenderer.remove(),this.renderService.dispose(),this._removeNode(this._canvasContainer),this._removeNode(this._domContainer),this._container.classList.remove("mapillary-viewer")}_removeNode(t){t.parentNode&&t.parentNode.removeChild(t)}}class Tw{constructor(t,e,i){this._graphService=t,this._stateService=e,this._api=i,this._subscriptions=new Uf,this._started=!1,this._cellDepth=1}get started(){return this._started}configure(t){this._cellDepth=t?Math.max(1,Math.min(3,t.cellDepth)):1}start(){if(this._started)return;const t=this._subscriptions;t.push(this._stateService.currentState$.pipe(ue(void 0,(t=>t.state.currentImage.id)),rt((t=>{const e=t.state,i=e.trajectory,n=i.map((t=>t.id)),r=i[i.length-1].sequenceId;return[n,e.currentImage.originalLngLat,r]})),Xt(1,5),bi(this._graphService.graphMode$),ri((([t,e])=>{const i=t[0][0],n=t[0][1],r=this._api.data.geometry,s=vg(r.lngLatToCellId(n),this._cellDepth,r),o=e===ym.Sequence?t[0][2]:void 0;return this._graphService.uncache$(i,s,o)}))).subscribe((()=>{}))),t.push(this._graphService.graphMode$.pipe(Je(1),bi(this._stateService.currentState$),ri((([t,e])=>t===ym.Sequence?this._keyToEdges(e.state.currentImage.id,(t=>t.sequenceEdges$)):bt(e.state.trajectory.map((t=>t.id)).slice(e.state.currentIndex)).pipe(Mt((t=>this._keyToEdges(t,(t=>t.spatialEdges$))),6))))).subscribe((()=>{}))),t.push(this._graphService.dataAdded$.pipe(bi(this._stateService.currentId$),ri((([t,e])=>this._graphService.cacheImage$(e)))).subscribe((()=>{}))),this._started=!0}stop(){this._started&&(this._subscriptions.unsubscribe(),this._started=!1)}_keyToEdges(t,e){return this._graphService.cacheImage$(t).pipe(ri(e),Ee((t=>t.cached)),yi(15e3),te((e=>(console.error(`Failed to cache edges (${t}).`,e),B()))))}}class Cw{constructor(){this._loadersSubject$=new T,this._loaders$=this._loadersSubject$.pipe(Le(((t,e)=>(void 0!==e.task&&(t[e.task]=e.loading),t)),{}),ni({}),Ue(1),E())}get loading$(){return this._loaders$.pipe(rt((t=>{for(const e in t)if(t.hasOwnProperty(e)&&t[e])return!0;return!1})),re(100),ue())}taskLoading$(t){return this._loaders$.pipe(rt((e=>!!e[t])),re(100),ue())}startLoading(t){this._loadersSubject$.next({loading:!0,task:t})}stopLoading(t){this._loadersSubject$.next({loading:!1,task:t})}}var Ew;!function(t){t[t.Disabled=0]="Disabled",t[t.Enabled=1]="Enabled",t[t.Started=2]="Started"}(Ew||(Ew={}));class Iw{constructor(t,e,i,n,r,s){this._subscriptions=new Uf,this._graphService=t,this._stateService=e,this._graphCalculator=null!=n?n:new td,this._spatial=null!=r?r:new ld,this._viewportCoords=null!=s?s:new Wf,this._mode=!1!==i?Ew.Enabled:Ew.Disabled,this._panImagesSubject$=new T,this._panImages$=this._panImagesSubject$.pipe(ni([]),Ue(1),E()),this._subscriptions.push(this._panImages$.subscribe())}get panImages$(){return this._panImages$}dispose(){this.stop(),null!=this._panImagesSubscription&&this._panImagesSubscription.unsubscribe(),this._subscriptions.unsubscribe()}enable(){this._mode===Ew.Disabled&&(this._mode=Ew.Enabled,this.start())}disable(){this._mode!==Ew.Disabled&&(this.stop(),this._mode=Ew.Disabled)}start(){if(this._mode!==Ew.Enabled)return;const t=this._stateService.currentImage$.pipe(ri((t=>{if(!t.merged||dd(t.cameraType))return G([]);const e=G(t),i=this._graphCalculator.boundingBoxCorners(t.lngLat,20);return gt(e,this._graphService.cacheBoundingBox$(i[0],i[1]).pipe(te((e=>(console.error(`Failed to cache periphery bounding box (${t.id})`,e),B()))),rt((e=>{if(dd(t.cameraType))return[];const i=[];for(const n of e)n.id!==t.id&&n.mergeId===t.mergeId&&(dd(n.cameraType)||this._distance(n,t)>4||i.push(n));return i})))).pipe(bi(this._stateService.reference$),rt((([[t,e],i])=>{const n=this._spatial.viewingDirection(t.rotation),r=fd({lat:t.lngLat.lat,lng:t.lngLat.lng,alt:t.computedAltitude},t.rotation,i),s=this._createTransform(t,r),o=this._spatial.wrap(this._spatial.azimuthal(n.toArray(),s.upVector().toArray()),0,2*Math.PI),a=this._computeProjectedPoints(s),c=this._computeHorizontalFov(a)/180*Math.PI,h=Math.PI/8;let l,u;for(const r of e){const e=fd({lat:r.lngLat.lat,lng:r.lngLat.lng,alt:r.computedAltitude},r.rotation,i),s=this._createTransform(r,e),a=this._computeProjectedPoints(s),d=this._computeHorizontalFov(a)/180*Math.PI,p=this._spatial.viewingDirection(r.rotation),f=this._spatial.wrap(this._spatial.azimuthal(p.toArray(),s.upVector().toArray()),0,2*Math.PI),m=this._spatial.angleBetweenVector2(n.x,n.y,p.x,p.y);let g=Number.NEGATIVE_INFINITY;g=m>0?o>f?o-2*Math.PI+c/2-(f-d/2):o+c/2-(f-d/2):o<f?f+d/2-(o+2*Math.PI-c/2):f+d/2-(o-c/2);const _=Math.abs(d-g),v=this._distance(r,t)+Math.min(this._timeDifference(r,t),4)+20*Math.abs(g-h)+Math.min(5,1/Math.min(d/c,1))+(g>0?-2*_:0);g>0&&g<.5*c&&g<.5*d&&_>.5*c&&(m>0?l?v<l[0]&&(l=[v,r,s,d]):l=[v,r,s,d]:u?v<u[0]&&(u=[v,r,s,d]):u=[v,r,s,d])}const d=[];return l&&d.push([l[1],l[2],l[3]]),u&&d.push([u[1],u[2],u[3]]),d})),ni([]))})));this._panImagesSubscription=this._stateService.currentState$.pipe(rt((t=>t.state.imagesAhead>0)),ue(),ri((e=>e?G([]):t))).subscribe((t=>{this._panImagesSubject$.next(t)})),this._mode=Ew.Started}stop(){this._mode===Ew.Started&&(this._panImagesSubscription.unsubscribe(),this._panImagesSubject$.next([]),this._mode=Ew.Enabled)}_distance(t,e){const[i,n,r]=Ju(t.lngLat.lng,t.lngLat.lat,t.computedAltitude,e.lngLat.lng,e.lngLat.lat,e.computedAltitude);return Math.sqrt(i*i+n*n+r*r)}_timeDifference(t,e){return Math.abs(t.capturedAt-e.capturedAt)/2592e6}_createTransform(t,e){return new Hd(t.exifOrientation,t.width,t.height,t.scale,t.rotation,e,t.assetsCached?t.image:void 0,void 0,t.cameraParameters,t.cameraType)}_computeProjectedPoints(t){return md(t,[[1,0]],[[0,.5]],20,this._viewportCoords)}_computeHorizontalFov(t){const e=t.map((t=>this._coordToFov(t[0])));return Math.min(...e)}_coordToFov(t){return 2*Math.atan(t)*180/Math.PI}}class Aw{constructor(t){this._data=t}get data(){return this._data}getCoreImages$(t){return this._wrap$(this._data.getCoreImages(t))}getImages$(t){return this._wrap$(this._data.getImages(t))}getImageTiles$(t){return this._wrap$(this._data.getImageTiles(t))}getSequence$(t){return this._wrap$(this._data.getSequence(t))}getSpatialImages$(t){return this._wrap$(this._data.getSpatialImages(t))}setAccessToken(t){this._data.setAccessToken(t)}_wrap$(t){return b.create((e=>{t.then((t=>{e.next(t),e.complete()}),(t=>{e.error(t)}))}))}}class Pw{constructor(t){this._dataAdded$=new T,this._subscriptions=new Uf,this._onDataAdded=t=>{this._graph$.pipe(Ee(),Mt((e=>e.updateCells$(t.cellIds).pipe(pi((()=>{e.resetSpatialEdges()})))))).subscribe((t=>{this._dataAdded$.next(t)}))};const e=this._subscriptions;this._graph$=At(G(t),t.changed$).pipe(Ue(1),E()),e.push(this._graph$.subscribe((()=>{}))),this._graphMode=ym.Spatial,this._graphModeSubject$=new T,this._graphMode$=this._graphModeSubject$.pipe(ni(this._graphMode),Ue(1),E()),e.push(this._graphMode$.subscribe((()=>{}))),this._firstGraphSubjects$=[],this._initializeCacheSubscriptions=[],this._sequenceSubscriptions=[],this._spatialSubscriptions=[],t.api.data.on("datacreate",this._onDataAdded)}get dataAdded$(){return this._dataAdded$}get filter$(){return this._graph$.pipe(Ee(),Mt((t=>t.filter$)))}get graphMode$(){return this._graphMode$}cacheBoundingBox$(t,e){return this._graph$.pipe(Ee(),Mt((i=>i.cacheBoundingBox$(t,e))))}cacheCell$(t){return this._graph$.pipe(Ee(),Mt((e=>e.cacheCell$(t))))}cacheImage$(t){const e=new T;this._firstGraphSubjects$.push(e);const i=e.pipe(Ue(1),E()),n=i.pipe(rt((e=>e.getNode(t))),Mt((t=>t.assetsCached?G(t):t.cacheAssets$())),Ue(1),E());let r;n.subscribe(void 0,(e=>{console.error(`Failed to cache image (${t}).`,e)})),r=this._graph$.pipe(Ee(),Mt((e=>e.isCachingFull(t)||!e.hasNode(t)?e.cacheFull$(t):e.isCachingFill(t)||!e.getNode(t).complete?e.cacheFill$(t):G(e))),pi((e=>{if(!e.hasNode(t))throw new _d(`Failed to cache image (${t})`);e.hasInitializedCache(t)||e.initializeCache(t)})),Me((()=>{null!=r&&(this._removeFromArray(r,this._initializeCacheSubscriptions),this._removeFromArray(e,this._firstGraphSubjects$))}))).subscribe((t=>{e.next(t),e.complete()}),(t=>{e.error(t)})),r.closed||this._initializeCacheSubscriptions.push(r);const s=i.pipe(te((()=>B())),Mt((e=>e.isCachingNodeSequence(t)||!e.hasNodeSequence(t)?e.cacheNodeSequence$(t):G(e))),Ue(1),E());let o;if(o=s.pipe(pi((e=>{e.getNode(t).sequenceEdges.cached||e.cacheSequenceEdges(t)})),Me((()=>{null!=o&&this._removeFromArray(o,this._sequenceSubscriptions)}))).subscribe((()=>{}),(e=>{console.error(`Failed to cache sequence edges (${t}).`,e)})),o.closed||this._sequenceSubscriptions.push(o),this._graphMode===ym.Spatial){let e;e=i.pipe(te((()=>B())),xe((e=>e.hasTiles(t)?B():bt(e.cacheTiles$(t)).pipe(Mt((e=>e.pipe(Mt((e=>e.isCachingTiles(t)?B():G(e))),te((e=>(console.error(`Failed to cache tile data (${t}).`,e),B()))))))))),Ie(1),Mt((e=>e.hasSpatialArea(t)?G(e):bt(e.cacheSpatialArea$(t)).pipe(Mt((e=>e.pipe(te((e=>(console.error(`Failed to cache spatial images (${t}).`,e),B()))))))))),Ie(1),Mt((e=>e.hasNodeSequence(t)?G(e):e.cacheNodeSequence$(t))),pi((e=>{e.getNode(t).spatialEdges.cached||e.cacheSpatialEdges(t)})),Me((()=>{null!=e&&this._removeFromArray(e,this._spatialSubscriptions)}))).subscribe((()=>{}),(e=>{const i=`Failed to cache spatial edges (${t}).`;console.error(i,e)})),e.closed||this._spatialSubscriptions.push(e)}return n.pipe(Ee((t=>t.assetsCached)))}cacheSequence$(t){return this._graph$.pipe(Ee(),Mt((e=>e.isCachingSequence(t)||!e.hasSequence(t)?e.cacheSequence$(t):G(e))),rt((e=>e.getSequence(t))))}cacheSequenceImages$(t,e){return this._graph$.pipe(Ee(),Mt((e=>e.isCachingSequence(t)||!e.hasSequence(t)?e.cacheSequence$(t):G(e))),Mt((i=>i.isCachingSequenceNodes(t)||!i.hasSequenceNodes(t)?i.cacheSequenceNodes$(t,e):G(i))),rt((e=>e.getSequence(t))))}dispose(){this._graph$.pipe(Ee()).subscribe((t=>{t.unsubscribe()})),this._subscriptions.unsubscribe()}setFilter$(t){return this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(Ee(),pi((e=>{e.resetSpatialEdges(),e.setFilter(t)})),rt((()=>{})))}setGraphMode(t){this._graphMode!==t&&(t===ym.Sequence&&this._resetSubscriptions(this._spatialSubscriptions),this._graphMode=t,this._graphModeSubject$.next(this._graphMode))}reset$(t){return this._abortSubjects(this._firstGraphSubjects$),this._resetSubscriptions(this._initializeCacheSubscriptions),this._resetSubscriptions(this._sequenceSubscriptions),this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(Ee(),pi((e=>{e.reset(t)})),rt((()=>{})))}uncache$(t,e,i){return this._graph$.pipe(Ee(),pi((n=>{n.uncache(t,e,i)})),rt((()=>{})))}_abortSubjects(t){for(const e of t.slice())this._removeFromArray(e,t),e.error(new Error("Cache image request was aborted."))}_removeFromArray(t,e){const i=e.indexOf(t);-1!==i&&e.splice(i,1)}_resetSubscriptions(t){for(const e of t.slice())this._removeFromArray(e,t),e.closed||e.unsubscribe()}}class Rw{constructor(t){t.requestAnimationFrame?(this._cancelAnimationFrame=t.cancelAnimationFrame.bind(t),this._requestAnimationFrame=t.requestAnimationFrame.bind(t)):t.mozRequestAnimationFrame?(this._cancelAnimationFrame=t.mozCancelAnimationFrame.bind(t),this._requestAnimationFrame=t.mozRequestAnimationFrame.bind(t)):t.webkitRequestAnimationFrame?(this._cancelAnimationFrame=t.webkitCancelAnimationFrame.bind(t),this._requestAnimationFrame=t.webkitRequestAnimationFrame.bind(t)):t.msRequestAnimationFrame?(this._cancelAnimationFrame=t.msCancelAnimationFrame.bind(t),this._requestAnimationFrame=t.msRequestAnimationFrame.bind(t)):t.oRequestAnimationFrame?(this._cancelAnimationFrame=t.oCancelAnimationFrame.bind(t),this._requestAnimationFrame=t.oRequestAnimationFrame.bind(t)):(this._cancelAnimationFrame=t.clearTimeout.bind(t),this._requestAnimationFrame=e=>t.setTimeout(e,1e3/60))}get cancelAnimationFrame(){return this._cancelAnimationFrame}get requestAnimationFrame(){return this._requestAnimationFrame}}class Lw extends Ud{constructor(t){super(t)}setViewMatrix(t){const e=(new Hn).fromArray(t).invert().elements,i=new fn(e[12],e[13],e[14]),n=new fn(-e[8],-e[9],-e[10]),r=new fn(e[4],e[5],e[6]),s=this._camera;s.position.copy(i),s.lookat.copy(i.clone().add(n)),s.up.copy(r);const o=.5/Math.tan(Math.PI/3);s.focal=o}}class Ow extends Ud{constructor(t){super(t);const e=this._camera.position.clone(),i=this._camera.lookat.clone().sub(e).normalize(),n=Math.sqrt(i.x*i.x+i.y*i.y),r=Math.atan2(i.z,n),s=new fn;if(r>-Math.PI/45)s.copy(e),e.add(new fn(i.x,i.y,0).multiplyScalar(-50)),e.z=30;else{const t=e.clone(),n=new fn(0,0,1),r=new fn(0,0,-2),o=(new fn).subVectors(r,t).dot(n)/i.dot(n),a=1e4,c=t.clone().add(i.clone().multiplyScalar(Math.min(a,o)));s.copy(c);const h=e.clone().sub(c).normalize();e.copy(c.add(h.multiplyScalar(Math.max(50,h.length()))))}this._camera.position.copy(e),this._camera.lookat.copy(s),this._camera.up.set(0,0,1)}dolly(t){const e=this._camera,i=e.position.clone().sub(e.lookat),n=i.length()*Math.pow(2,-t),r=Math.max(1,Math.min(n,4e3));i.normalize(),i.multiplyScalar(r),e.position.copy(e.lookat).add(i)}orbit(t){const e=this._camera,i=(new pn).setFromUnitVectors(e.up,new fn(0,0,1)),n=i.clone().invert(),r=e.position.clone().sub(e.lookat);r.applyQuaternion(i);const s=r.length();let o=Math.atan2(r.y,r.x);o+=t.phi;let a=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);a+=t.theta;const c=Math.PI/36;a=Math.max(c,Math.min(Math.PI/2-c,a)),r.x=Math.sin(a)*Math.cos(o),r.y=Math.sin(a)*Math.sin(o),r.z=Math.cos(a),r.applyQuaternion(n),e.position.copy(e.lookat).add(r.multiplyScalar(s))}truck(t){const e=this._camera;e.position.add((new fn).fromArray(t)),e.lookat.add((new fn).fromArray(t))}update(){}}class Nw extends Gd{constructor(t){super(t),this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(t){super.prepend(t),this._motionless=this._motionlessTransition()}set(t){super.set(t),this._motionless=this._motionlessTransition()}move(t){this._alpha=Math.max(0,Math.min(1,this._alpha+t))}moveTo(t){this._alpha=Math.max(0,Math.min(1,t))}update(t){this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._rotationDelta,this._previousCamera),this._applyRotation(this._rotationDelta,this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation);let e=this._animationSpeed*(60/t);this._updateZoom(e),this._updateLookat(e),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.round(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null!=this._previousImage){if(dd(this._currentImage.cameraType)){let t=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(t.clone().add(this._currentCamera.position))}if(dd(this._previousImage.cameraType)){let t=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(t.clone().add(this._previousCamera.position))}}}}class Dw extends Ud{constructor(t){super(t),this._zoom=0,this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(t){super.prepend(t),this._motionless=this._motionlessTransition()}set(t){super.set(t),this._motionless=this._motionlessTransition()}move(t){this._alpha=Math.max(0,Math.min(1,this._alpha+t))}moveTo(t){this._alpha=Math.max(0,Math.min(1,t))}update(t){this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.round(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null!=this._previousImage){if(dd(this._currentImage.cameraType)){let t=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(t.clone().add(this._currentCamera.position))}if(dd(this._previousImage.cameraType)){let t=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(t.clone().add(this._previousCamera.position))}}}}class $w{constructor(){const t=vm[vm.Custom],e=vm[vm.Earth],i=vm[vm.Traversing],n=vm[vm.Waiting],r=vm[vm.WaitingInteractively];this._creators=new Map;const s=this._creators;s.set(t,Lw),s.set(e,Ow),s.set(i,qd),s.set(n,Dw),s.set(r,Nw),this._transitions=new Map;const o=this._transitions;o.set(t,[e,i]),o.set(e,[t,i]),o.set(i,[t,e,n,r]),o.set(n,[i,r]),o.set(r,[i,n])}getState(t){if(t instanceof Lw)return vm.Custom;if(t instanceof Ow)return vm.Earth;if(t instanceof qd)return vm.Traversing;if(t instanceof Dw)return vm.Waiting;if(t instanceof Nw)return vm.WaitingInteractively;throw new Error("Invalid state instance")}generate(t,e){return new(this._creators.get(vm[t]))(e)}transition(t,e){if(!this.validate(t,e))throw new Error("Invalid transition");return this.generate(e,t)}validate(t,e){const i=vm[this.getState(t)],n=vm[e],r=this._transitions;return r.has(i)&&r.get(i).includes(n)}}class kw{constructor(e,i){this._transitions=new $w,this._state=this._transitions.generate(e,{alpha:1,camera:new jd,currentIndex:-1,reference:{alt:0,lat:0,lng:0},trajectory:[],transitionMode:null==i?t.TransitionMode.Default:i,zoom:0})}get state(){return this._transitions.getState(this._state)}get reference(){return this._state.reference}get alpha(){return this._state.alpha}get camera(){return this._state.camera}get zoom(){return this._state.zoom}get currentImage(){return this._state.currentImage}get previousImage(){return this._state.previousImage}get currentCamera(){return this._state.currentCamera}get currentTransform(){return this._state.currentTransform}get previousTransform(){return this._state.previousTransform}get trajectory(){return this._state.trajectory}get currentIndex(){return this._state.currentIndex}get lastImage(){return this._state.trajectory[this._state.trajectory.length-1]}get imagesAhead(){return this._state.trajectory.length-1-this._state.currentIndex}get motionless(){return this._state.motionless}custom(){this._transition(vm.Custom)}earth(){this._transition(vm.Earth)}traverse(){this._transition(vm.Traversing)}wait(){this._transition(vm.Waiting)}waitInteractively(){this._transition(vm.WaitingInteractively)}getCenter(){return this._state.getCenter()}setCenter(t){this._state.setCenter(t)}setZoom(t){this._state.setZoom(t)}update(t){this._state.update(t)}append(t){this._state.append(t)}prepend(t){this._state.prepend(t)}remove(t){this._state.remove(t)}clear(){this._state.clear()}clearPrior(){this._state.clearPrior()}cut(){this._state.cut()}set(t){this._state.set(t)}setViewMatrix(t){this._state.setViewMatrix(t)}rotate(t){this._state.rotate(t)}rotateUnbounded(t){this._state.rotateUnbounded(t)}rotateWithoutInertia(t){this._state.rotateWithoutInertia(t)}rotateBasic(t){this._state.rotateBasic(t)}rotateBasicUnbounded(t){this._state.rotateBasicUnbounded(t)}rotateBasicWithoutInertia(t){this._state.rotateBasicWithoutInertia(t)}rotateToBasic(t){this._state.rotateToBasic(t)}move(t){this._state.move(t)}moveTo(t){this._state.moveTo(t)}zoomIn(t,e){this._state.zoomIn(t,e)}setSpeed(t){this._state.setSpeed(t)}setTransitionMode(t){this._state.setTransitionMode(t)}dolly(t){this._state.dolly(t)}orbit(t){this._state.orbit(t)}truck(t){this._state.truck(t)}_transition(t){if(!this._transitions.validate(this._state,t)){const e=this._transitions.getState(this._state);return void console.warn(`Transition not valid (${vm[e]} - ${vm[t]})`)}const e=this._transitions.transition(this._state,t);this._state=e}}class zw{constructor(t,e){this._appendImage$=new T,this._subscriptions=new Uf;const i=this._subscriptions;this._start$=new T,this._frame$=new T,this._fpsSampleRate=30,this._contextOperation$=new O((t=>t)),this._context$=this._contextOperation$.pipe(Le(((t,e)=>e(t)),new kw(t,e)),Ue(1),E()),this._state$=this._context$.pipe(rt((t=>t.state)),ue(),Ue(1),E()),this._fps$=this._start$.pipe(ri((()=>this._frame$.pipe(Xt(1,this._fpsSampleRate),rt((()=>(new Date).getTime())),ze(),rt((t=>Math.max(20,1e3*this._fpsSampleRate/(t[1]-t[0])))),ni(60)))),Ze()),this._currentState$=this._frame$.pipe(bi(this._fps$,this._context$,((t,e,i)=>[t,e,i])),Nt((t=>null!=t[2].currentImage)),pi((t=>{t[2].update(t[1])})),rt((t=>({fps:t[1],id:t[0],state:t[2]}))),Ze()),this._lastState$=this._currentState$.pipe(Ue(1),E());let n=this._currentState$.pipe(ue(void 0,(t=>t.state.currentImage.id)),Ue(1),E()),r=new T;i.push(n.subscribe(r)),this._currentId$=new O(null),i.push(r.pipe(rt((t=>t.state.currentImage.id))).subscribe(this._currentId$)),this._currentImage$=r.pipe(rt((t=>t.state.currentImage)),Ue(1),E()),this._currentCamera$=r.pipe(rt((t=>t.state.currentCamera)),Ue(1),E()),this._currentTransform$=r.pipe(rt((t=>t.state.currentTransform)),Ue(1),E()),this._reference$=r.pipe(rt((t=>t.state.reference)),ue(((t,e)=>t.lat===e.lat&&t.lng===e.lng),(t=>({lat:t.lat,lng:t.lng}))),Ue(1),E()),this._currentImageExternal$=n.pipe(rt((t=>t.state.currentImage)),Ue(1),E()),i.push(this._appendImage$.pipe(rt((t=>e=>(e.append([t]),e)))).subscribe(this._contextOperation$)),this._inMotionOperation$=new T,i.push(n.pipe(rt((()=>!0))).subscribe(this._inMotionOperation$)),i.push(this._inMotionOperation$.pipe(ue(),Nt((t=>t)),ri((()=>this._currentState$.pipe(Nt((t=>0===t.state.imagesAhead)),rt((t=>[t.state.camera.clone(),t.state.zoom])),ze(),rt((t=>{let e=t[0][0],i=t[1][0],n=t[0][1],r=t[1][1];return e.diff(i)>1e-5||Math.abs(n-r)>1e-5})),Ee((t=>!t)))))).subscribe(this._inMotionOperation$)),this._inMotion$=this._inMotionOperation$.pipe(ue(),Ue(1),E()),this._inTranslationOperation$=new T,i.push(n.pipe(rt((()=>!0))).subscribe(this._inTranslationOperation$)),i.push(this._inTranslationOperation$.pipe(ue(),Nt((t=>t)),ri((()=>this._currentState$.pipe(Nt((t=>0===t.state.imagesAhead)),rt((t=>t.state.camera.position.clone())),ze(),rt((t=>0!==t[0].distanceToSquared(t[1]))),Ee((t=>!t)))))).subscribe(this._inTranslationOperation$)),this._inTranslation$=this._inTranslationOperation$.pipe(ue(),Ue(1),E()),i.push(this._state$.subscribe((()=>{}))),i.push(this._currentImage$.subscribe((()=>{}))),i.push(this._currentCamera$.subscribe((()=>{}))),i.push(this._currentTransform$.subscribe((()=>{}))),i.push(this._reference$.subscribe((()=>{}))),i.push(this._currentImageExternal$.subscribe((()=>{}))),i.push(this._lastState$.subscribe((()=>{}))),i.push(this._inMotion$.subscribe((()=>{}))),i.push(this._inTranslation$.subscribe((()=>{}))),this._frameId=null,this._frameGenerator=new Rw(window)}get currentState$(){return this._currentState$}get currentImage$(){return this._currentImage$}get currentId$(){return this._currentId$}get currentImageExternal$(){return this._currentImageExternal$}get currentCamera$(){return this._currentCamera$}get currentTransform$(){return this._currentTransform$}get state$(){return this._state$}get reference$(){return this._reference$}get inMotion$(){return this._inMotion$}get inTranslation$(){return this._inTranslation$}get appendImage$(){return this._appendImage$}dispose(){this.stop(),this._subscriptions.unsubscribe()}custom(){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.custom()}))}earth(){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.earth()}))}traverse(){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.traverse()}))}wait(){this._invokeContextOperation((t=>{t.wait()}))}waitInteractively(){this._invokeContextOperation((t=>{t.waitInteractively()}))}appendImagess(t){this._invokeContextOperation((e=>{e.append(t)}))}prependImages(t){this._invokeContextOperation((e=>{e.prepend(t)}))}removeImages(t){this._invokeContextOperation((e=>{e.remove(t)}))}clearImages(){this._invokeContextOperation((t=>{t.clear()}))}clearPriorImages(){this._invokeContextOperation((t=>{t.clearPrior()}))}cutImages(){this._invokeContextOperation((t=>{t.cut()}))}setImages(t){this._invokeContextOperation((e=>{e.set(t)}))}setViewMatrix(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.setViewMatrix(t)}))}rotate(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotate(t)}))}rotateUnbounded(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateUnbounded(t)}))}rotateWithoutInertia(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateWithoutInertia(t)}))}rotateBasic(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateBasic(t)}))}rotateBasicUnbounded(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateBasicUnbounded(t)}))}rotateBasicWithoutInertia(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateBasicWithoutInertia(t)}))}rotateToBasic(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.rotateToBasic(t)}))}move(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.move(t)}))}moveTo(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.moveTo(t)}))}dolly(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.dolly(t)}))}orbit(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.orbit(t)}))}truck(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.truck(t)}))}zoomIn(t,e){this._inMotionOperation$.next(!0),this._invokeContextOperation((i=>{i.zoomIn(t,e)}))}getCenter(){return this._lastState$.pipe(Ee(),rt((t=>t.state.getCenter())))}getZoom(){return this._lastState$.pipe(Ee(),rt((t=>t.state.zoom)))}setCenter(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.setCenter(t)}))}setSpeed(t){this._invokeContextOperation((e=>{e.setSpeed(t)}))}setTransitionMode(t){this._invokeContextOperation((e=>{e.setTransitionMode(t)}))}setZoom(t){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.setZoom(t)}))}start(){null==this._frameId&&(this._start$.next(null),this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId))}stop(){null!=this._frameId&&(this._frameGenerator.cancelAnimationFrame(this._frameId),this._frameId=null)}_invokeContextOperation(t){this._contextOperation$.next((e=>(t(e),e)))}_frame(){this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId)}}function Fw(e){switch(e){case t.CameraControls.Custom:return vm.Custom;case t.CameraControls.Earth:return vm.Earth;case t.CameraControls.Street:return vm.Traversing;default:return null}}class Bw{constructor(e,i,n,r,s,o,a,c){var h;if(i)this._api=i;else if(e.dataProvider){if(!(e.dataProvider instanceof Qx))throw new Error("Incorrect type: 'dataProvider' must extend the DataProviderBase class.");this._api=new Aw(e.dataProvider)}else this._api=new Aw(new sw({accessToken:e.accessToken}));this._graphService=null!=n?n:new Pw(new vd(this.api)),this._loadingName="navigator",this._loadingService=null!=r?r:new Cw;const l=null!==(h=e.cameraControls)&&void 0!==h?h:t.CameraControls.Street;this._stateService=null!=s?s:new zw(Fw(l),e.transitionMode),this._cacheService=null!=o?o:new Tw(this._graphService,this._stateService,this._api),this._playService=null!=a?a:new eg(this._graphService,this._stateService),this._panService=null!=c?c:new Iw(this._graphService,this._stateService,e.combinedPanning),this._idRequested$=new O(null),this._movedToId$=new O(null),this._request$=null,this._requestSubscription=null,this._imageRequestSubscription=null}get api(){return this._api}get cacheService(){return this._cacheService}get graphService(){return this._graphService}get loadingService(){return this._loadingService}get movedToId$(){return this._movedToId$}get panService(){return this._panService}get playService(){return this._playService}get stateService(){return this._stateService}dispose(){this._abortRequest("viewer removed"),this._cacheService.stop(),this._graphService.dispose(),this._panService.dispose(),this._playService.dispose(),this._stateService.dispose()}moveTo$(t){this._abortRequest(`to id ${t}`),this._loadingService.startLoading(this._loadingName);const e=this._moveTo$(t);return this._makeRequest$(e)}moveDir$(e){this._abortRequest(`in dir ${t.NavigationDirection[e]}`),this._loadingService.startLoading(this._loadingName);const i=this.stateService.currentImage$.pipe(Ee(),Mt((i=>([t.NavigationDirection.Next,t.NavigationDirection.Prev].indexOf(e)>-1?i.sequenceEdges$:i.spatialEdges$).pipe(Ee(),rt((t=>{for(let i of t.edges)if(i.data.direction===e)return i.target;return null}))))),Mt((t=>null==t?(this._loadingService.stopLoading(this._loadingName),q(new Error(`Direction (${e}) does not exist for current image.`))):this._moveTo$(t))));return this._makeRequest$(i)}setFilter$(t){return this._stateService.clearImages(),this._movedToId$.pipe(Ee(),Mt((e=>null!=e?this._trajectoryIds$().pipe(Mt((e=>this._graphService.setFilter$(t).pipe(Mt((()=>this._cacheIds$(e)))))),Re()):this._idRequested$.pipe(Ee(),Mt((e=>null!=e?this._graphService.setFilter$(t).pipe(Mt((()=>this._graphService.cacheImage$(e)))):this._graphService.setFilter$(t).pipe(rt((()=>{})))))))),rt((()=>{})))}setAccessToken$(t){return this._abortRequest("to set user token"),this._stateService.clearImages(),this._movedToId$.pipe(Ee(),pi((()=>{this._api.setAccessToken(t)})),Mt((t=>null==t?this._graphService.reset$([]):this._trajectoryIds$().pipe(Mt((t=>this._graphService.reset$(t).pipe(Mt((()=>this._cacheIds$(t)))))),Re(),rt((()=>{}))))))}_cacheIds$(t){return bt(t.map((t=>this._graphService.cacheImage$(t)))).pipe(Et())}_abortRequest(t){null!=this._requestSubscription&&(this._requestSubscription.unsubscribe(),this._requestSubscription=null),null!=this._imageRequestSubscription&&(this._imageRequestSubscription.unsubscribe(),this._imageRequestSubscription=null),null!=this._request$&&(this._request$.isStopped||this._request$.hasError||this._request$.error(new Zf(`Request aborted by a subsequent request ${t}.`)),this._request$=null)}_makeRequest$(t){const e=new J(1);return this._requestSubscription=e.subscribe(void 0,(()=>{})),this._request$=e,this._imageRequestSubscription=t.subscribe((t=>{this._request$=null,e.next(t),e.complete()}),(t=>{this._request$=null,e.error(t)})),e}_moveTo$(t){return this._idRequested$.next(t),this._graphService.cacheImage$(t).pipe(pi((t=>{this._stateService.setImages([t]),this._movedToId$.next(t.id)})),Me((()=>{this._loadingService.stopLoading(this._loadingName)})))}_trajectoryIds$(){return this._stateService.currentState$.pipe(Ee(),rt((t=>t.state.trajectory.map((t=>t.id)))))}}class jw{constructor(t,e){this._spatial=null!=e?e:new ld,this._viewportCoords=null!=t?t:new Wf}basicToCanvas(t,e,i,n){return this._viewportCoords.basicToCanvasSafe(t[0],t[1],e,n,i.perspective)}canvasToBasic(t,e,i,n){let r=this._viewportCoords.canvasToBasic(t[0],t[1],e,n,i.perspective);return(r[0]<0||r[0]>1||r[1]<0||r[1]>1)&&(r=null),r}eventToUnprojection(t,e,i,n,r){const s=this._viewportCoords.canvasPosition(t,e);return this.canvasToUnprojection(s,e,i,n,r)}canvasToUnprojection(t,e,i,n,r){const s=t[0],o=t[1],[a,c]=this._viewportCoords.canvasToViewport(s,o,e),h=new fn(a,c,1).unproject(i.perspective);let l=r.projectBasic(h.toArray());(l[0]<0||l[0]>1||l[1]<0||l[1]>1)&&(l=null);const u=h.clone().sub(i.camera.position).normalize(),d=-2/u.z;let p=null;if(d>0&&d<100&&l){const t=u.clone().multiplyScalar(d).add(i.camera.position),[e,r]=Ku(t.x,t.y,t.z,n.lng,n.lat,n.alt);p={lat:r,lng:e}}return{basicPoint:l,lngLat:p,pixelPoint:[s,o]}}cameraToLngLat(t,e){const i=t.camera.position,[n,r]=Ku(i.x,i.y,i.z,e.lng,e.lat,e.alt);return{lat:r,lng:n}}lngLatToCanvas(t,e,i,n){const r=Ju(t.lng,t.lat,0,n.lng,n.lat,n.alt);return this._viewportCoords.projectToCanvasSafe(r,e,i.perspective)}distanceBetweenLngLats(t,e){return this._spatial.distanceFromLngLat(t.lng,t.lat,e.lng,e.lat)}}class Hw{constructor(t,e,i){this._subscriptions=new Uf,this._emitSubscriptions=new Uf,this._container=i,this._viewer=t,this._navigator=e,this._projection=new jw,this._started=!1,this._navigable$=new T;const n=this._subscriptions;n.push(this._navigable$.subscribe((t=>{const e="navigable",i={navigable:t,target:this._viewer,type:e};this._viewer.fire(e,i)}))),n.push(this._navigator.loadingService.loading$.subscribe((t=>{const e="dataloading",i={loading:t,target:this._viewer,type:e};this._viewer.fire(e,i)}))),n.push(this._container.glRenderer.opaqueRender$.pipe(Ee()).subscribe((()=>{const t="load",e={target:this._viewer,type:t};this._viewer.fire(t,e)})))}get started(){return this._started}get navigable$(){return this._navigable$}get projection(){return this._projection}dispose(){this.stopEmit(),this._subscriptions.unsubscribe()}project$(t){return gt(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.reference$).pipe(Ee(),rt((([e,i,n])=>{if(this._projection.distanceBetweenLngLats(t,i.lngLat)>1e3)return null;const r=this._projection.lngLatToCanvas(t,this._container.container,e,n);return r?[Math.round(r[0]),Math.round(r[1])]:null})))}projectBasic$(t){return gt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(Ee(),rt((([e,i])=>{const n=this._projection.basicToCanvas(t,this._container.container,e,i);return n?[Math.round(n[0]),Math.round(n[1])]:null})))}startEmit(){if(this._started)return;this._started=!0;const t=this._emitSubscriptions;t.push(this._navigator.stateService.currentImageExternal$.subscribe((t=>{const e="image",i={image:t,target:this._viewer,type:e};this._viewer.fire(e,i)}))),t.push(this._navigator.stateService.currentImageExternal$.pipe(ri((t=>t.sequenceEdges$))).subscribe((t=>{const e="sequenceedges",i={status:t,target:this._viewer,type:e};this._viewer.fire(e,i)}))),t.push(this._navigator.stateService.currentImageExternal$.pipe(ri((t=>t.spatialEdges$))).subscribe((t=>{const e="spatialedges",i={status:t,target:this._viewer,type:e};this._viewer.fire(e,i)}))),t.push(gt(this._navigator.stateService.inMotion$,this._container.mouseService.active$,this._container.touchService.active$).pipe(rt((t=>t[0]||t[1]||t[2])),ue()).subscribe((t=>{const e=t?"movestart":"moveend",i={target:this._viewer,type:e};this._viewer.fire(e,i)}))),t.push(this._container.renderService.bearing$.pipe(Wt(100),ue(((t,e)=>Math.abs(e-t)<1))).subscribe((t=>{const e="bearing",i={bearing:t,target:this._viewer,type:e};this._viewer.fire(e,i)})));const e=this._container.mouseService.active$.pipe(ri((t=>t?B():this._container.mouseService.mouseMove$)));t.push(Ot(this._mapMouseEvent$("click",this._container.mouseService.staticClick$),this._mapMouseEvent$("contextmenu",this._container.mouseService.contextMenu$),this._mapMouseEvent$("dblclick",this._container.mouseService.dblClick$),this._mapMouseEvent$("mousedown",this._container.mouseService.mouseDown$),this._mapMouseEvent$("mousemove",e),this._mapMouseEvent$("mouseout",this._container.mouseService.mouseOut$),this._mapMouseEvent$("mouseover",this._container.mouseService.mouseOver$),this._mapMouseEvent$("mouseup",this._container.mouseService.mouseUp$)).pipe(bi(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$,this._navigator.stateService.state$),rt((([[t,e],i,n,r,s])=>{const o=this._projection.eventToUnprojection(e,this._container.container,i,n,r);return{basicPoint:s===vm.Traversing?o.basicPoint:null,lngLat:o.lngLat,originalEvent:e,pixelPoint:o.pixelPoint,target:this._viewer,type:t}}))).subscribe((t=>{this._viewer.fire(t.type,t)}))),t.push(this._container.renderService.renderCamera$.pipe(ue((([t,e],[i,n])=>this._closeTo(t,i,.01)&&this._closeTo(e,n,.01)),(t=>t.camera.position.toArray()))).subscribe((()=>{const t="position",e={target:this._viewer,type:t};this._viewer.fire(t,e)}))),t.push(this._container.renderService.renderCamera$.pipe(ue((([t,e],[i,n])=>this._closeTo(t,i,.001)&&this._closeTo(e,n,.001)),(t=>[t.rotation.phi,t.rotation.theta]))).subscribe((()=>{const t={target:this._viewer,type:"pov"};this._viewer.fire("pov",t)}))),t.push(this._container.renderService.renderCamera$.pipe(ue(((t,e)=>this._closeTo(t,e,.01)),(t=>t.perspective.fov))).subscribe((()=>{const t={target:this._viewer,type:"fov"};this._viewer.fire("fov",t)})))}stopEmit(){this.started&&(this._emitSubscriptions.unsubscribe(),this._started=!1)}unproject$(t){return gt(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).pipe(Ee(),rt((([e,i,n])=>this._projection.canvasToUnprojection(t,this._container.container,e,i,n).lngLat)))}unprojectBasic$(t){return gt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(Ee(),rt((([e,i])=>this._projection.canvasToBasic(t,this._container.container,e,i))))}_closeTo(t,e,i){return Math.abs(t-e)<=i}_mapMouseEvent$(t,e){return e.pipe(rt((e=>[t,e])))}}class Uw{constructor(t,e){this._container=t,this._navigator=e,this._renderers={}}add(t,e){const i=new Uf;this._renderers[t.id]={subs:i,renderer:t},i.push(gt([this._container.glRenderer.webGLRenderer$,this._navigator.stateService.reference$]).pipe(ve(1)).subscribe((([i,n])=>{t.onAdd(e,n,i.getContext())}))),i.push(this._container.glRenderer.opaqueRender$.pipe(bi(this._container.renderService.renderCamera$,this._container.glRenderer.webGLRenderer$)).subscribe((([,e,i])=>{const n=i.getContext(),r=e.perspective.matrixWorldInverse,s=e.perspective.projectionMatrix;t.render(n,r.toArray(),s.toArray())}))),i.push(this._navigator.stateService.reference$.pipe(Je(1)).subscribe((i=>{t.onReference(e,i)})))}dispose(t){for(const e of Object.keys(this._renderers))this.remove(e,t)}has(t){return t in this._renderers}remove(t,e){this._renderers[t].subs.unsubscribe();const i=this._renderers[t].renderer;delete this._renderers[t],this._container.glRenderer.webGLRenderer$.subscribe((t=>{i.onRemove(e,t.getContext())}))}}class Vw{constructor(t,e){this._container=t,this._navigator=e,this._controls=null,this._subscriptions=new Uf}attach(t,e){if(this._controls)throw new cd("Custom camera controls already attached");const i=new T,n=i.pipe(ri((()=>this._navigator.stateService.state$)),rt((t=>t===vm.Custom)),ue()),r=this._subscriptions;r.push(n.pipe(ni(!1),ze(),bi(this._navigator.stateService.reference$,this._container.renderService.renderCamera$)).subscribe((([[i,n],r,s])=>{n?t.onActivate(e,s.perspective.matrixWorldInverse.toArray(),s.perspective.projectionMatrix.toArray(),r):i&&t.onDeactivate(e)}))),r.push(n.pipe(ri((t=>t?this._navigator.stateService.currentState$.pipe(Je(1)):B()))).subscribe((i=>{t.onAnimationFrame(e,i.id)}))),r.push(n.pipe(ri((t=>t?this._navigator.stateService.reference$.pipe(Je(1)):B()))).subscribe((i=>t.onReference(e,i)))),r.push(n.pipe(ri((t=>t?this._container.renderService.size$.pipe(Je(1)):B()))).subscribe((()=>t.onResize(e)))),r.push(gt([this._container.glRenderer.webGLRenderer$,this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.state$]).pipe(Ee()).subscribe((()=>{t.onAttach(e,(e=>{this._controls&&t===this._controls&&this._updateViewMatrix(e)}),(e=>{this._controls&&t===this._controls&&this._updateProjectionMatrix(e)})),i.next(),i.complete()}))),this._controls=t}dispose(t){this.detach(t)}detach(t){this._controls&&(this._subscriptions.unsubscribe(),this._navigator.stateService.state$.subscribe((e=>{e===vm.Custom&&this._controls.onDeactivate(t),this._controls.onDetach(t),this._controls=null})))}_updateProjectionMatrix(t){this._navigator.stateService.state$.pipe(Ee()).subscribe((e=>{if(e===vm.Custom)this._container.renderService.projectionMatrix$.next(t);else{const t="Incorrect camera control mode for projection matrix update";console.warn(t)}}))}_updateViewMatrix(t){this._navigator.stateService.state$.pipe(Ee()).subscribe((e=>{if(e===vm.Custom)this._navigator.stateService.setViewMatrix(t);else{const t="Incorrect camera control mode for view matrix update";console.warn(t)}}))}}vd.register(kd),yd.register(kd),qd.register(Fd),Wd.registerCover(Gf),Wd.register(qf),Wd.register(Xf),Wd.register(Yf),Wd.register(Qf),Wd.register(Mm),Wd.register(Pm),Wd.register(Lm),Wd.register(Wm),Wd.register(Ym),Wd.register(Jm),Wd.register(tg),Wd.register(bg),Wd.register(Sv),Wd.register(Mv),Wd.register(Tv),Wd.register(Cv),t.ArgumentMapillaryError=hd,t.BearingComponent=Xf,t.CacheComponent=Yf,t.CancelMapillaryError=Zf,t.CircleMarker=class extends ow{constructor(t,e,i){super(t,e),i=i||{},this._color=null!=i.color?i.color:16777215,this._opacity=null!=i.opacity?i.opacity:.4,this._radius=null!=i.radius?i.radius:1}_createGeometry(t){const e=new Es(new sh(this._radius,16),new Fr({color:this._color,opacity:this._opacity,transparent:!0}));e.up.fromArray([0,0,1]),e.renderOrder=-1;const i=new pr;i.add(e),i.position.fromArray(t),this._geometry=i}_disposeGeometry(){for(let t of this._geometry.children)t.geometry.dispose(),t.material.dispose()}_getInteractiveObjects(){return[]}},t.Component=Vf,t.DataProviderBase=Qx,t.DirectionComponent=Qf,t.DragPanHandler=Um,t.ExtremePointTag=av,t.Geometry=xg,t.GeometryProviderBase=Kx,t.GeometryTagError=wg,t.GraphDataProvider=sw,t.GraphMapillaryError=_d,t.Image=ed,t.KeyPlayHandler=Am,t.KeySequenceNavigationHandler=Cm,t.KeySpatialNavigationHandler=Em,t.KeyZoomHandler=Im,t.KeyboardComponent=Pm,t.MapillaryError=cd,t.Marker=ow,t.MarkerComponent=Lm,t.OutlineTag=hv,t.PointGeometry=pv,t.PointerComponent=Wm,t.PointsGeometry=Sg,t.PolygonGeometry=X_,t.Popup=class{constructor(t,e,i){this._options={},t=t||{},this._options.capturePointer=!1!==t.capturePointer||t.capturePointer,this._options.clean=t.clean,this._options.float=t.float,this._options.offset=t.offset,this._options.opacity=t.opacity,this._options.position=t.position,this._dom=i||new Xm,this._viewportCoords=e||new Wf,this._notifyChanged$=new T}get changed$(){return this._notifyChanged$}remove(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._parentContainer&&delete this._parentContainer}setBasicPoint(t){this._point=t.slice(),this._rect=null,this._notifyChanged$.next(this)}setBasicRect(t){this._rect=t.slice(),this._point=null,this._notifyChanged$.next(this)}setDOMContent(t){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content);const e="mapillary-popup-content"+(!0===this._options.clean?"-clean":"")+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._content=this._dom.createElement("div",e,this._container),this._content.appendChild(t),this._notifyChanged$.next(this)}setHTML(t){const e=this._dom.document.createDocumentFragment(),i=this._dom.createElement("body");let n;for(i.innerHTML=t;n=i.firstChild,n;)e.appendChild(n);this.setDOMContent(e)}setText(t){this.setDOMContent(this._dom.document.createTextNode(t))}setParentContainer(t){this._parentContainer=t}update(e,i,n){if(!this._parentContainer||!this._content)return;if(!this._point&&!this._rect)return;if(!this._container){this._container=this._dom.createElement("div","mapillary-popup",this._parentContainer);if(!0!==this._options.clean&&this._options.float!==t.Alignment.Center){const t="mapillary-popup-tip"+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._tip=this._dom.createElement("div",t,this._container),this._dom.createElement("div","mapillary-popup-tip-inner",this._tip)}this._container.appendChild(this._content),this._parentContainer.appendChild(this._container),null!=this._options.opacity&&(this._container.style.opacity=this._options.opacity.toString())}let r=null,s=this._alignmentToPopupAligment(this._options.position),o=this._alignmentToPopupAligment(this._options.float);const a=this._container.classList;if(null!=this._point)r=this._viewportCoords.basicToCanvasSafe(this._point[0],this._point[1],{offsetHeight:i.height,offsetWidth:i.width},n,e.perspective);else{const t=["center","top","bottom","left","right","top-left","top-right","bottom-left","bottom-right"];let c=null;for(const e of t)if(a.contains(`mapillary-popup-float-${e}`)){c=e;break}[r,s]=this._rectToPixel(this._rect,s,c,e,i,n),o||(o=s)}if(null==r)return void(this._container.style.display="none");if(this._container.style.display="",!o){const t=this._container.offsetWidth,e=this._container.offsetHeight,n=this._pixelToFloats(r,i,t,e);o=0===n.length?"top":n.join("-")}const c=this._normalizeOffset(this._options.offset);r=[r[0]+c[o][0],r[1]+c[o][1]],r=[Math.round(r[0]),Math.round(r[1])];const h={bottom:"translate(-50%,0)","bottom-left":"translate(-100%,0)","bottom-right":"translate(0,0)",center:"translate(-50%,-50%)",left:"translate(-100%,-50%)",right:"translate(0,-50%)",top:"translate(-50%,-100%)","top-left":"translate(-100%,-100%)","top-right":"translate(0,-100%)"};for(const t in h)h.hasOwnProperty(t)&&a.remove(`mapillary-popup-float-${t}`);a.add(`mapillary-popup-float-${o}`),this._container.style.transform=`${h[o]} translate(${r[0]}px,${r[1]}px)`}_rectToPixel(t,e,i,n,r,s){if(!e){const e=this._container.offsetWidth,o=this._container.offsetHeight,a={bottom:[0,o/2],"bottom-left":[-e/2,o/2],"bottom-right":[e/2,o/2],left:[-e/2,0],right:[e/2,0],top:[0,-o/2],"top-left":[-e/2,-o/2],"top-right":[e/2,-o/2]},c=["top","bottom","left","right"];let h=[0,null,null];for(const l of c){const c=this._pointFromRectPosition(t,l),u=this._viewportCoords.basicToCanvasSafe(c[0],c[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective);if(null==u)continue;const d=a[l],p=[u[0]+d[0],u[1]+d[1]],f=null!=i&&i===l?1:.7;if(0===this._pixelToFloats(p,r,e/f,o/(2*f)).length&&u[0]>0&&u[0]<r.width&&u[1]>0&&u[1]<r.height)return[u,l];const m=Math.max(p[0]-e/2,0),g=Math.min(p[0]+e/2,r.width),_=Math.max(p[1]-o/2,0),v=Math.min(p[1]+o/2,r.height),y=f*Math.max(0,g-m)*Math.max(0,v-_);y>h[0]&&(h[0]=y,h[1]=u,h[2]=l)}if(h[0]>0)return[h[1],h[2]]}const o=this._pointFromRectPosition(t,e);return[this._viewportCoords.basicToCanvasSafe(o[0],o[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective),null!=e?e:"top"]}_alignmentToPopupAligment(e){switch(e){case t.Alignment.Bottom:return"bottom";case t.Alignment.BottomLeft:return"bottom-left";case t.Alignment.BottomRight:return"bottom-right";case t.Alignment.Center:return"center";case t.Alignment.Left:return"left";case t.Alignment.Right:return"right";case t.Alignment.Top:return"top";case t.Alignment.TopLeft:return"top-left";case t.Alignment.TopRight:return"top-right";default:return null}}_normalizeOffset(t){if(null==t)return this._normalizeOffset(0);if("number"==typeof t){const e=t,i=(e>=0?1:-1)*Math.round(Math.sqrt(.5*Math.pow(e,2)));return{bottom:[0,e],"bottom-left":[-i,i],"bottom-right":[i,i],center:[0,0],left:[-e,0],right:[e,0],top:[0,-e],"top-left":[-i,-i],"top-right":[i,-i]}}return{bottom:t.bottom||[0,0],"bottom-left":t.bottomLeft||[0,0],"bottom-right":t.bottomRight||[0,0],center:t.center||[0,0],left:t.left||[0,0],right:t.right||[0,0],top:t.top||[0,0],"top-left":t.topLeft||[0,0],"top-right":t.topRight||[0,0]}}_pixelToFloats(t,e,i,n){const r=[];return t[1]<n?r.push("bottom"):t[1]>e.height-n&&r.push("top"),t[0]<i/2?r.push("right"):t[0]>e.width-i/2&&r.push("left"),r}_pointFromRectPosition(t,e){const i=t[0],n=t[0]<t[2]?t[2]:t[2]+1,r=t[1],s=t[3];switch(e){case"bottom":return[(i+n)/2,s];case"bottom-left":return[i,s];case"bottom-right":return[n,s];case"center":return[(i+n)/2,(r+s)/2];case"left":return[i,(r+s)/2];case"right":return[n,(r+s)/2];case"top":return[(i+n)/2,r];case"top-left":return[i,r];case"top-right":return[n,r];default:return[(i+n)/2,s]}}},t.PopupComponent=Ym,t.RectGeometry=q_,t.S2GeometryProvider=iw,t.ScrollZoomHandler=Gm,t.SequenceComponent=Jm,t.SimpleMarker=class extends ow{constructor(t,e,i){super(t,e),i=i||{},this._ballColor=null!=i.ballColor?i.ballColor:16711680,this._ballOpacity=null!=i.ballOpacity?i.ballOpacity:.8,this._circleToRayAngle=2,this._color=null!=i.color?i.color:16711680,this._interactive=!!i.interactive,this._opacity=null!=i.opacity?i.opacity:.4,this._radius=null!=i.radius?i.radius:1}_createGeometry(t){const e=this._radius,i=this._markerHeight(e),n=new Fr({color:this._color,opacity:this._opacity,transparent:!0,depthWrite:!1}),r=new Es(this._createMarkerGeometry(e,8,8),n),s=new Es(new zh(e/2,8,8),new Fr({color:this._ballColor,opacity:this._ballOpacity,transparent:!0}));s.position.z=i,s.renderOrder=1;const o=new pr;o.add(s),o.add(r),o.position.fromArray(t),this._geometry=o}_disposeGeometry(){for(const t of this._geometry.children)t.geometry.dispose(),t.material.dispose()}_getInteractiveObjects(){return this._interactive?[this._geometry.children[0]]:[]}_markerHeight(t){const e=Math.tan(Math.PI-this._circleToRayAngle);return t*Math.sqrt(1+e*e)}_createMarkerGeometry(t,e,i){const n=this._markerHeight(t),r=this._circleToRayAngle,s=[],o=new Float32Array(3*(e+1)*(i+1));let a=0;for(let c=0;c<=i;++c){const h=[];for(let s=0;s<=e;++s){const l=s/e*Math.PI*2,u=c/i*Math.PI;let d=t;if(u>r){const e=Math.tan(u-r);d=t*Math.sqrt(1+e*e)}const p=3*a,f=Math.sin(u);o[p+0]=d*Math.cos(l)*f,o[p+1]=d*Math.sin(l)*f,o[p+2]=d*Math.cos(u)+n,h.push(a++)}s.push(h)}const c=new Uint16Array(6*e*i);let h=0;for(let t=0;t<i;++t)for(let i=0;i<e;++i){const e=s[t][i+1],n=s[t][i],r=s[t+1][i],o=s[t+1][i+1];c[h++]=e,c[h++]=n,c[h++]=o,c[h++]=n,c[h++]=r,c[h++]=o}const l=new hs,u=new Hr(o,3);return l.setAttribute("position",u),l.setIndex(new Hr(c,1)),l}},t.SliderComponent=tg,t.SpatialComponent=bg,t.SpotTag=uv,t.Tag=ov,t.TagComponent=Sv,t.TouchZoomHandler=qm,t.VertexGeometry=G_,t.Viewer=class extends Hf{constructor(t){super(),this._navigator=new Bw(t),this._container=new Mw(t,this._navigator.stateService),this._observer=new Hw(this,this._navigator,this._container),this._componentController=new dw(this._container,this._navigator,this._observer,t.imageId,t.component),this._customRenderer=new Uw(this._container,this._navigator),this._customCameraControls=new Vw(this._container,this._navigator)}get isNavigable(){return this._componentController.navigable}activateCombinedPanning(){this._navigator.panService.enable()}activateComponent(t){this._componentController.activate(t)}activateCover(){this._componentController.activateCover()}addCustomRenderer(t){this._customRenderer.add(t,this)}attachCustomCameraControls(t){this._customCameraControls.attach(t,this)}deactivateCombinedPanning(){this._navigator.panService.disable()}deactivateComponent(t){this._componentController.deactivate(t)}deactivateCover(){this._componentController.deactivateCover()}detachCustomCameraControls(){this._customCameraControls.detach(this)}fire(t,e){super.fire(t,e)}getBearing(){return new Promise(((t,e)=>{this._container.renderService.bearing$.pipe(Ee()).subscribe((e=>{t(e)}),(t=>{e(t)}))}))}getCameraControls(){return new Promise(((e,i)=>{this._navigator.stateService.state$.pipe(Ee()).subscribe((i=>{switch(i){case vm.Custom:e(t.CameraControls.Custom);break;case vm.Earth:e(t.CameraControls.Earth);break;default:e(t.CameraControls.Street)}}),(t=>{i(t)}))}))}getCanvas(){return this._container.canvas}getCanvasContainer(){return this._container.canvasContainer}getCenter(){return new Promise(((t,e)=>{this._navigator.stateService.getCenter().subscribe((e=>{t(e)}),(t=>{e(t)}))}))}getComponent(t){return this._componentController.get(t)}getContainer(){return this._container.container}getFieldOfView(){return new Promise(((t,e)=>{this._container.renderService.renderCamera$.pipe(Ee()).subscribe((e=>{t(e.perspective.fov)}),(t=>{e(t)}))}))}getImage(){return new Promise(((t,e)=>{this._navigator.stateService.currentImage$.pipe(Ee()).subscribe((e=>{t(e)}),(t=>{e(t)}))}))}getPointOfView(){return new Promise(((t,e)=>{gt(this._container.renderService.renderCamera$,this._container.renderService.bearing$).pipe(Ee()).subscribe((([e,i])=>{t({bearing:i,tilt:e.getTilt()})}),(t=>{e(t)}))}))}getPosition(){return new Promise(((t,e)=>{gt(this._container.renderService.renderCamera$,this._navigator.stateService.reference$).pipe(Ee()).subscribe((([e,i])=>{t(this._observer.projection.cameraToLngLat(e,i))}),(t=>{e(t)}))}))}getZoom(){return new Promise(((t,e)=>{this._navigator.stateService.getZoom().subscribe((e=>{t(e)}),(t=>{e(t)}))}))}hasCustomRenderer(t){return this._customRenderer.has(t)}moveDir(t){const e=this.isNavigable?this._navigator.moveDir$(t):q(new Error("Calling moveDir is not supported when viewer is not navigable."));return new Promise(((t,i)=>{e.subscribe((e=>{t(e)}),(t=>{i(t)}))}))}moveTo(t){const e=this.isNavigable?this._navigator.moveTo$(t):q(new Error("Calling moveTo is not supported when viewer is not navigable."));return new Promise(((t,i)=>{e.subscribe((e=>{t(e)}),(t=>{i(t)}))}))}off(t,e){super.off(t,e)}on(t,e){super.on(t,e)}project(t){return new Promise(((e,i)=>{this._observer.project$(t).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}projectFromBasic(t){return new Promise(((e,i)=>{this._observer.projectBasic$(t).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}remove(){this._customRenderer.dispose(this),this._customCameraControls.dispose(this),this._observer.dispose(),this._componentController.remove(),this._navigator.dispose(),this._container.remove();const t="remove",e={target:this,type:t};this.fire(t,e)}removeCustomRenderer(t){this._customRenderer.remove(t,this)}resize(){this._container.renderService.resize$.next()}setCameraControls(t){const e=Fw(t);e===vm.Traversing?this._navigator.stateService.traverse():e===vm.Earth?this._navigator.stateService.earth():e===vm.Custom?this._navigator.stateService.custom():console.warn(`Unsupported camera control transition (${t})`)}setCenter(t){this._navigator.stateService.setCenter(t)}setFieldOfView(t){this._container.renderService.renderCamera$.pipe(Ee()).subscribe((e=>{const i=e.fovToZoom(t);this._navigator.stateService.setZoom(i)}))}setFilter(t){return new Promise(((e,i)=>{this._navigator.setFilter$(t).subscribe((()=>{e(void 0)}),(t=>{i(t)}))}))}setRenderMode(t){this._container.renderService.renderMode$.next(t)}setTransitionMode(t){this._navigator.stateService.setTransitionMode(t)}setAccessToken(t){const e=this.isNavigable?this._navigator.setAccessToken$(t):q(new Error("Calling setAccessToken is not supported when viewer is not navigable."));return new Promise(((t,i)=>{e.subscribe((()=>{t(void 0)}),(t=>{i(t)}))}))}setZoom(t){this._navigator.stateService.setZoom(t)}triggerRerender(){this._container.glRenderer.triggerRerender()}unproject(t){return new Promise(((e,i)=>{this._observer.unproject$(t).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}unprojectToBasic(t){return new Promise(((e,i)=>{this._observer.unprojectBasic$(t).subscribe((t=>{e(t)}),(t=>{i(t)}))}))}},t.ZoomComponent=Mv,t.decompress=Wx,t.enuToGeodetic=Ku,t.fetchArrayBuffer=Xx,t.geodeticToEnu=Ju,t.isFallbackSupported=hw,t.isSupported=function(){return hw()&&cw()},t.readMeshPbf=Zx,Object.defineProperty(t,"__esModule",{value:!0})}));
 //# sourceMappingURL=mapillary.js.map